Result of sysdate-timstamp
Hi,
I am trying to get the date and time stamp difference by : SYSDATE- some time stamp;
using the query:
SELECT SYSDATE-(SELECT TXN_TIMESTAMP FROM (SELECT ROWNUM,TXN_TIMESTAMP FROM ACCOUNT_tXN WHERE TXN_aCCOUNT_NO=acct ORDER BY 2 DESC) WHERE ROWNUM=1) INTO days FROM DUAL;
this query working fine and returning the difference between these two on the Sql prompt, but when I am trying to execute it in Pl-Sql then I had to add
one INTO DAYS into it.
what will be the data type of DAYS.
it is returning out put like: +00000001 5:30:23.00 PM so what should be the data type of days.
I tried
1> timestamp;
2>date
3> number
4>interval days to second
but it didn't worked.
please suggest as what should be the data type of DAYS.
Jitendra
please suggest as what should be the data type of DAYS.
The simplest way to know what datatypes Oracle creates for expressions is to use CTAS and create a table from the query.
CREATE TABLE myTable AS SELECT * FROM myRestOfQuery;
Then examine the DDL for the table that Oracle created to see what datatype is used.
The other issue may run into when you used expressions to create result set columns is that Oracle will use the first row returned to determine the datatype. This means that the actual datatype may not have the PRECISION that is needed for data coming later. For example the first row may have a value that is only 5 characters long but later data may be much longer.
Similar Messages
-
Getting java.lang.NullpointerException while closing resultset aft using it
Hi,
I kindly request to share your ideas reg. my problem.
I am opening a database connection using connection pool and i am using two or more resultsets and statement objects.I am closing these objects at the end of their usage.But i am getting java.lang.NullpointerException when i close them(if i don't close them it works fine). what might be the reason. Had i did any thing wrong in the code.
please view the code
public String storeNewConnection(String CIRCLE,String DIVISION,String SUB_DIVISION,String SECTION,String CONSUMER_NAME,String FATHER_NAME,String STREET_NAME,String DOOR_NO,String TOWN_CITY,String LAND_MARK,String PINCODE,String STDCODE,String PHONE_NO,String EMAIL,String NEIGHBOUR_SCNO,String DOCUMENT_CODE,String LT_APR_NO,String year1,String month1,String day1,String PCBNO,String CONSUMER_STATUS,String SOCIAL_GROUP,String CATEGORY_SUPPLY,String LOCATION_PREMISES,String PURPOSE_OF_SUPPLY,String DURATION,String LOAD_TYPE,String CONNECTED_LOAD,String CONTRACTED_LOAD,String APPLICATION_FEE,String DEVELOPMENT_CHARGES,String SECURITY_DEPOSIT,String ADDL_SECURITY_DESPOSIT,String DEPOSITED_THRU,String DD_CHEQUE_DETAILS,String year2,String month2,String day2,String REMARKS,String POLE_NO)
int count=0;
Statement st=null;
ResultSet rs=null,rs1=null,rs2=null,rs3=null;
PreparedStatement pst=null;
String result="",query="",sysDate="",sysDate2="";
String reg_no = "";
try
st=con.createStatement();
//Check dates with sys date
String date1 =null;
String date2 =null;
if(! (year1.equals("") || month1.equals("") || day1.equals("")) )
date1=day1+"-"+month1+"-"+year1;
rs2=st.executeQuery("select round(to_date('"+date1+"','dd-Mon-yyyy')-to_date(sysdate,'dd-Mon-yy')) from dual");
rs2.next();
if(rs2.getInt(1) != 0)
return "false";
if(! (year2.equals("") || month2.equals("") || day2.equals("")) )
date2=day2+"-"+month2+"-"+year2;
rs3=st.executeQuery("select round(to_date('"+date2+"','dd-Mon-yyyy')-to_date(sysdate,'dd-Mon-yy')) from dual");
rs3.next();
if(rs3.getInt(1) != 0)
return "false";
rs1=st.executeQuery("select to_char(sysdate,'yyyyMONdd'),to_char(sysdate,'dd-Mon-yyyy') from dual");
rs1.next();
sysDate=rs1.getString(1);
sysDate2=rs1.getString(2);
rs=st.executeQuery("select max(SERIAL_NO) from NEW_CONNECTIONS where to_char(sysdate,'yyyy') = to_char(REG_DATE,'yyyy') and to_char(sysdate,'mm') = to_char(REG_DATE,'mm') and SUB_DIVISION_CODE = "+SUB_DIVISION+" and DIVISION_CODE = "+DIVISION+" and CIRCLE_CODE = "+CIRCLE+" ");
if(rs.next())
count = rs.getInt(1);
count++;
else
count=1;
query="insert into NEW_CONNECTIONS ( "+
" REG_NO,SERIAL_NO,REG_DATE,CIRCLE_CODE,DIVISION_CODE,SUB_DIVISION_CODE,SECTION_CODE, "+
" CONSUMER_NAME,FATHER_NAME,STREET_NAME,DOOR_NO,TOWN_CITY,LAND_MARK,PINCODE, "+
" STDCODE,PHONE_NO,EMAIL,NEIGHBOUR_SCNO,DOCUMENT_CODE,LT_APR_NO,LT_APR_DATE, "+
" PCBNO,CONSUMER_STATUS,SOCIAL_GROUP,CATEGORY_SUPPLY,LOCATION_PREMISES,PURPOSE_OF_SUPPLY,"+
" DURATION,LOAD_TYPE,CONNECTED_LOAD,CONTRACTED_LOAD,APPLICATION_FEE,DEVELOPMENT_CHARGES, "+
" SECURITY_DEPOSIT,ADDL_SECURITY_DEPOSIT,DEPOSITED_THRU,DD_CHEQUE_DETAILS,DD_CHEQUE_DATE,REMARKS,APPLICATION_STATUS,POLE_NO) "+
" values(?,?,'"+sysDate2+"',?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
pst = con.prepareStatement(query);
String cnt ="";
if(count <= 9)
cnt="0000";
else if(count <= 99)
cnt="000";
else if(count <= 999)
cnt="00";
else if(count <= 9999)
cnt="0";
cnt+=Integer.toString(count);
reg_no = CIRCLE+DIVISION+SUB_DIVISION+SECTION+"N"+cnt+sysDate;
int serial_no =count;
int pin = 0;
if(!PINCODE.equals(""))
pin =Integer.parseInt(PINCODE);
int std = 0;
if(!STDCODE.equals(""))
std = Integer.parseInt(STDCODE);
int status = Integer.parseInt(CONSUMER_STATUS);
int social_group = Integer.parseInt(SOCIAL_GROUP);
int supply = Integer.parseInt(CATEGORY_SUPPLY);
int location = Integer.parseInt(LOCATION_PREMISES);
int purpose = Integer.parseInt(PURPOSE_OF_SUPPLY);
int duration = Integer.parseInt(DURATION);
int laod_type = Integer.parseInt(LOAD_TYPE);
float conn_load = Float.parseFloat(CONNECTED_LOAD);
int cont_load = 0;
if(!CONTRACTED_LOAD.equals(""))
cont_load =Integer.parseInt(CONTRACTED_LOAD);
int app_fee = Integer.parseInt(APPLICATION_FEE);
int dev_chg = Integer.parseInt(DEVELOPMENT_CHARGES);
int sec_dep = Integer.parseInt(SECURITY_DEPOSIT);
int addl_sec_dep = 0;
if(!ADDL_SECURITY_DESPOSIT.equals(""))
addl_sec_dep =Integer.parseInt(ADDL_SECURITY_DESPOSIT);
int dep_thru = Integer.parseInt(DEPOSITED_THRU);
pst.setString(1,reg_no);
pst.setInt(2,serial_no);
pst.setString(3,CIRCLE);
pst.setString(4,DIVISION);
pst.setString(5,SUB_DIVISION);
pst.setString(6,SECTION);
pst.setString(7,CONSUMER_NAME);
pst.setString(8,FATHER_NAME);
pst.setString(9,STREET_NAME);
pst.setString(10,DOOR_NO);
pst.setString(11,TOWN_CITY);
pst.setString(12,LAND_MARK);
pst.setInt(13,pin);
pst.setInt(14,std);
pst.setString(15,PHONE_NO);
pst.setString(16,EMAIL);
pst.setString(17,NEIGHBOUR_SCNO);
pst.setString(18,DOCUMENT_CODE);
pst.setString(19,LT_APR_NO);
pst.setString(20,date1);
pst.setString(21,PCBNO);
pst.setInt(22,status);
pst.setInt(23,social_group);
pst.setInt(24,supply );
pst.setInt(25,location);
pst.setInt(26,purpose);
pst.setInt(27,duration);
pst.setInt(28,laod_type);
pst.setFloat(29,conn_load );
pst.setInt(30,cont_load);
pst.setInt(31,app_fee);
pst.setInt(32,dev_chg);
pst.setInt(33,sec_dep);
pst.setInt(34,addl_sec_dep);
pst.setInt(35,dep_thru );
pst.setString(36,DD_CHEQUE_DETAILS);
pst.setString(37,date2);
pst.setString(38,REMARKS);
pst.setInt(39,1);
pst.setString(40,POLE_NO);
pst.executeUpdate();
result=reg_no;
rs.close();
rs=null;
rs1.close();
rs1=null;
rs2.close();
rs2=null;
rs3.close();
rs3=null;
st.close();
st=null;
pst.close();
pst=null;
catch(Exception e)
e.printStackTrace();
result="false";
return result;
finally
if (rs != null)
try
rs.close();
catch (SQLException e)
rs = null;
if (rs1 != null)
try
rs1.close();
catch (SQLException e)
rs1 = null;
if (rs2 != null)
try
rs2.close();
catch (SQLException e)
rs2 = null;
if (rs3 != null)
try
rs3.close();
catch (SQLException e)
rs3 = null;
if (st != null)
try
st.close();
catch (SQLException e)
st = null;
if (pst != null)
try
pst.close();
catch (SQLException e)
pst = null;
return result;
Also plz help me to improve the code if necessary so that it will work fine for multiple users
thaks & regards
Prasanth.CThanks a lot.
i replaced the code below
if (rs != null)
try
rs.close();
catch (SQLException e)
rs = null;
if (rs1 != null)
try
rs1.close();
catch (SQLException e)
rs1 = null;
if (rs2 != null)
try
rs2.close();
catch (SQLException e)
rs2 = null;
if (rs3 != null)
try
rs3.close();
catch (SQLException e)
rs3 = null;
if (st != null)
try
st.close();
catch (SQLException e)
st = null;
if (pst != null)
try
pst.close();
catch (SQLException e)
pst = null;
instead of blindly closing the resultsets and statements
now it works fine.
One more thing, is my code structurally correct, i mean the variables, try...catch blocks,results,statements,database connections and overall coding. whether it looks like professional code.
thaks & regards,
Prasanth.C -
How to automatically send report after it is created?
Hello,
I am beginner and I would appreciate if someone could tell me general information.
I found this tutorial how to save and access report.
Storing and Accessing Reports in the Database
In that tutorial report is saved onclick.
Is there a way to automatically email report everytime report is generate or I should first save it (PDF, CSV,..) with SQL script and then email it?
I also found that in Interactive report there is page process that can send e-mails. Is it possible that page process send e-mail with report or report should be also saved before sending?
The reason for this is that we want to have a history of created reports.
Thank you in advance.874887 wrote:
The reason for this is that we want to have a history of created reports.
Save report, then email it.
I usually call COMMIT between the two steps.
Use the APEX_MAIL package to send out an e-mail with an attachment.
You should be able to modify the PL/SQL to do it all in one step
declare
l_report blob;
-- Added this for APEX_MAIL
l_mail_id NUMBER;
begin
l_report := apex_util.get_print_document (
p_application_id => :APP_ID,
p_report_query_name => 'blobquery',
p_report_layout_name => 'blobquery',
p_report_layout_type => 'rtf',
p_document_format => 'pdf'
insert into report_archive (
filename,
mimetype,
report,
created_date,
created_by
) values (
'BLOB Query Search Results ('||to_char(sysdate,'DDMonYYYY')||')',
'application/pdf',
l_report,
sysdate,
:USER
-- COMMIT the insert so you don't e-mail out a report
-- that was never saved
commit;
-- create e-mail here
l_mail_id := APEX_MAIL.send( ... ); -- see document for usage
APEX_MAIL.ADD_ATTACHMENT( .. ); -- see document for usage
end;
MK -
Date object doesn't work in query filters
I'm trying to create a universe object called Next Biweekly Pay End Date. Some background: there is an end date for our biweekly payrolls every 14 days, and the logic behind the object is basically that if there was a biweekly pay end date 7 days ago, the next one is 7 days from today (that is, sysdate + 7), etc.</p>
I have it working so that it displays the correct date when used in a WebI report. However, when I use it in a query filter in a WebI report (like, Pay End Date = Next Biweekly Pay End Date), I don't get an error, but I also don't get any data. Somehow my object doesn't work in a query filter. The purpose of the object is for use in query filters, so I need to get this to work.</p>
My best guess about why it doesn't work in a query filter is due to some issue with the data type. Pay End Date has a data type of date in the universe. I gave Next Biweekly Pay End Date a data type of date also, but the query filter still doesn't work; I get "no data to fetch."</p>
We're using XI 3.1.6 and Oracle 10. Any ideas about how to get this to work?</p>
If it helps, here is the definition of Next Biweekly Pay End Date. The logic is that it takes today's date, subtracts Oct. 31, 2009 (a biweekly pay end date), divides by 14, and looks at the remainder. If the remainder is 0, then today is a pay end date and the next one is 14 days from now. If the remainder is 1, yesterday was a pay end date and the next one is 13 days from now, etc.</p>
case</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 0 then (sysdate + 14)</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 1 then (sysdate + 13)</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 2 then (sysdate + 12)</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 3 then (sysdate + 11)</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 4 then (sysdate + 10)</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 5 then (sysdate + 9)</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 6 then (sysdate + 8)</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 7 then (sysdate + 7)</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 8 then (sysdate + 6)</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 9 then (sysdate + 5)</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 10 then (sysdate + 4)</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 11 then (sysdate + 3)</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 12 then (sysdate + 2)</p>
when mod((trunc(sysdate)) - (to_date('31/10/2009')),14) = 13 then (sysdate + 1)</p>
endThanks for the suggestions.
I did some more testing, and there seems to be something more complicated going on. I ran the following code in SQL*Plus:
SELECT distinct M_PYDW1.PYSTATUS.DW_OWNER,
case
when to_date(sysdate, 'dd/mm/yyyy hh24:mi:ss') >= to_date('01/01/2010','dd/mm/yyyy hh24:mi:ss') then To_Date((sysdate - 2),'dd/mm/yyyy')
else to_date(sysdate +2, 'dd/mm/yyyy')
end
FROM M_PYDW1.PYSTATUS
The condition should be true, because the sysdate (today is Jan. 20) is greater than 1/1/2010, so I should get a result of sysdate - 2 (Jan. 18). But the result I get is Jan. 22 (sysdate +2). It seems that the comparison is failing even though I'm formatting both sysdate and 1/1/2010 as dates with a timestamp. What could cause that?
One more mystery: when I run the same code as above in a WebI report (using custom SQL), I get the error ORA-1830, date format picture ends before converting entire input string. -
Hi,
I have a JSP form that takes the date and inserts it into the db. I'm having a problem with what format the date should be in. My insert string looks like
INSERT INTO users (USERNAME, WHO_CREATED, WHEN_CREATED) VALUES ('bob', 'jeff', (Result.getString("sysdate"))
unfortunatly whatever format I put the date in I can't seem to make both JAVA and ORACLE happy.
I'm new at this so I'm hoping that is something simple.
Thanks,
Chris
nullHi Chris,
Are u using Business components for java i.e. entity/view objects? If yes, then the default date format for entity/ view objects is
"yyyy-mm-dd".
Aparna. -
Problem: SyncServer kicks in every 10 secs
Hi All,
I am on Snow Leopard 10.6.4 Today I have noticed that CPU jumps to ~20% every 10 seconds or so. It appears it is SyncServer. Running Syncrospector confirmed this. Syncrospector shows that the following get synced frequently:
* iCal,
* Address Book,
* Entourage 2008
* Yahoo Address Book
No changes have been made to any of those for the last several hours. This is new behavior and I am pretty sure I haven't seen it before. I don't have MobileMe.
Any ideas why sync kicks in this often and how to fix it are greatly appreciated.
TIA,
SlavaYes this is realy strange before in Oracle 9.2.0.4 I didn't had this problem. But now this strange "." is very big problem. I am from Bulgaria and in our database the dataformat is in cirilic it is looks like : 25-МАЙ-2006 . So in our application is much immportant to have this format without ".".
The strange is that NLS_DATE_FORMAT = "DD-MON-RRRR" as it have to be but when I start this statement:
SQL>select sysdate from dual;
... the result is
SYSDATE
25-МАЙ. -2006
Do you thing that the problem maybe is in the Registry (OS is Windows Server 2003) ? -
Different results whether insert run alone or in begin...end
I have an insert statement below. If I put in .sql file and run with @ in plsql i get 1300 rows evenly distributed to different "unique_id"(first column). If I take this exact same statement and enclose in DECLARE, BEGIN, EXCEPTION, END block with no other code changes, I get 1300 rows but they all have the same "unique_id" of 36. I'm confused. Oracle 8i on windows 2000 and SQLPlus from my desk with XP.
insert
into x_group_list (x_group_list.unique_id,
x_group_list.supervisor_sys_id,
x_group_list.employee_sys_id,
x_group_list.pay_policy_sys_id,
x_group_list.punch_based_entry,
x_group_list.cost_date_format,
x_group_list.pay_period_sys_id,
x_group_list.pay_period_short_name,
x_group_list.pay_period_start_date,
x_group_list.pay_period_end_date,
x_group_list.pay_period_status,
x_group_list.serial_number,
x_group_list.last_name,
x_group_list.first_name,
x_group_list.middle_name,
x_group_list.department_id,
x_group_list.department_sys_id,
x_group_list.workgroup_id,
x_group_list.location_sys_id,
x_group_list.location_offset,
x_group_list.validate_until_current_time,
x_group_list.approval_sys_id,
x_group_list.timecard_error_flag,
x_group_list.lock_timecard,
x_group_list.emp_pay_period_exists,
x_group_list.grp_schedule_include,
x_group_list.grp_gte_include,
x_group_list.being_used_by,
x_group_list.date_modified)
select NVL(superrank, 99999),
mysuper,
employee.employee_sys_id,
employee.pay_policy_sys_id,
pay_policy.punch_based_entry,
0,
mypolicy,
'SHORTNAME',
(mydetailend - 10080),
mydetailend,
'H',
employee.serial_number,
employee.last_name,
employee.first_name,
employee.middle_name,
mydep_id,
mydep,
'Junk',
employee.location_sys_id,
0,
pay_policy.validate_until_current_time,
0,
1,
0,
'Y',
0,
0,
mysuper,
sysdate
from employee, pay_policy,
(select policy_pay_period_detail.system_id mypolicy,
min(policy_pay_period_detail.pay_period_end_date) mydetailend
from policy_pay_period_detail
where policy_pay_period_detail.pay_period_closed = 0
group by policy_pay_period_detail.system_id),
(select mydep, mydep_id, mysuper, superrank
from (select rownum deprank, department_sys_id mydep, department_id mydep_id
from department
where department_sys_id in
(select distinct department_sys_id mydep
from employee
where employee_status = 'A')),
(select rownum superrank, employee_sys_id mysuper
from employee
where employee_status = 'A'
and approve_all_departments = 'Y'
and employee_sys_id > 1)
where mod(deprank, 36)+1 = superrank)
where employee.employee_status = 'A'
and mydep = employee.department_sys_id
and employee.pay_policy_sys_id = pay_policy.pay_policy_sys_id
and pay_policy.pay_period_sys_id = mypolicy;thanks,
Herb
Message was edited by:
HerbLaneWhat I'm reading (since I haven't used SEQUENCE before) says that I can't use it in a subquery. fyi: Oracle 8i The Complete Reference.
My biggest concern is figuring out why it is running differently whether inside BEGIN..END or not. I just want to be sure that I'm not using something incorrectly (or the possibility of a defect which is less likely). We have too many scripts here that could give incorrect results because they are written in a simmilar fashion. -
Problem with store ResultSet and show result in table
Hi, I'm kind of new in ADF, I need to store ResultSet and show result in table-component. I have two problems:
1) I get my ResultSet by calling callStoredProcedure(...) and this returns actually ref_cursor as ResultSet.
When I try to println() contains of this result set in this method - it works OK (commented part),
but when I want to println() somewhere else (eg. in retrieveRefCursor() method) it doesn't work.
The problem is that the scrollability of the ResultSet is lost - it becomes a TYPE_FORWARD_ONLY ResultSet.
Is there any way to store data from ref_cursor for a long time?
2) My second problem is "store any result set and show this data in table". I have tried use method storeNewResultSet() but
without result (table contains only "No rows yet" and everything seems to be OK - no exception, no warning, no error...).
I have tried to call this method with ResultSet from select on dbs (without resultSet as ref_cursor ) - no result with createRowFromResultSet(),
storeNewResultSet(), setUserDataForCollection()...
I've tried a lot of ways to do this, but it doesn't work. I really don't know how to make it so it can work.
Thanks for your help.
ADF BC, JDev 11.1.1.0
This is my code from ViewObjectImpl
package tp.model ;
import com.sun.jmx.mbeanserver.MetaData ;
import java.sql.CallableStatement ;
import java.sql.Connection ;
import java.sql.PreparedStatement ;
import java.sql.ResultSet ;
import java.sql.ResultSetMetaData ;
import java.sql.SQLException ;
import java.sql.Statement ;
import java.sql.Types ;
import oracle.jbo.JboException ;
import oracle.jbo.server.SQLBuilder ;
import oracle.jbo.server.ViewObjectImpl ;
import oracle.jbo.server.ViewRowImpl ;
import oracle.jbo.server.ViewRowSetImpl ;
import oracle.jdbc.OracleCallableStatement ;
import oracle.jdbc.OracleConnection ;
import oracle.jdbc.OracleTypes ;
public class Profiles1ViewImpl extends ViewObjectImpl {
private static final String SQL_STM = "begin Pkg_profile.get_profile_list(?,?,?,?);end;" ;
public Profiles1ViewImpl () {
/* 0. */
protected void create () {
getViewDef ().setQuery ( null ) ;
getViewDef ().setSelectClause ( null ) ;
setQuery ( null ) ;
public Connection getCurrentConnection () throws SQLException {
// Note that we never execute this statement, so no commit really happens
Connection conn = null ;
PreparedStatement st = getDBTransaction ().createPreparedStatement ( "commit" , 1 ) ;
conn = st.getConnection () ;
st.close () ;
return conn ;
/* 1. */
protected void executeQueryForCollection ( Object qc , Object[] params , int numUserParams ) {
storeNewResultSet ( qc , retrieveRefCursor ( qc , params ) ) ;
// callStoredProcedure ( qc , SQL_STM ) ;
super.executeQueryForCollection ( qc , params , numUserParams ) ;
/* 2. */
private ResultSet retrieveRefCursor ( Object qc , Object[] params ) {
ResultSet rs = null ;
rs = callStoredProcedure ( qc , SQL_STM ) ;
return rs ;
/* 3. */
public ResultSet callStoredProcedure ( Object qc , String stmt ) {
CallableStatement st = null ;
ResultSet refCurResultSet = null ;
try {
st = getDBTransaction ().createCallableStatement ( stmt , 0 ) ; // call
st.setObject ( 1 , 571 ) ; //set id of my record to 571
st.registerOutParameter ( 2 , OracleTypes.CURSOR ) ; // my ref_cursor
st.registerOutParameter ( 3 , Types.NUMERIC ) ;
st.registerOutParameter ( 4 , Types.VARCHAR ) ;
st.execute () ; //executeUpdate
System.out.println ( "Numeric " + st.getObject ( 3 ) ) ;
System.out.println ( "Varchar " + st.getObject ( 4 ) ) ;
refCurResultSet = ( ResultSet ) st.getObject ( 2 ) ; //set Cursoru to ResultSet
// setUserDataForCollection(qc, refCurResultSet); //don't work
// createRowFromResultSet ( qc , refCurResultSet ) ; //don't work
/* this works but only one-time call - so my resultSet(cursor) really have a data
while ( refCurResultSet.next () ) {
String nameProfile = refCurResultSet.getString ( 2 ) ;
System.out.println ( "Name profile: " + nameProfile ) ;
return refCurResultSet ;
} catch ( SQLException e ) {
System.out.println ( "sql ex " + e ) ;
throw new JboException ( e ) ;
} finally {
if ( st != null ) {
try {
st.close () ; // 7. Close the statement
} catch ( SQLException e ) {
System.out.println ( "sql exx2 " + e ) ;
/* 4. Store a new result set in the query-collection-private user-data context */
private void storeNewResultSet ( Object qc , ResultSet rs ) {
ResultSet existingRs = getResultSet ( qc ) ;
// If this query collection is getting reused, close out any previous rowset
if ( existingRs != null ) {
try {
existingRs.close () ;
} catch ( SQLException s ) {
System.out.println ( "sql err " + s ) ;
setUserDataForCollection ( qc , rs ) ; //should store my result set
hasNextForCollection ( qc ) ; // Prime the pump with the first row.
/* 5. Retrieve the result set wrapper from the query-collection user-data */
private ResultSet getResultSet ( Object qc ) {
return ( ResultSet ) getUserDataForCollection ( qc ) ;
// createRowFromResultSet - overridden for custom java data source support - also doesn't work
protected ViewRowImpl createRowFromResultSet ( Object qc , ResultSet resultSet ) {
ViewRowImpl value = super.createRowFromResultSet ( qc , resultSet ) ;
return value ;
}Hi I have the same problem like you ...
My SQL Definition:
CREATE OR REPLACE TYPE RMSPRD.NB_TAB_STOREDATA is table of NB_STOREDATA_REC
CREATE OR REPLACE TYPE RMSPRD.NB_STOREDATA_REC AS OBJECT (
v_title VARCHAR2(100),
v_store VARCHAR2(50),
v_sales NUMBER(20,4),
v_cost NUMBER(20,4),
v_units NUMBER(12,4),
v_margin NUMBER(6,2),
v_ly_sales NUMBER(20,4),
v_ly_cost NUMBER(20,4),
v_ly_units NUMBER(12,4),
v_ly_margin NUMBER(6,2),
v_sales_variance NUMBER(6,2)
CREATE OR REPLACE PACKAGE RMSPRD.NB_SALES_DATA
AS
v_sales_format_tab nb_tab_storedata;
FUNCTION sales_data_by_format_gen (
key_value IN VARCHAR2,
l_to_date IN DATE DEFAULT SYSDATE-1,
l_from_date IN DATE DEFAULT TRUNC (SYSDATE, 'YYYY')
RETURN nb_tab_storedata;
I have a PLSQL function .. that will return table ..
when i use this in sql developer it is working fine....
select * from table (NB_SALES_DATA.sales_data_by_format_gen('TSC',
'05-Aug-2012',
'01-Aug-2012') )
it returning table format record.
I am not able to call from VO object. ...
Hope you can help me .. please tell me step by step process...
protected Object callStoredFunction(int sqlReturnType, String stmt,
Object[] bindVars) {
System.out.println("--> 1");
CallableStatement st = null;
try {
st = getDBTransaction().createCallableStatement("begin ? := " +"NB_SALES_DATA.sales_data_by_format_gen('TSC','05-Aug-2012','01-Aug-2012') ; end;", 0);
System.out.println("--> 2");
st.executeUpdate();
System.out.println("--> 3");
return st.getObject(1);
catch (SQLException e) {
e.printStackTrace();
throw new JboException(e); -
Can I use Bulk Collect results as input parameter for another cursor
MUSIC ==> remote MUSIC_DB database, MUSIC table has 60 million rows
PRICE_DATA ==> remote PRICING_DB database, PRICE_DATE table has 1 billion rows
These two table once existed in same database, but size of database exceeded available hardware size and hardware budget, so the PRICE_DATA table was moved to another Oracle database. I need to create a single report that combines data from both of these tables, and a distributed join with DRIVING_SITE hint will not work because the size of both table is too large to push to one DRIVING_SITE location, so I wrote this PLSQL block to process in small blocks.
QUESTION: how can use bulk collect from one cursor and pass that bulk collected information as input to second cursor without specifically listing each cell of the PLSQL bulk collection? See sample pseudo-code below, I am trying to determine more efficient way to code than hard-coding 100 parameter names into 2nd cursor.
NOTE: below is truly pseudo-code, I had to change the names of everything to adhere to NDA, but below works and is fast enough for my purposes, but if I want to change from 100 input parameters to 200, I have to add more hard-coded values. There has got to be a better way.
DECLARE
-- define cursor that retrieves distinct SONG_IDs from MUSIC table in remote music database
CURSOR C_CURRENT_MUSIC
IS
select distinct SONG_ID
from MUSIC@MUSIC_DB
where PRODUCTION_RELEASE=1
/* define a parameterized cursor that accepts 100 SONG_IDs and retrieves
required pricing information
CURSOR C_get_music_price_data
P_SONG_ID_001 NUMBER, P_SONG_ID_002 NUMBER, P_SONG_ID_003 NUMBER, P_SONG_ID_004 NUMBER, P_SONG_ID_005 NUMBER, P_SONG_ID_006 NUMBER, P_SONG_ID_007 NUMBER, P_SONG_ID_008 NUMBER, P_SONG_ID_009 NUMBER, P_SONG_ID_010 NUMBER,
P_SONG_ID_011 NUMBER, P_SONG_ID_012 NUMBER, P_SONG_ID_013 NUMBER, P_SONG_ID_014 NUMBER, P_SONG_ID_015 NUMBER, P_SONG_ID_016 NUMBER, P_SONG_ID_017 NUMBER, P_SONG_ID_018 NUMBER, P_SONG_ID_019 NUMBER, P_SONG_ID_020 NUMBER,
P_SONG_ID_021 NUMBER, P_SONG_ID_022 NUMBER, P_SONG_ID_023 NUMBER, P_SONG_ID_024 NUMBER, P_SONG_ID_025 NUMBER, P_SONG_ID_026 NUMBER, P_SONG_ID_027 NUMBER, P_SONG_ID_028 NUMBER, P_SONG_ID_029 NUMBER, P_SONG_ID_030 NUMBER,
P_SONG_ID_031 NUMBER, P_SONG_ID_032 NUMBER, P_SONG_ID_033 NUMBER, P_SONG_ID_034 NUMBER, P_SONG_ID_035 NUMBER, P_SONG_ID_036 NUMBER, P_SONG_ID_037 NUMBER, P_SONG_ID_038 NUMBER, P_SONG_ID_039 NUMBER, P_SONG_ID_040 NUMBER,
P_SONG_ID_041 NUMBER, P_SONG_ID_042 NUMBER, P_SONG_ID_043 NUMBER, P_SONG_ID_044 NUMBER, P_SONG_ID_045 NUMBER, P_SONG_ID_046 NUMBER, P_SONG_ID_047 NUMBER, P_SONG_ID_048 NUMBER, P_SONG_ID_049 NUMBER, P_SONG_ID_050 NUMBER,
P_SONG_ID_051 NUMBER, P_SONG_ID_052 NUMBER, P_SONG_ID_053 NUMBER, P_SONG_ID_054 NUMBER, P_SONG_ID_055 NUMBER, P_SONG_ID_056 NUMBER, P_SONG_ID_057 NUMBER, P_SONG_ID_058 NUMBER, P_SONG_ID_059 NUMBER, P_SONG_ID_060 NUMBER,
P_SONG_ID_061 NUMBER, P_SONG_ID_062 NUMBER, P_SONG_ID_063 NUMBER, P_SONG_ID_064 NUMBER, P_SONG_ID_065 NUMBER, P_SONG_ID_066 NUMBER, P_SONG_ID_067 NUMBER, P_SONG_ID_068 NUMBER, P_SONG_ID_069 NUMBER, P_SONG_ID_070 NUMBER,
P_SONG_ID_071 NUMBER, P_SONG_ID_072 NUMBER, P_SONG_ID_073 NUMBER, P_SONG_ID_074 NUMBER, P_SONG_ID_075 NUMBER, P_SONG_ID_076 NUMBER, P_SONG_ID_077 NUMBER, P_SONG_ID_078 NUMBER, P_SONG_ID_079 NUMBER, P_SONG_ID_080 NUMBER,
P_SONG_ID_081 NUMBER, P_SONG_ID_082 NUMBER, P_SONG_ID_083 NUMBER, P_SONG_ID_084 NUMBER, P_SONG_ID_085 NUMBER, P_SONG_ID_086 NUMBER, P_SONG_ID_087 NUMBER, P_SONG_ID_088 NUMBER, P_SONG_ID_089 NUMBER, P_SONG_ID_090 NUMBER,
P_SONG_ID_091 NUMBER, P_SONG_ID_092 NUMBER, P_SONG_ID_093 NUMBER, P_SONG_ID_094 NUMBER, P_SONG_ID_095 NUMBER, P_SONG_ID_096 NUMBER, P_SONG_ID_097 NUMBER, P_SONG_ID_098 NUMBER, P_SONG_ID_099 NUMBER, P_SONG_ID_100 NUMBER
IS
select
from PRICE_DATA@PRICING_DB
where COUNTRY = 'USA'
and START_DATE <= sysdate
and END_DATE > sysdate
and vpc.SONG_ID IN
P_SONG_ID_001 ,P_SONG_ID_002 ,P_SONG_ID_003 ,P_SONG_ID_004 ,P_SONG_ID_005 ,P_SONG_ID_006 ,P_SONG_ID_007 ,P_SONG_ID_008 ,P_SONG_ID_009 ,P_SONG_ID_010,
P_SONG_ID_011 ,P_SONG_ID_012 ,P_SONG_ID_013 ,P_SONG_ID_014 ,P_SONG_ID_015 ,P_SONG_ID_016 ,P_SONG_ID_017 ,P_SONG_ID_018 ,P_SONG_ID_019 ,P_SONG_ID_020,
P_SONG_ID_021 ,P_SONG_ID_022 ,P_SONG_ID_023 ,P_SONG_ID_024 ,P_SONG_ID_025 ,P_SONG_ID_026 ,P_SONG_ID_027 ,P_SONG_ID_028 ,P_SONG_ID_029 ,P_SONG_ID_030,
P_SONG_ID_031 ,P_SONG_ID_032 ,P_SONG_ID_033 ,P_SONG_ID_034 ,P_SONG_ID_035 ,P_SONG_ID_036 ,P_SONG_ID_037 ,P_SONG_ID_038 ,P_SONG_ID_039 ,P_SONG_ID_040,
P_SONG_ID_041 ,P_SONG_ID_042 ,P_SONG_ID_043 ,P_SONG_ID_044 ,P_SONG_ID_045 ,P_SONG_ID_046 ,P_SONG_ID_047 ,P_SONG_ID_048 ,P_SONG_ID_049 ,P_SONG_ID_050,
P_SONG_ID_051 ,P_SONG_ID_052 ,P_SONG_ID_053 ,P_SONG_ID_054 ,P_SONG_ID_055 ,P_SONG_ID_056 ,P_SONG_ID_057 ,P_SONG_ID_058 ,P_SONG_ID_059 ,P_SONG_ID_060,
P_SONG_ID_061 ,P_SONG_ID_062 ,P_SONG_ID_063 ,P_SONG_ID_064 ,P_SONG_ID_065 ,P_SONG_ID_066 ,P_SONG_ID_067 ,P_SONG_ID_068 ,P_SONG_ID_069 ,P_SONG_ID_070,
P_SONG_ID_071 ,P_SONG_ID_072 ,P_SONG_ID_073 ,P_SONG_ID_074 ,P_SONG_ID_075 ,P_SONG_ID_076 ,P_SONG_ID_077 ,P_SONG_ID_078 ,P_SONG_ID_079 ,P_SONG_ID_080,
P_SONG_ID_081 ,P_SONG_ID_082 ,P_SONG_ID_083 ,P_SONG_ID_084 ,P_SONG_ID_085 ,P_SONG_ID_086 ,P_SONG_ID_087 ,P_SONG_ID_088 ,P_SONG_ID_089 ,P_SONG_ID_090,
P_SONG_ID_091 ,P_SONG_ID_092 ,P_SONG_ID_093 ,P_SONG_ID_094 ,P_SONG_ID_095 ,P_SONG_ID_096 ,P_SONG_ID_097 ,P_SONG_ID_098 ,P_SONG_ID_099 ,P_SONG_ID_100
group by
vpc.SONG_ID
,vpc.STOREFRONT_ID
TYPE SONG_ID_TYPE IS TABLE OF MUSIC@MUSIC_DB%TYPE INDEX BY BINARY_INTEGER;
V_SONG_ID_ARRAY SONG_ID_TYPE ;
v_commit_counter NUMBER := 0;
BEGIN
/* open cursor you intent to bulk collect from */
OPEN C_CURRENT_MUSIC;
LOOP
/* in batches of 100, bulk collect ADAM_ID mapped TMS_IDENTIFIER into PLSQL table or records */
FETCH C_CURRENT_MUSIC BULK COLLECT INTO V_SONG_ID_ARRAY LIMIT 100;
EXIT WHEN V_SONG_ID_ARRAY.COUNT = 0;
/* to avoid NO DATA FOUND error when pass 100 parameters to OPEN cursor, if the arrary
is not fully populated to 100, pad the array with nulls to fill up to 100 cells. */
IF (V_SONG_ID_ARRAY.COUNT >=1 and V_SONG_ID_ARRAY.COUNT <> 100) THEN
FOR j IN V_SONG_ID_ARRAY.COUNT+1..100 LOOP
V_SONG_ID_ARRAY(j) := null;
END LOOP;
END IF;
/* pass a batch of 100 to cursor that get price information per SONG_ID and STOREFRONT_ID */
FOR j IN C_get_music_price_data
V_SONG_ID_ARRAY(1) ,V_SONG_ID_ARRAY(2) ,V_SONG_ID_ARRAY(3) ,V_SONG_ID_ARRAY(4) ,V_SONG_ID_ARRAY(5) ,V_SONG_ID_ARRAY(6) ,V_SONG_ID_ARRAY(7) ,V_SONG_ID_ARRAY(8) ,V_SONG_ID_ARRAY(9) ,V_SONG_ID_ARRAY(10) ,
V_SONG_ID_ARRAY(11) ,V_SONG_ID_ARRAY(12) ,V_SONG_ID_ARRAY(13) ,V_SONG_ID_ARRAY(14) ,V_SONG_ID_ARRAY(15) ,V_SONG_ID_ARRAY(16) ,V_SONG_ID_ARRAY(17) ,V_SONG_ID_ARRAY(18) ,V_SONG_ID_ARRAY(19) ,V_SONG_ID_ARRAY(20) ,
V_SONG_ID_ARRAY(21) ,V_SONG_ID_ARRAY(22) ,V_SONG_ID_ARRAY(23) ,V_SONG_ID_ARRAY(24) ,V_SONG_ID_ARRAY(25) ,V_SONG_ID_ARRAY(26) ,V_SONG_ID_ARRAY(27) ,V_SONG_ID_ARRAY(28) ,V_SONG_ID_ARRAY(29) ,V_SONG_ID_ARRAY(30) ,
V_SONG_ID_ARRAY(31) ,V_SONG_ID_ARRAY(32) ,V_SONG_ID_ARRAY(33) ,V_SONG_ID_ARRAY(34) ,V_SONG_ID_ARRAY(35) ,V_SONG_ID_ARRAY(36) ,V_SONG_ID_ARRAY(37) ,V_SONG_ID_ARRAY(38) ,V_SONG_ID_ARRAY(39) ,V_SONG_ID_ARRAY(40) ,
V_SONG_ID_ARRAY(41) ,V_SONG_ID_ARRAY(42) ,V_SONG_ID_ARRAY(43) ,V_SONG_ID_ARRAY(44) ,V_SONG_ID_ARRAY(45) ,V_SONG_ID_ARRAY(46) ,V_SONG_ID_ARRAY(47) ,V_SONG_ID_ARRAY(48) ,V_SONG_ID_ARRAY(49) ,V_SONG_ID_ARRAY(50) ,
V_SONG_ID_ARRAY(51) ,V_SONG_ID_ARRAY(52) ,V_SONG_ID_ARRAY(53) ,V_SONG_ID_ARRAY(54) ,V_SONG_ID_ARRAY(55) ,V_SONG_ID_ARRAY(56) ,V_SONG_ID_ARRAY(57) ,V_SONG_ID_ARRAY(58) ,V_SONG_ID_ARRAY(59) ,V_SONG_ID_ARRAY(60) ,
V_SONG_ID_ARRAY(61) ,V_SONG_ID_ARRAY(62) ,V_SONG_ID_ARRAY(63) ,V_SONG_ID_ARRAY(64) ,V_SONG_ID_ARRAY(65) ,V_SONG_ID_ARRAY(66) ,V_SONG_ID_ARRAY(67) ,V_SONG_ID_ARRAY(68) ,V_SONG_ID_ARRAY(69) ,V_SONG_ID_ARRAY(70) ,
V_SONG_ID_ARRAY(71) ,V_SONG_ID_ARRAY(72) ,V_SONG_ID_ARRAY(73) ,V_SONG_ID_ARRAY(74) ,V_SONG_ID_ARRAY(75) ,V_SONG_ID_ARRAY(76) ,V_SONG_ID_ARRAY(77) ,V_SONG_ID_ARRAY(78) ,V_SONG_ID_ARRAY(79) ,V_SONG_ID_ARRAY(80) ,
V_SONG_ID_ARRAY(81) ,V_SONG_ID_ARRAY(82) ,V_SONG_ID_ARRAY(83) ,V_SONG_ID_ARRAY(84) ,V_SONG_ID_ARRAY(85) ,V_SONG_ID_ARRAY(86) ,V_SONG_ID_ARRAY(87) ,V_SONG_ID_ARRAY(88) ,V_SONG_ID_ARRAY(89) ,V_SONG_ID_ARRAY(90) ,
V_SONG_ID_ARRAY(91) ,V_SONG_ID_ARRAY(92) ,V_SONG_ID_ARRAY(93) ,V_SONG_ID_ARRAY(94) ,V_SONG_ID_ARRAY(95) ,V_SONG_ID_ARRAY(96) ,V_SONG_ID_ARRAY(97) ,V_SONG_ID_ARRAY(98) ,V_SONG_ID_ARRAY(99) ,V_SONG_ID_ARRAY(100)
LOOP
/* do stuff with data from Song and Pricing Database coming from the two
separate cursors, then continue processing more rows...
END LOOP;
/* commit after each batch of 100 SONG_IDs is processed */
COMMIT;
EXIT WHEN C_CURRENT_MUSIC%NOTFOUND; -- exit when there are no more rows to fetch from cursor
END LOOP; -- bulk fetching loop
CLOSE C_CURRENT_MUSIC; -- close cursor that was used in bulk collection
/* commit rows */
COMMIT; -- commit any remaining uncommitted data.
END;I've got a problem when using passing VARRAY of numbers as parameter to remote cursor: it takes a super long time to run, sometimes doesn't finish even after an hour as passed.
Continuing with my example in original entry, I replaced the bulk collect into PLSQL table collection with a VARRAY and i bulk collect into the VARRAY, this is fast and I know it works because I can DBMS_OUTPUT.PUT_LINE cells of VARRAY so I know it is getting populated correctly. However, when I pass the VARRAY containing 100 cells populated with SONG_IDs as parameter to cursor, execution time is over an hour and when I am expecting a few seconds.
Below code example strips the problem down to it's raw details, I skip the bulk collect and just manually populate a VARRAY with 100 SONG_ID values, then try to pass to as parameter to a cursor, but the execution time of cursor is unexpectedly long, over 30 minutes, sometime longer, when I am expecting seconds.
IMPORTANT: If I take the same 100 SONG_IDs and place them directly in the cursor query's where IN clause, the SQL runs in under 5 seconds and returns result. Also, if I pass the 100 SONG_IDs as individual cells of a PLSQL table collection, then it also runs fast.
I thought that since the VARRAY is used via select subquery that is it queried locally, but the cursor is remote, and that I had a distribute problem on my hands, so I put in the DRIVING_SITE hint to attempt to force the result of query against VARRAY to go to remote server and rest of query will run there before returning result, but that didn't work either, still got slow response.
Is something wrong with my code, or I am running into a Oracle problem that may require support to resolve?
DECLARE
/* define a parameterized cursor that accepts XXX number of in SONG_IDs and
retrieves required pricing information
CURSOR C_get_music_price_data
p_array_song_ids SYS.ODCInumberList
IS
select /*+DRIVING_SITE(pd) */
count(distinct s.EVE_ID)
from PRICE_DATA@PRICING_DB pd
where pd.COUNTRY = 'USA'
and pd.START_DATE <= sysdate
and pd.END_DATE > sysdate
and pd.SONG_ID IN
select column_value from table(p_array_song_ids)
group by
pd.SONG_ID
,pd.STOREFRONT_ID
V_ARRAY_SONG_IDS SYS.ODCInumberList := SYS.ODCInumberList();
BEGIN
V_ARRAY_SONG_IDS.EXTEND(100);
V_ARRAY_SONG_IDS( 1 ) := 31135 ;
V_ARRAY_SONG_IDS( 2 ) := 31140 ;
V_ARRAY_SONG_IDS( 3 ) := 31142 ;
V_ARRAY_SONG_IDS( 4 ) := 31144 ;
V_ARRAY_SONG_IDS( 5 ) := 31146 ;
V_ARRAY_SONG_IDS( 6 ) := 31148 ;
V_ARRAY_SONG_IDS( 7 ) := 31150 ;
V_ARRAY_SONG_IDS( 8 ) := 31152 ;
V_ARRAY_SONG_IDS( 9 ) := 31154 ;
V_ARRAY_SONG_IDS( 10 ) := 31156 ;
V_ARRAY_SONG_IDS( 11 ) := 31158 ;
V_ARRAY_SONG_IDS( 12 ) := 31160 ;
V_ARRAY_SONG_IDS( 13 ) := 33598 ;
V_ARRAY_SONG_IDS( 14 ) := 33603 ;
V_ARRAY_SONG_IDS( 15 ) := 33605 ;
V_ARRAY_SONG_IDS( 16 ) := 33607 ;
V_ARRAY_SONG_IDS( 17 ) := 33609 ;
V_ARRAY_SONG_IDS( 18 ) := 33611 ;
V_ARRAY_SONG_IDS( 19 ) := 33613 ;
V_ARRAY_SONG_IDS( 20 ) := 33615 ;
V_ARRAY_SONG_IDS( 21 ) := 33617 ;
V_ARRAY_SONG_IDS( 22 ) := 33630 ;
V_ARRAY_SONG_IDS( 23 ) := 33632 ;
V_ARRAY_SONG_IDS( 24 ) := 33636 ;
V_ARRAY_SONG_IDS( 25 ) := 33638 ;
V_ARRAY_SONG_IDS( 26 ) := 33640 ;
V_ARRAY_SONG_IDS( 27 ) := 33642 ;
V_ARRAY_SONG_IDS( 28 ) := 33644 ;
V_ARRAY_SONG_IDS( 29 ) := 33646 ;
V_ARRAY_SONG_IDS( 30 ) := 33648 ;
V_ARRAY_SONG_IDS( 31 ) := 33662 ;
V_ARRAY_SONG_IDS( 32 ) := 33667 ;
V_ARRAY_SONG_IDS( 33 ) := 33669 ;
V_ARRAY_SONG_IDS( 34 ) := 33671 ;
V_ARRAY_SONG_IDS( 35 ) := 33673 ;
V_ARRAY_SONG_IDS( 36 ) := 33675 ;
V_ARRAY_SONG_IDS( 37 ) := 33677 ;
V_ARRAY_SONG_IDS( 38 ) := 33679 ;
V_ARRAY_SONG_IDS( 39 ) := 33681 ;
V_ARRAY_SONG_IDS( 40 ) := 33683 ;
V_ARRAY_SONG_IDS( 41 ) := 33685 ;
V_ARRAY_SONG_IDS( 42 ) := 33700 ;
V_ARRAY_SONG_IDS( 43 ) := 33702 ;
V_ARRAY_SONG_IDS( 44 ) := 33704 ;
V_ARRAY_SONG_IDS( 45 ) := 33706 ;
V_ARRAY_SONG_IDS( 46 ) := 33708 ;
V_ARRAY_SONG_IDS( 47 ) := 33710 ;
V_ARRAY_SONG_IDS( 48 ) := 33712 ;
V_ARRAY_SONG_IDS( 49 ) := 33723 ;
V_ARRAY_SONG_IDS( 50 ) := 33725 ;
V_ARRAY_SONG_IDS( 51 ) := 33727 ;
V_ARRAY_SONG_IDS( 52 ) := 33729 ;
V_ARRAY_SONG_IDS( 53 ) := 33731 ;
V_ARRAY_SONG_IDS( 54 ) := 33733 ;
V_ARRAY_SONG_IDS( 55 ) := 33735 ;
V_ARRAY_SONG_IDS( 56 ) := 33737 ;
V_ARRAY_SONG_IDS( 57 ) := 33749 ;
V_ARRAY_SONG_IDS( 58 ) := 33751 ;
V_ARRAY_SONG_IDS( 59 ) := 33753 ;
V_ARRAY_SONG_IDS( 60 ) := 33755 ;
V_ARRAY_SONG_IDS( 61 ) := 33757 ;
V_ARRAY_SONG_IDS( 62 ) := 33759 ;
V_ARRAY_SONG_IDS( 63 ) := 33761 ;
V_ARRAY_SONG_IDS( 64 ) := 33763 ;
V_ARRAY_SONG_IDS( 65 ) := 33775 ;
V_ARRAY_SONG_IDS( 66 ) := 33777 ;
V_ARRAY_SONG_IDS( 67 ) := 33779 ;
V_ARRAY_SONG_IDS( 68 ) := 33781 ;
V_ARRAY_SONG_IDS( 69 ) := 33783 ;
V_ARRAY_SONG_IDS( 70 ) := 33785 ;
V_ARRAY_SONG_IDS( 71 ) := 33787 ;
V_ARRAY_SONG_IDS( 72 ) := 33789 ;
V_ARRAY_SONG_IDS( 73 ) := 33791 ;
V_ARRAY_SONG_IDS( 74 ) := 33793 ;
V_ARRAY_SONG_IDS( 75 ) := 33807 ;
V_ARRAY_SONG_IDS( 76 ) := 33809 ;
V_ARRAY_SONG_IDS( 77 ) := 33811 ;
V_ARRAY_SONG_IDS( 78 ) := 33813 ;
V_ARRAY_SONG_IDS( 79 ) := 33815 ;
V_ARRAY_SONG_IDS( 80 ) := 33817 ;
V_ARRAY_SONG_IDS( 81 ) := 33819 ;
V_ARRAY_SONG_IDS( 82 ) := 33821 ;
V_ARRAY_SONG_IDS( 83 ) := 33823 ;
V_ARRAY_SONG_IDS( 84 ) := 33825 ;
V_ARRAY_SONG_IDS( 85 ) := 33839 ;
V_ARRAY_SONG_IDS( 86 ) := 33844 ;
V_ARRAY_SONG_IDS( 87 ) := 33846 ;
V_ARRAY_SONG_IDS( 88 ) := 33848 ;
V_ARRAY_SONG_IDS( 89 ) := 33850 ;
V_ARRAY_SONG_IDS( 90 ) := 33852 ;
V_ARRAY_SONG_IDS( 91 ) := 33854 ;
V_ARRAY_SONG_IDS( 92 ) := 33856 ;
V_ARRAY_SONG_IDS( 93 ) := 33858 ;
V_ARRAY_SONG_IDS( 94 ) := 33860 ;
V_ARRAY_SONG_IDS( 95 ) := 33874 ;
V_ARRAY_SONG_IDS( 96 ) := 33879 ;
V_ARRAY_SONG_IDS( 97 ) := 33881 ;
V_ARRAY_SONG_IDS( 98 ) := 33883 ;
V_ARRAY_SONG_IDS( 99 ) := 33885 ;
V_ARRAY_SONG_IDS(100 ) := 33889 ;
/* do stuff with data from Song and Pricing Database coming from the two
separate cursors, then continue processing more rows...
FOR i IN C_get_music_price_data( v_array_song_ids ) LOOP
. (this is the loop where I pass in v_array_song_ids
. populated with only 100 cells and it runs forever)
END LOOP;
END; -
Oracle Discoverer report pulls incorrect result when scheduled.
Recently the database was migrated to 10.1.2 RAC from 9.2.0.6, so the discoverer EUL is now resides on new database.
after migration the report which pulls correct results when run interactively is pulling incorrect result when scheduled in Discoverer.
This report used sysdate and aggregate functions, i had ran the same report simultaneously( Directly in Discoverer Desktop/Plus and scheduled in discoverer), but the data retrieved in both case is not matching.
here is the query. any help is appreciated.
SELECT /*+ FIRST_ROWS */ A.SITE_ID as E175108,B."SYSTEM DESCRIPTION" as System_Prefix,
B."SYSTEM PREFIX" as System_Description,
COUNT(CASE WHEN ( TRUNC(SYSDATE)-DISCO10G.DATE_FORMAT_TEST(A.STATUS_DATE) ) < 0 THEN 1 ELSE TO_NUMBER(NULL) END) as Less_than_0_Days,
COUNT(CASE WHEN ( TRUNC(SYSDATE)-DISCO10G.DATE_FORMAT_TEST(A.STATUS_DATE) ) > 121 THEN 1 ELSE TO_NUMBER(NULL) END) as 0_to_14 Days,
COUNT(DECODE(TRUNC(( TRUNC(SYSDATE)-DISCO10G.DATE_FORMAT_TEST(A.STATUS_DATE) )/31),3,( TRUNC(SYSDATE)-DISCO10G.DATE_FORMAT_TEST(A.STATUS_DATE) ),to_number(NULL))) as 14_to_30_Days,
COUNT(DECODE(TRUNC(( TRUNC(SYSDATE)-DISCO10G.DATE_FORMAT_TEST(A.STATUS_DATE) )/31),2,( TRUNC(SYSDATE)-DISCO10G.DATE_FORMAT_TEST(A.STATUS_DATE) ),to_number(NULL))) as 31_to_60_Days,
COUNT(DECODE(TRUNC(( TRUNC(SYSDATE)-DISCO10G.DATE_FORMAT_TEST(A.STATUS_DATE) )/31),1,( TRUNC(SYSDATE)-DISCO10G.DATE_FORMAT_TEST(A.STATUS_DATE) ),to_number(NULL))) as 61_to_90_Days,
COUNT(CASE WHEN ( TRUNC(SYSDATE)-DISCO10G.DATE_FORMAT_TEST(A.STATUS_DATE) ) BETWEEN 15 AND 30 THEN 1 ELSE TO_NUMBER(NULL) END) as 91_to_120_Days,
COUNT(CASE WHEN ( TRUNC(SYSDATE)-DISCO10G.DATE_FORMAT_TEST(A.STATUS_DATE) ) BETWEEN 0 AND 14 THEN 1 ELSE TO_NUMBER(NULL) END) as 120_Days_Plus,
COUNT(TRUNC(SYSDATE)-DISCO10G.DATE_FORMAT_TEST(A.STATUS_DATE)) as Total
FROM PSTAGE.ALL_EQUIPMENT A,
( SELECT A.SITE "SYSTEM PREFIX", A.DESCRIPTION "SYSTEM DESCRIPTION", A.SITE_ID, B.SITE_DESCRIPTION, A.G2B_ID
FROM SITE_LIST A, ALL_CF_SITE_CONTROL B
WHERE A.SITE_ID = B.SITE_ID
ORDER BY 1, 3
) B
WHERE ( (B.SITE_ID = A.SITE_ID))
AND (A.EQUIPMENT_STATUS_CODE IN ('T','7'))
GROUP BY A.SITE_ID,B."SYSTEM DESCRIPTION",B."SYSTEM PREFIX"
ORDER BY B."SYSTEM DESCRIPTION" ASC ;
Thanks!Hi sunil,
Rod is referencing the NLS parameters i.e.
Can you please let me know which NLS parameters you are referring toNLS parameters in this scenerio may be the date and language for that session.Do check out
SELECT * from NLS_SESSION_PARAMETERS
how i can check if there any differences in the NLS parameters when report is scheduled or run interactivelyI think you should run the trace file.Iam not sure about it.
It would be system_context.
Hope it helps you.
Kranthi. -
How to send email using pl/sql containing the result set as the msg body
Hi.. im using Pl/SQL code to send emails to the users from a dataset that is obtained in a databse table. i have used utl_smtp commands to establish the connection with the smtp mail server. im stuck at the logic when i have to include the message body which is actually the result set of a table.. For instance
IF (p_message = 0) THEN
UTL_SMTP.write_data(l_mail_conn, 'There is no mismatch between the codes' || UTL_TCP.crlf);
ELSE
UTL_SMTP.write_data(l_mail_conn, 'The missing codes are ' || UTL_TCP.crlf);
for s in (select * from temp)
loop
UTL_SMTP.write_data(l_mail_conn, ' ' ||s || UTL_TCP.crlf);
end loop;
END IF;
UTL_SMTP.close_data(l_mail_conn);
UTL_SMTP.quit(l_mail_conn);
END;
***p_message is a prameter passed to this procedure..
Can i obtain the result in the form i have it in my table. which has three columns. I want to display the three columns as it is with teh records. ?this is not related about this forum but you can use below,
CREATE OR REPLACE PROCEDURE SEND_MAIL (subject varchar2,mail_from varchar2, mail_to varchar2,mail_msg varchar2)
IS
mail_host varchar2(30):='XXXXX';
mail_conn utl_smtp.connection;
tz_offset number:=0;
str varchar2(32000);
BEGIN
begin
select to_number(replace(dbtimezone,':00'))/24 into tz_offset from dual;
exception
when others then
null;
end;
mail_conn:=utl_smtp.open_connection(mail_host, 25);
utl_smtp.helo(mail_conn,mail_host);
utl_smtp.mail(mail_conn,'[email protected]');
utl_smtp.rcpt(mail_conn,mail_to);
utl_smtp.open_data(mail_conn);
utl_smtp.write_data(mail_conn,'Date: '||to_char(sysdate-tz_offset,'dd mon yy hh24:mi:ss')||utl_tcp.crlf);
utl_smtp.write_data(mail_conn,'From: '|| mail_from ||utl_tcp.crlf);
utl_smtp.write_data(mail_conn,'To: "'|| mail_to ||'" <'||mail_to||'>'||utl_tcp.crlf);
utl_smtp.write_data(mail_conn,'Subject: '||subject||utl_tcp.crlf);
utl_smtp.write_data(mail_conn,utl_tcp.crlf);
utl_smtp.write_data(mail_conn,replace_turkish_chars(mail_msg)||utl_tcp.crlf);
utl_smtp.write_data(mail_conn,utl_tcp.crlf);
utl_smtp.close_data(mail_conn);
utl_smtp.quit(mail_conn);
END;
Edited by: odilibrary.com on Jun 12, 2012 5:26 PM -
Calling a Stored Procedure with a result set and returned parms
I am calling a stored procedure from a Brio report. The stored procedure returns a result set, but also passes back some parameters. I am getting a message that states that the DBMS cannot find the SP with the same footprint. Besides the result set, the SP returns 3 out parameters: (Integer, char(60), char(40)). Is there something special I need to do in Brio to format the out parameters to be passed back from the SP.
Thanks,
RolandDid you try just declaring the vars?
untested
declare
myCur SYS_REFCURSOR;
myRaw RAW(4);
BEGIN
test (0, 0, myRaw, sysdate, myCur);
END; -
Export query results to flat file with dynamic filename
Hi
Can anybody can point me how to dynamic export query serults set to for example txt file using process flows in OWB.
Let say I have simple select query
select * from table1 where daterange >= sysdate -1 and daterange < sysdate
so query results will be different every day because daterange will be different. Also I would like to name txt file dynamicly as well
eg. results_20090601.txt, results_20090602.txt, results_20090603.txt
I cant see any activity in process editor to enter custom sql statment, like it is in MSSQL 2000 or 2005
thanks in advanceYou can call existing procedures from a process flow the procedure can create the filename with whatever name you desire. OWB maps with file as target can also create a file with a dynamic name defined by an expression (see here ).
Cheers
David -
How can I display multiple column results of a sql query?
I'm wanting to display the results of a query selecting from multiple columns, but I can't seem to find an item type that will allow this. I've tried LOV, multiselect, display as text and others. Any ideas on how to do this. Here is my basic query:
Select ul.meaning,
rqa.submission_date,
rqa.location_num
from
cfa_rqa_doc_submit_dates rqa,
cfa_user_lookups ul
where
rqa.location_num in (Select location_num from cfa_current_locations_mv
where operator_person_id = :P1_PERSON_ID and substr(location_num,1,1) = '8')
and
ul.lookup_type_id='1269'
and
to_char(rqa.submission_date, 'month') = to_char(sysdate, 'month')
and
rqa.submission_date >= (SYSDATE-365)
and ul.lookup_ID= rqa.document_type_id
;Hi,
Do you just wish to display the result of the query? If so, you can simply parse it out in HTML.
You can then choose if you want to use tables or css.
Multiple column layout in tables are based on <tr> and <td>.
<tr> is a table row, where <td> is a column.
All tags should be closed.
Example:
<table>
<tr>
<td>col1</td><td>col2</td>
</tr>
<tr>
<td colspan="2">spans over 2 cols</td>
</tr>
</table>If you want to do the same in css:
(Seems this forum removes the styles!):
float:left; width:50; << first div and 2 div (col 1 and col 2 style)
float:left;clear:both; width:100%; << clear both, double width (spans over 2)
<div>
<div style="float:left; width:50;">col1</div><div style="float:left;width:50%;">col2</div>
<div style="float:left;clear:both; width=100%;">Spans over 2 cols</div>
</div>The div might look more complicated, but if you refrain from styling in the tags them selves, you can define different styles in the .css file.
You need the clear:both to start a new line with the divs that float.
I usually run a dedicated "new line" div, without content.. (exception beeing the html-entities version of ' ' (& nbsp ; << without the spaces)).
eg.:
<div style="cls"> </div>Parsing out the values from the PL SQL you do like so:
begin
declare
cursor c_search is
Select ul.meaning,
rqa.submission_date,
rqa.location_num
from
cfa_rqa_doc_submit_dates rqa,
cfa_user_lookups ul
where
rqa.location_num in (Select location_num from cfa_current_locations_mv
where operator_person_id = :P1_PERSON_ID and substr(location_num,1,1) = '8')
and
ul.lookup_type_id='1269'
and
to_char(rqa.submission_date, 'month') = to_char(sysdate, 'month')
and
rqa.submission_date >= (SYSDATE-365)
and ul.lookup_ID= rqa.document_type_id
begin
htp.p('<div style="width:80%;">');
for v_search in c_search loop
htp.p('<div style="float:left;clear:none;">'||v_search.location_num||'</div>');
htp.p('<div style="float:left;clear:none;">'||v_search.submission_date||'</div>');
end loop;
htp.p('</div>');
end;
end;Ps. hope I understood you correctly, also this code is untested.. but I hope it can still help.
Edited by: Olav Alexander Mjelde on May 12, 2010 9:36 AM -
Hi friends,
I need to restrict the report according to the user who logs in to the application. But only for the ADMIN user i need to show all the records except with the status which is not in "CREATED', i need to show all the records to the admin with other status other than the 'CREATED" status.
For that i tried with the below query
select
'' "Null",
"REQUEST_ID",
"REQUEST_TYPE_NAME",
"REQUEST_NUMBER",
"REQUEST_CLASS_NAME",
"REQUEST_STATUS_NAME",
"REQUEST_DATE"
from XXHY_AMS_REQ_DET_V , apps.fnd_user xx
where /*request_number like nvl(:P1_REQUEST_NUMBER,'%')
and
REQUEST_STATUS_CODE like nvl(:P1_REQUEST_STATUS,'%')
and
lower(REQUEST_DATE) LIKE NVL(lower(:P1_REQUEST_DATE), '%')
and */requestor_person_id = xx.employee_id or
lower(xx.user_name) = lower(:APP_USER) or
exists (select 1 from apps.per_all_people_f papf,
apps.per_all_assignments_f paaf,
apps.per_all_people_f supf,
apps.pqh_roles rls,
apps.per_people_extra_info pei,
apps.fnd_user a, XXHY_AMS_REQ_DET_V b
where papf.person_id = paaf.person_id and pei.person_id = paaf.person_id
and nvl(paaf.supervisor_id, papf.person_id) = supf.person_id
and sysdate between papf.effective_start_date and papf.effective_end_date
and sysdate between paaf.effective_start_date and paaf.effective_end_date
and sysdate between supf.effective_start_date and supf.effective_end_date
and a.employee_id = papf.person_id
and lower(a.user_name) = lower(:APP_USER)
and information_type = 'PQH_ROLE_USERS' and paaf.person_id = b.requestor_person_id and lower(b.request_status_code) not in ('created')
and rls.role_id = to_number (pei.pei_information3)
and rls.role_id = to_number (pei.pei_information3) and rls.role_name like 'XXHW_AMS_ADMIN')
order by 1
In the above query i used the keyword :APP_USER which identifies the user who logs in APEX.
Also i have a role named XXHW_AMS_ADMIN, which identifies the user under the admin category.
So, according to my query, if the user is not in the admin category means, it has to show only the records raised by him. If the user is in the admin category means then it has to show all the records of all the users other than the status which is not in 'CREATED'.
But my above query is resulting in cartesian join, if i check with the admin username.
But it fetches the correct result if i checked with the user who is not in the admin category.
I dont know why the cartesian join is occuring if i check with the admin user.
Suppose if i tried to run the query separately which is beneath the EXIST condition* for checking the admin user means, then it is recognizing the admin. But i dont know why it is not working in my above query.*
select 1 from apps.per_all_people_f papf,
apps.per_all_assignments_f paaf,
apps.per_all_people_f supf,
apps.pqh_roles rls,
apps.per_people_extra_info pei,
apps.fnd_user a, XXHY_AMS_REQ_DET_V b
where papf.person_id = paaf.person_id and pei.person_id = paaf.person_id
and nvl(paaf.supervisor_id, papf.person_id) = supf.person_id
and sysdate between papf.effective_start_date and papf.effective_end_date
and sysdate between paaf.effective_start_date and paaf.effective_end_date
and sysdate between supf.effective_start_date and supf.effective_end_date
and a.employee_id = papf.person_id
and lower(a.user_name) = lower(:APP_USER)
and information_type = 'PQH_ROLE_USERS' and paaf.person_id = b.requestor_person_id and lower(b.request_status_code) not in ('created')
and rls.role_id = to_number (pei.pei_information3)
and rls.role_id = to_number (pei.pei_information3) and rls.role_name like 'XXHW_AMS_ADMIN')
order by 1what might be wrong in my query.
Brgds,
MiniI was using SQL Developer so i used colon.
For Sql plus I changed it to & and it is working as expected
SQL> with t_user as
select 1 as person_id, 'P1' as user_name from dual union all
select 2,'P2' from dual union all
select 3,'P3' from dual union all
select 4,'P4' from dual union all
select -1,'ADMIN' from dual
t_req_data as
select 1 as person_id, 'created' as request_status_code, sysdate-1 as some_data from dual union all
select 1 , 'updated' , sysdate-0.5 from dual union all
select 2 , 'deleted' , sysdate from dual union all
select -1 , 'created' , sysdate from dual union all
select -1 , 'updated' , sysdate from dual union all
select -1 , 'created' , sysdate - 21 from dual union all
select -1 , 'updated' , sysdate - 21 from dual union all
select 2 , 'deleted' , sysdate from dual
SELECT
tu.person_id,
tu.user_name,
trq.request_status_code,
trq.some_data
FROM
t_user tu,
t_req_data trq
WHERE
tu.person_id = trq.person_id
AND
&in_user = 'ADMIN'
AND request_status_code != 'created'
OR
&in_user != 'ADMIN'
AND &in_user = user_name
Enter value for in_user: 'ADMIN'
old 33: &in_user = 'ADMIN'
new 33: 'ADMIN' = 'ADMIN'
Enter value for in_user: 'ADMIN'
old 38: &in_user != 'ADMIN'
new 38: 'ADMIN' != 'ADMIN'
Enter value for in_user: 'ADMIN'
old 39: AND &in_user = user_name
new 39: AND 'ADMIN' = user_name
PERSON_ID USER_ REQUEST SOME_DATA
1 P1 updated 13-DEC-2011 22:14:32
2 P2 deleted 14-DEC-2011 10:14:32
-1 ADMIN updated 14-DEC-2011 10:14:32
-1 ADMIN updated 23-NOV-2011 10:14:32
2 P2 deleted 14-DEC-2011 10:14:32
SQL>
Maybe you are looking for
-
Gnome and kde not loading with systemd
Hello! I use [testing] repo and after some updates i can't use gnome or kde with systemd anymore. * with sysvinit everything works * xfce and other wms works fine with systemd and sysv * 'gnome-shell --replace' also work in xfce with systemd * I've g
-
LMS 4.2 – Missing messages in Remote Syslog Collector
Remote syslog Collector are dropping syslog messages - randomly. During analyzing we found out that syslog messages are stored in RSAC in file: /var/log/syslog_info According to information from /etc/rsyslog.conf are the same syslog messages stored a
-
How may i know wich data are deleted from my sql database.
Im using sql server 2005 someone deleted some transaction from my database.In my database audit is not enable. How may i know wich data is deleted? plz help me.
-
What are the access permissions on Site Contents?
Hello I don't want outsiders accessing Site Contents. What are the access permissions? Can anyone see that page? Mel Mel
-
I tried upgrade my iphone 4s to ios 5.1.1. At the end of restoring iphone firmware, it displayed : The iphone " iphone" could not be restored. An unknown error occurred (error 1 ). I tried for times . It is very stange to me to upgrade my iphone 4s,