Ref cursor problema
I have the following procedure :
CREATE OR REPLACE PROCEDURE proc_REF(cur_ref IN sys_refcursor) is
FIELD1 varchar2(200);
BEGIN
LOOP
FETCH cur_ref INTO FIELD1;
INSERT INTO tipos_prueba (cod_tipo) VALUES (FIELD1);
EXIT WHEN cur_ref%NotFound;
END LOOP;
END proc_REF;
well that is ok , but i want to pass it the result of a query like that
select id_pto from ptos where iddep=14;
this is thw way to call it?
DECLARE
CUR_REF sys_refcursor;
BEGIN
CUR_REF :=select id_pto from ptos where iddep=14;
PUNTOS.PROC_REF ( CUR_REF );
COMMIT;
END;
create or replace procedure p1( cur_ref IN sys_refcursor)
is
a date;
begin
loop
FETCH cur_ref INTO a;
exit when cur_ref%notfound;
dbms_output.put_line(a);
end loop;
end;
SQL> @p1.sql
Procedure created.
SQL> declare
cur_ref sys_refcursor;
begin
open cur_ref for select sysdate from dual;
p1(cur_ref);
end;
11-NOV-05
PL/SQL procedure successfully completed.
SQL>
I am not facing any problem here.
Similar Messages
-
Ref.Cursor Problem - URGENT
Hi Friends,
For my report ( calc.rdf ) ,
I am passing two input parameters P_Client_ID, P_Plan_ID.
In .rdf, I had a ref.cursor for selecting records based on
two input parameters values.
case1:
P_client_ID = 'SRINI'
P_Plan_ID = '3232'
My report is generating the output for plan 3232.
case2:
P_client_ID = 'SRINI'
P_Plan_ID = NULL
My report is generating the output for all plans.
case3:
P_client_ID = 'SRINI'
P_Plan_ID = '3232,3257,3259'
My report is not generating any output here.
Only blanck page i am getting.
How can i pass multiple plans to ref.cursor at a time ?
Note:
I now, we cannot make Lexical references in a PL/SQL statement.
Any other way to solve this problem ?
Thanks for Help,
sriniI think that you work with 'static' ref cursor.
From Oracle 8.1.5, we can use 'dynamic' ref cursors.
With 'dynamic' ref cursor we can avoid the use of lexical parameters in Reports 3.0 / 6i.
With 'static' ref cursor this is not possible in all cases.
For example, if we need dynamic WHERE, we practically can't use 'static' ref cursor.
Example for 'dynamic' ref cursor (dynamic WHERE)
1. Stored package
CREATE OR REPLACE PACKAGE report_dynamic IS
TYPE type_ref_cur_sta IS REF CURSOR RETURN dept%ROWTYPE; -- for Report Layout only
TYPE type_ref_cur_dyn IS REF CURSOR;
FUNCTION func_dyn (p_where VARCHAR2) RETURN type_ref_cur_dyn;
END;
CREATE OR REPLACE PACKAGE BODY report_dynamic IS
FUNCTION func_dyn (p_where VARCHAR2) RETURN type_ref_cur_dyn IS
l_ref_cur_dyn type_ref_cur_dyn;
BEGIN
OPEN l_ref_cur_dyn FOR
'SELECT * FROM dept WHERE ' || NVL (p_where, '1 = 1');
RETURN l_ref_cur_dyn;
END;
END;
2.2 Query PL/SQL in Reports
function QR_1RefCurQuery return report_dynamic.type_ref_cur_sta is
begin
return report_dynamic.func_dyn (:p_where);
end;
Note that Oracle Reports 3.0 / 6i needs 'static' ref cursor type for building Report Layout.
So, in package specification we must have both ref cursor types, static for Report Layout
and dynamic for ref cursor query.
Regards
Zlatko Sirotic -
Ref Cursor Problem in Oracle Forms 6i
Hi all.
In Oracle Forms 6i, can not I do this?
DECLARE
TYPE CUR_REF IS REF CURSOR;
CUR_PRODUCTS CUR_REF;
VAR_QUERY VARCHAR2(3000) := 'SELECT something FROM table';
BEGIN
OPEN CUR_PRODUCTS FOR VAR_QUERY;
END;
It generates error on opening that it expects a SELECT statement.
How can I open a dynamic ref cursor in Oracle Forms 6i??? The same thing works fine in PL/SQL.
Regards,
Zaaf
Thanks in advance.It could be like this:
PROCEDURE dynamic_cursor ( PC$Clause IN Varchar2 )
IS
cursor_number EXEC_SQL.CursType;
-- Variables for the data to be returned into
LC$ACTYPE Number;
-- Control variables
LN$count Number;
LC$sql_order Varchar2(256);
BEGIN
-- Open the cursor --
cursor_number := Exec_SQL.Open_cursor;
-- build the complete SQL order --
LC$sql_order := PC$clause ;
-- Parse the SQL order --
EXEC_SQL.PARSE(cursor_number, LC$sql_order);
-- Define the columns for the data to be returned --
EXEC_SQL.DEFINE_COLUMN(cursor_number,1,LC$ACTYPE);
-- Execute the Cursor --
LN$count := EXEC_SQL.EXECUTE(cursor_number);
-- Loop and fetch each row from the result set --
While EXEC_SQL.FETCH_ROWS(cursor_number) > 0 Loop
EXEC_SQL.COLUMN_VALUE(cursor_number,1,LC$ACTYPE);
begin
select chqfac, pasfac, indbcr ,
staxfl, excise, incchg, cat001 , trntyp , subtyp
into s_chkbok, s_pasbok, s_intber,
s_staxfl, s_excise, s_incchg, s_cat001 , ss_trntyp , ss_subtyp
from stfeacty
where brancd = s_brancd
and actype = LC$ACTYPE;
s_actype := LC$ACTYPE ;
exception
when no_data_found then
NULL;
when too_many_rows then
NULL;
end;
End Loop ;
-- Close the cursors
EXEC_SQL.CLOSE_CURSOR(cursor_number);
EXCEPTION
When EXEC_SQL.INVALID_CONNECTION Then
message('Unexpected Invalid Connection error from EXEC_SQL');
When EXEC_SQL.PACKAGE_ERROR Then
message('Unexpected error from EXEC_SQL: '||to_char(EXEC_SQL.LAST_ERROR_CODE)|| EXEC_SQL.LAST_ERROR_MESG);
If EXEC_SQL.IS_OPEN(cursor_number) Then
EXEC_SQL.CLOSE_CURSOR(cursor_number);
message('Exception - Cleaned up Cursor');
End if;
END; That you could call with the following:
dynamic_cursor('SELECT ac_type FROM SYSADM.SAVINGS');But, if the query is as simple with only the table name change, you could aslo use a simpliest solution based on a record group.
Francois -
REF CURSOR problem .. function call from select
Hello,
I am still on the search for a way to call a function from with in a select statement.
I've done it in SQL*Plus like this and it works.
SELECT name, f_format(name) FROM user WHERE id = 12;
This returns first the unformatted (raw) version of the stored value for name and then the formmtted version of the stored value of name.
Since multiple names will be returned I need to user a REF CURSOR (cursor variable). The above select statement does not work from within the OPEN . .FOR clause necessary for a REF CURSOR.
What can I do instead? My goal is to return multiple records of formatted names.
nullI have declared the reference cursor as a weak one. Thank you for clarifying that though. I was wondering if it made a difference. Here is a simple package that shows you what I am trying to do. I will include the errors at the bottom. Please have a look and let me know what you think is wrong.
/*--------- PL/SQL ------------*/
CREATE OR REPLACE PACKAGE test_refcur AS
PROCEDURE decrypt (
i_string IN VARCHAR2
,o_string OUT VARCHAR2
TYPE PwdCurTyp IS REF CURSOR;
PROCEDURE get_pwd_info (
i_user_id IN NUMBER
,io_pwd_cv IN OUT PwdCurTyp
END test_refcur;
CREATE OR REPLACE PACKAGE BODY test_refcur AS
FUNCTION f_decrypt (
i_string IN VARCHAR2
) RETURN VARCHAR2 IS
l_string VARCHAR2(64);
l_string_dec VARCHAR2(32);
BEGIN
l_string := i_string;
dbms_obfuscation_toolkit.DESDecrypt(
input_string => l_string
,key_string =>'12345678'
,decrypted_string=> l_string_dec );
RETURN l_string_dec;
END f_decrypt;
PROCEDURE decrypt (
i_string IN VARCHAR2
,o_string OUT VARCHAR2
) IS
BEGIN
o_string := f_decrypt(i_string);
END decrypt;
PROCEDURE get_pwd_info (
i_user_id IN NUMBER
,io_pwd_cv IN OUT PwdCurTyp
) IS
BEGIN
OPEN io_pwd_cv FOR
SELECT
label
,f_decrypt(user_name_text) AS dec_user_name
,f_decrypt(text) AS dec_pwd
FROM
code_pwd
WHERE
id = i_user_id;
END get_pwd_info;
END test_refcur;
/*--------- SQL*Plus -----------*/
Warning: Package Body created with compilation errors.
SHOW ERRORSErrors for PACKAGE BODY TEST_REFCUR:
LINE/COL ERROR
28/13 PL/SQL: SQL Statement ignored
30/18 PLS-00231: function 'F_DECRYPT' may not be used in SQL
Then I made the SELECT statement dynamic.
OPEN io_pwd_cv FOR
'SELECT label, f_decrypt(user_name_text) AS dec_user_name, f_decrypt(text) AS dec_pwd FROM code_pwd WHERE id = i_user_id';
It compiled fine.
Package body created.
So then I tried to do the following. .
SET AUTOPRINT ON
SET SERVEROUTPUT ON
VARIABLE cv REFCURSOR
EXECUTE test_refcur.get_pwd_info(18, :cv)begin test_refcur.get_pwd_info(18, :cv); end;
ERROR at line 1:
ORA-00904: invalid column name
ORA-06512: at "K.TEST_REFCUR", line 27
ORA-06512: at line 1
If I change the SELECT statement to the following, this is what I get. .
OPEN io_pwd_cv FOR
SELECT label
-- ,f_decrypt(user_name_text) AS dec_user_name
-- ,f_decrypt(text) AS dec_pwd
FROM code_pwd
WHERE id = i_user_id;
SET AUTOPRINT ON
SET SERVEROUTPUT ON
VARIABLE cv REFCURSOR
EXECUTE test_refcur.get_pwd_info(18, :cv)PL/SQL procedure successfully completed.
LABEL
Development Server
That tells me that at least something is working. How can I get everything else to work? -
Stored procedure and ref cursor problem
I am trying to create a stored procedure that can be used in Crystal Reports. To do this I have to create a package and a ref cursor. My SQL is below:
--Package
Create or Replace Package Test_Package
as type test_type is ref cursor;
end;
--Procedure
Create or Replace Procedure Test_Proc
(test_cursor in out test_package.test_type,
parameter in string
as
begin
open test_cursor for
select ClientName from apbpman.cv_client where clientref = parameter;
end;
--When trying to execute the SP in Oracle I use:-
set serveroutput on
declare
test_cursor apbpman.test_package.test_type;
resultset test_cursor%rowtype;
begin
apbpman.test_proc(test_cursor,'0096');
if not test_cursor%isopen then
dbms_output.put_line ('OK');
else
dbms_output.put_line ('Not OK');
end if;
fetch test_cursor into resultset;
while test_cursor%found loop
dbms_output.put_line(resultset.ClientName);
fetch test_cursor into resultset;
end loop;
end;
Whenever this runs I receive the following error reports:
resultset test_cursor%rowtype;
ERROR at line 3:
ORA-06550: line 3, column 13:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 3, column 13:
PL/SQL: Item ignored
ORA-06550: line 11, column 25:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 11, column 2:
PL/SQL: SQL Statement ignored
ORA-06550: line 13, column 24:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 13, column 3:
PL/SQL: Statement ignored
ORA-06550: line 14, column 26:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 14, column 3:
PL/SQL: SQL Statement ignored
I have tried in vain to find a resolution to this but have failed. Please help.
Thanks,
PaulUnless you are running a really old version of Oracle, any weak ref cursor can just be declared SYS_REFCURSOR. Also, you can't use a weak ref cursor for %ROWTYPE. You can test the procedure in SQL*Plus by using it to populate a refcursor variable.
-
Hi,
In my package i am opening a refcursor as follows.
l_sqls := l_sqls||'SELECT VEHICLE_NO VEHICLENO,'|| l_str|| ' FROM trn_tmschklst ' ;
l_sqls := l_sqls ||' where comp_id = '''||p_comp_id||'''';
l_sqls := l_sqls ||' and site_id = '''||p_site_id||'''';
l_sqls := l_sqls ||' and ebiz_appown_no = '''||p_ebiz_appown_no||'''';
l_sqls := l_sqls ||' and chklst_type = '''||l_check_type ||'''';
l_sqls := l_sqls ||' and chk_date = '''||l_check_date ||'''' ;
l_sqls := l_sqls ||' and vehicle_no= '''||l_vehicle_no(h-1) ||'''' ;
l_sqls := l_sqls ||' GROUP BY VEHICLE_NO ' ;
open p_check_dtls for l_sqls;
here i have declared l_sqls as varchar2(5000) and it is working fine.
But in some cases the size l_sqls becomes very large.
In such cases i have to declare it as CLOB.
But when i declare it as clob it is giving the following "compilation error".
"PLS-00382: expression is of wrong type"
any idea pls.
cheers
RRKCheck the documentation: OPEN-FOR Statement:
»A query associated with cursor_variable, which returns a set of values. The query can reference bind variables and PL/SQL variables, parameters, and functions. The syntax of select_statement is similar to the syntax for select_into_statement defined in "SELECT INTO Statement", except that the cursor select_statement cannot have an INTO clause. The length of the dynamic string cannot exceed 32767K.« -
Performance problem with sproc and out parameter ref cursor
Hi
I have sproc with Ref Cursor as an OUT parameter.
It is extremely slow looping over the ResultSet (does it record by record in the fetch).
so I have added setPrefetchRowCount(100) and setPrefetchMemorySize(6000)
pseudo code below:
string sqlSmt = "BEGIN get_tick_data( :v1 , :v2); END;";
Statement* s = connection->createStatement(sqlStmt);
s->setString(1, i1);
// cursor ( f1 , f2, f3 , f4 , i1 ) f for float type and i for interger value.
// 5 columns as part of cursor with 4 columns are having float value and
// 1 column is having int value assuming 40 bytes for one rec.
s->setPrefetchRowCount (100);
s->PrefetchMemorySize(6000);
s->registerOutParam(2,OCCICURSOR);
s->execute();
ResultSet* rs = s->getCursor(2);
while (rs->next()) {
// do, and do v slowly!
}Hi,
I have the same problem. It seems, when retrieving cursor, that "setPrefetchRowCount" is not taking into account by OCCI. If you have a SQL statement like "SELECT STR1, STR2, STR3 FROM TABLE1" that works fine but if your SQL statement is a call to a stored procedure returning a cursor each row fetching need a roudtrip.
To avoid this problem you need to use the method "setDataBuffer" from the object "ResultSet" for each column of your cursor. It's easy to use with INT type and STRING type, a lit bit more complex with DATE type. But until now, I'm not able to do the same thing with REF type.
Below a sample with STRING TYPE (It's assuming that the cursor return only one column of STRING type):
try
l_Statement = m_Connection->createStatement("BEGIN :1 := PACKAGE1.GetCursor1(:2); END;");
l_Statement->registerOutParam(1, oracle::occi::OCCINUMBER, sizeof(l_CodeErreur));
l_Statement->registerOutParam(2, oracle::occi::OCCICURSOR);
l_Statement->executeQuery();
l_CodeErreur = l_Statement->getNumber(1);
if ((int) l_CodeErreur == 0)
char l_ArrayName[5][256];
ub2 l_ArrayNameSize[5];
l_ResultSet = l_Statement->getCursor(2);
l_ResultSet->setDataBuffer(1, l_ArrayName, OCCI_SQLT_STR, sizeof(l_ArrayName[0]), l_ArrayNameSize, NULL, NULL);
while (l_ResultSet->next(5))
for (int i = 0; i < l_ResultSet->getNumArrayRows(); i++)
l_Name = CString(l_ArrayName);
l_Statement->closeResultSet(l_ResultSet);
m_Connection->terminateStatement(l_Statement);
catch (SQLException &p_SQLException)
I hope that sample help you.
Regards -
Problem in opening a ref cursor.
Hi,
I'm getting the following error when i'm trying to open the ref cursor. PL/SQL: ORA-22905: cannot access rows from a non-nested table item
What i'm trying to do is I'm dumping the data into pl/sql table and i want retrieving the by using a ref cursor. Please see the code and help me out.
CREATE OR REPLACE PACKAGE CPS_RECR.pg_pool_status AS
TYPE pool_rec IS RECORD (
status varchar2(50)
,stsno number
,stscode varchar2(5)
,candidatename varchar2(200)
,monyear varchar2(10)
,yyyymm number
,stscnt number
--type rec_sts_tab is table of number ;--index by pls_integer;
type pool_tab IS table of pool_rec index by binary_integer;
type pool_cv is REF CURSOR return pool_rec;
FUNCTION pool_status_query(p_start_date in date,p_end_date in date,p_invitedtopoolbit in number,p_showedForPoolBit in number)
RETURN pool_tab;--pool_cv ;
cursor cur_pool(p_start_date date,p_end_date date,p_invitedtopoolbit number,p_showedForPoolBit number)
is
SELECT distinct to_char(date1,'yyyymm')yearmonth
FROM acs100data a,
acs100_candidate_verification b,
acs100_candidate_pool d
WHERE UPPER (a.basic_email) = UPPER (b.email)
AND (b.candidate_status IN ('FORL', 'FWRT') or BITAND (b.candidate_status_bit, 4 ) > 0
or BITAND (b.candidate_status_bit, 2) > 0)
AND d.pool_id = b.pool_id
AND pool_date BETWEEN p_start_date AND p_end_date
AND is_tentative_date IS NULL ;
cursor cur_name(p_yyyymm varchar2,p_cond number,p_start_date date,p_end_date date)
is
select *
from (select distinct (case
when p_cond = 0 and b.candidate_status = 'FORL'
then (last_name || first_name)
when p_cond = 1 and b.candidate_status = 'FWRT'
then (last_name || first_name)
when p_cond = 2
and bitand (b.candidate_status_bit, p_cond) > 0
then (last_name || first_name)
when p_cond = 4
and bitand (b.candidate_status_bit, p_cond) > 0
then (last_name || first_name)
end
) candidatename
from acs100data a,
acs100_candidate_verification b,
acs100_candidate_pool d
where upper (a.basic_email) = upper (b.email)
and d.pool_id = b.pool_id
and pool_date between p_start_date and p_end_date
and to_char (date1, 'yyyymm') = p_yyyymm
and is_tentative_date is null)
where candidatename is not null;
END pg_pool_status;
CREATE OR REPLACE PACKAGE BODY CPS_RECR.pg_pool_status
AS
FUNCTION pool_status_query (
p_start_date IN DATE,
p_end_date IN DATE,
p_invitedtopoolbit IN NUMBER,
p_showedforpoolbit IN NUMBER
RETURN pool_tab--pool_cv
IS
tab_pool pool_tab;
temp_rf pool_cv;
n_index NUMBER := 1;
--rec_sts_data rec_sts_tab;
n_stscnt NUMBER;
vc_status VARCHAR2 (100);
vc_label varchar2(1000);
vc_name varchar2(100);
BEGIN
tab_pool.DELETE;
vc_label :='Opening Pool cursor';
FOR rec_pool IN cur_pool (p_start_date,
p_end_date,
p_invitedtopoolbit,
p_showedforpoolbit
LOOP
if cur_pool%notfound then
exit;
end if;
vc_label :='Opening p_cond cursor';
FOR p_cond IN 0 .. 3
LOOP
n_stscnt := 0;
vc_status := NULL;
begin
SELECT SUM
(NVL
(COUNT
(CASE
WHEN p_cond = 0
AND b.candidate_status = 'FORL'
THEN (last_name || first_name)
WHEN p_cond = 1
AND b.candidate_status = 'FWRT'
THEN (last_name || first_name)
WHEN p_cond = 2
AND BITAND (b.candidate_status_bit,
p_cond) > 0
THEN (last_name || first_name)
WHEN p_cond = 4
AND BITAND (b.candidate_status_bit,
p_cond) > 0
THEN (last_name || first_name)
END
0
) cnt,
DECODE (p_cond,
0, 'FAILED WRITTEN TEST',
1, 'FAILED **** TEST',
2, 'Invited for Pool',
4, 'Showed up for Pool'
) status
INTO n_stscnt,
vc_status
FROM acs100data a,
acs100_candidate_verification b,
acs100_candidate_pool d
WHERE UPPER (a.basic_email) = UPPER (b.email)
AND d.pool_id = b.pool_id
AND pool_date BETWEEN p_start_date AND p_end_date
AND TO_CHAR (date1, 'yyyymm') = rec_pool.yearmonth
AND is_tentative_date IS NULL
GROUP BY candidate_status,
b.candidate_status_bit,
DECODE (p_cond,
0, 'FAILED WRITTEN TEST',
1, 'FAILED **** TEST',
2, 'Invited for Pool',
4, 'Showed up for Pool'
exception
when no_data_found
then
n_stscnt :=0;
vc_status :=null;
end;
vc_label :='Opening name cursor';
FOR rec_name IN cur_name (rec_pool.yearmonth,
p_cond,
p_start_date,
p_end_date
LOOP
if cur_name%notfound then
exit;
end if;
tab_pool (n_index).yyyymm := rec_pool.yearmonth;
tab_pool (n_index).stscnt := n_stscnt;
tab_pool (n_index).status := vc_status;
tab_pool (n_index).candidatename := rec_name.candidatename;
dbms_output.put_line('tab_pool(n_index).yyyymm : '||tab_pool(n_index).yyyymm);
dbms_output.put_line('tab_pool(n_index).stscnt : '||tab_pool(n_index).stscnt);
dbms_output.put_line('tab_pool(n_index).status : '||tab_pool(n_index).status);
dbms_output.put_line('tab_pool(n_index).candidatename : '||tab_pool(n_index).candidatename);
vc_name :=rec_name.candidatename;
END LOOP;
n_index := n_index + 1;
END LOOP;
END LOOP;
RETURN tab_pool;
exception
when others
then
dbms_output.put_line('error :'||vc_label||'--'|| vc_name);
END;
END pg_pool_status;
---run script
DECLARE
RetVal CPS_RECR.PG_POOL_STATUS.pool_tab;
P_START_DATE DATE;
P_END_DATE DATE;
P_INVITEDTOPOOLBIT NUMBER;
P_SHOWEDFORPOOLBIT NUMBER;
temp_cv CPS_RECR.PG_POOL_STATUS.pool_cv;
BEGIN
P_START_DATE := to_date('09/01/2008','mm/dd/yyyy');
P_END_DATE := to_date('09/30/2008','mm/dd/yyyy');
P_INVITEDTOPOOLBIT := 2;
P_SHOWEDFORPOOLBIT := 4;
open temp_cv for select * from table((CPS_RECR.PG_POOL_STATUS.POOL_STATUS_QUERY ( P_START_DATE, P_END_DATE, P_INVITEDTOPOOLBIT, P_SHOWEDFORPOOLBIT )) );
end loop;
exception
when others
then
dbms_output.put_line(sqlerrm);
END;Satyaki,
It doesn't help me out. I'm worndering one of code sample is working fine. i didn't my current is giving the problem.
FYI, please see the some code i followed.
SQL> Create or replace PACKAGE cv IS
2 type comp_rec is RECORD
3 (deptno number,
4 ename varchar(10),
5 compensation number);
6 type comp_tbl IS table of comp_rec;
7 function get_coll return comp_tbl pipelined;
8 temp_tbl comp_tbl := comp_tbl();
9 type comp_cv is REF CURSOR return comp_rec;
10 end;
11 /
Package created.
SQL> Create or replace PACKAGE body cv IS
2 function get_coll return comp_tbl pipelined
3 is
4 begin
5 for i in 1..temp_tbl.count loop
6 pipe row(temp_tbl(i));
7 end loop;
8 return;
9 end;
10 end;
11 /
Package body created.
SQL> declare
2 temp_cv cv.comp_cv;
3 rc cv.comp_rec;
4 begin
5 cv.temp_tbl.delete;
6 cv.temp_tbl.extend;
7 cv.temp_tbl(1).deptno:=10;
8 cv.temp_tbl(1).ename:='1223';
9 cv.temp_tbl(1).compensation:=10;
10
11 -- erroring out
12 open temp_cv for select * from table(cv.get_coll);
13 fetch temp_cv into rc;
14 dbms_output.put_line('Deptno is ' || rc.deptno);
15 dbms_output.put_line('ename is ' || rc.ename);
16 end;
17 /
Deptno is 10
ename is 1223
PL/SQL procedure successfully completed. -
Problem in passing ref cursor values as parameter in where clau.Most Urgent
Problem:
1) I have used normal cursor (C_hubmsgid_set) with some select statement such as grouping and all.
After executing the query it will return some resultset to the specified cursor.
2) I am trying to use another cursor which is ref cursor but the problem is
I want to give all the resultset based on all the conditions to the ref cursor.
But the cursor will get only the last record due to overwriting .how to get all
the result set in a ref cursor like
cursor c1 is select .....
loop
open refcursor for
Select * from ....where condition
end loop
After this the refcursor( p_sysaudithistory_cur) which should have all the resultset matched by the where condition.
3. It should be java compatible one.
4. I am not able to match cursor row = IN Pameter value
Below is the query:
CREATE OR REPLACE PROCEDURE SP_TEST_audit_history2 (
p_start IN date,
p_end IN date,
p_msgcode IN varchar2,
p_partnername IN varchar2,
p_status IN varchar2,
p_locationname IN varchar2,
p_custbusunit IN varchar2,
p_sysaudithistory_cur OUT plutotypes.ref_cursor,
p_status1 OUT NUMBER) AS
l_status NUMBER := 0;
CURSOR C_hubmsgid_set IS
SELECT DISTINCT MAX(tfm.datetime) datetime, tfm.hubmsgid
FROM tfm_status tfm, vw_msgcode_part_locn vw
WHERE
tfm.datetime >= NVL(p_start, TO_DATE('01/01/1981','DD/MM/YYYY')) AND
tfm.datetime <= NVL(p_end, TO_DATE('31/12/9999','DD/MM/YYYY')) AND
tfm.msgcode LIKE NVL(p_msgcode,'%') AND
vw.msgcode = tfm.msgcode
AND vw.partnername LIKE NVL(p_partnername,'%')
AND tfm.status LIKE NVL(p_status,'%')
AND vw.locationname LIKE NVL(p_locationname,'%')
AND vw.custbusunit LIKE NVL(p_custbusunit,'%')
AND rownum < 250
GROUP BY tfm.hubmsgid
ORDER BY datetime DESC;
/* Loop through the Cursor */
BEGIN
BEGIN
OPEN p_sysaudithistory_cur
FOR
SELECT
tfm.hubmsgid ,
tfm.status || '-'|| nvl2(tfm.exception_id,'FAILED','OK') ,
tfm.datetime,
tfm.exception_id
FROM tfm_status tfm
WHERE tfm.hubmsgid = c_hubmsgids.hubmsgid /* here only i am getting error*/
AND tfm.datetime = c_hubmsgids.datetime
AND tfm.status like NVL(p_status,'%')
and rownum =1;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
l_status := 1;
END;
p_status1 := l_status;
END;
Thanks in advance
prasanth a.s.Please don't post duplicate questions. All it does is clutter the forums and result in fragmented threads and duplicate responses. Please see my response in the original thread at the link below.
Please solve this Refcursor issue PLEASE -
Problem with accepting the Ref Cursor in c# program
I am passing an argument as OUT Ref Cursor in a stored procedure. and calling the procedure from my c# program.
I can connect the database successfully but am getting the error on calling the procedure.
I am using the ODBC connection
My procedure's signatures are like:
CREATE OR REPLACE PACKAGE BODY packageName
IS
PROCEDURE GetOutput(returnCursor OUT Sys_RefCursor)
AS
BEGIN
OPEN returnCursor FOR
<<my select statement>>
END GetOutput;
END packageName;
My function call is like:
CString Extract::ExtractScript() const
CString script;
script.Format("{Call %s.%s()}", packageName,GetOutput);
return script;
I can compile the procedure successfully on Toad but while calling the procedure from the C# program it gives following error
Connection Successful
Problem executing SQL {Call packageName.GetOutput()}...
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'GetOutput'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
Message was edited by:
user653288Hi Aga,
Thanks for your response.
I figured out the problem.
I was using the ODBC connection which wasnt updated for Oracle 10g.
I have updated that. Now its working fine.
Thanks again
Regards -
Problem passing REF CURSOR to JAVA STORED PROCEDURE
Hi,
I've written a small Java class with a static method and
imported that into Oracle 8i. The method expects a
java.sql.ResultSet object as parameter. According to the
documentation of Oracle, a REF CURSOR (cursor variable) maps to
java.sql.ResultSet in JDBC.
The definition of the Java Stored Procedure was accepted without
problems:
CREATE OR REPLACE PROCEDURE RESULTSETPASSINGTESTPROC (row
WASTypes.GenericCurType)
as language java
name 'sqlj.ResultSetPassingTest.testResultSetPassing
(java.sql.ResultSet)';
WASTypes is a package containing the definition of the generic
cursor:
CREATE OR REPLACE PACKAGE WASTYPES
is
TYPE GenericCurType IS REF CURSOR;
END WASTypes;
In a function I'm opening the cursor via
'Open cursorVariable for sqlStatement';
Then this cursor variable is passed to the java method and the
error ORA-03113 is shown.
I tried to solve the problem by changing the type of the
parameter to oracle.sql.REF without success.
Does anybody know what wents wrong?
Thanks in advance.
JanHi,
I've written a small Java class with a static method and
imported that into Oracle 8i. The method expects a
java.sql.ResultSet object as parameter. According to the
documentation of Oracle, a REF CURSOR (cursor variable) maps to
java.sql.ResultSet in JDBC.
The definition of the Java Stored Procedure was accepted without
problems:
CREATE OR REPLACE PROCEDURE RESULTSETPASSINGTESTPROC (row
WASTypes.GenericCurType)
as language java
name 'sqlj.ResultSetPassingTest.testResultSetPassing
(java.sql.ResultSet)';
WASTypes is a package containing the definition of the generic
cursor:
CREATE OR REPLACE PACKAGE WASTYPES
is
TYPE GenericCurType IS REF CURSOR;
END WASTypes;
In a function I'm opening the cursor via
'Open cursorVariable for sqlStatement';
Then this cursor variable is passed to the java method and the
error ORA-03113 is shown.
I tried to solve the problem by changing the type of the
parameter to oracle.sql.REF without success.
Does anybody know what wents wrong?
Thanks in advance.
Jan -
Problem declaring and using a REF CURSOR
I'm having a real problem using a REF CURSOR type
Here's the DECLARE and the start of the BEGIN I've so far developed.
DECLARE
TYPE r1 IS RECORD (
szvcapc_pidm szvcapc.szvcapc_pidm%TYPE,
szvcapc_term_code szvcapc.szvcapc_term_code%TYPE,
szvcapc_request_no szvcapc.szvcapc_request_no%TYPE);
szvcapc_rec r1;
TYPE cursor_1 IS REF CURSOR RETURN r1;
szvcapc_cv cursor_1;
TYPE r2 IS RECORD (
stvests_code stvests.stvests_code%TYPE
stvests_rec r2;
TYPE cursor_2 IS REF CURSOR RETURN stvests_rec;
stvests_cv cursor_2;
BEGIN
OPEN szvcapc_cv FOR
SELECT szvcapc_pidm, szvcapc_term_code, szvcapc_request_no
FROM szvcapc
WHERE szvcapc_passed_ind = 'Y'
AND szvcapc_award_credits = 'N';
LOOP
FETCH szvcapc_cv INTO szvcapc_rec;
EXIT WHEN szvcapc_cv%NOTFOUND;
END LOOP;
OPEN stvests_cv FOR
SELECT stvests_code
FROM stvests
WHERE stvests_eff_headcount = 'Y';
LOOP
FETCH stvests_cv INTO stvests_rec;
EXIT WHEN stvests_cv%NOTFOUND;
END LOOP;
SELECT *
FROM (
<snip>
INNER JOIN stvests_rec
ON SFBETRM.SFBETRM_ESTS_CODE = stvests_rec.STVESTS_CODE
<snip>
I later try to use the stvests_rec and szvcapc_rec in the main SELECT statement it doesn't recognise stvests_rec and szvcapc_rec as a "Table or View".
I have to use a REF CURSOR as this code is ultimately for use in Oracle Reports.
What am I doing wrong?> The reason I'm trying to use a REF CURSOR is that I was told that you
couldn't use CURSORs in Oracle Reports.
That does not change anything ito what happens on the Oracle server side. A cursor is a cursor is a cursor.
Every single SQL winds up as a cursor. Each cursor has a reference handle to access and use. HOW this handle is used in the language differs. But that is a language issue and not an Oracle RDBMS issue.
For example. An EXECUTE IMMEDIATE in PL/SQL creates a cursor handle and destroys it after use - automatically. An implicit cursor works the same. An explicit cursor you have the handle fetch from it and close from it when done.
A ref cursor is simply a handle that can be returned to an external client - allowing that application to use the handle to fetch the rows.
Do not think that a ref cursor is any different from the RDBMS side than any other cursor. The RDBMS does not know the difference. Does not care and nor should it.
> I'm trying to reduce the hits on the database from nested selects by
removing the dataset from the main SELECT statement and performing it only
once outside and then referencing this previously collected dataset inside the
main SELECT statement.
Good stuff that you are considering SQL performance. But you need to make sure that you
a) identify the performance inhibitor issue correctly
b) address this issue correctly
And you need to do that within SQL. Not PL/SQL. PL/SQL will always be slower at crunching data than SQL. For example, wanting to cache the data somehow to reduce the read overhead - that is exactly what the DB buffer cache does. It caches data. That is also exactly what the CBO will attempt - reduce the amount of data that needs to be read and processed.
Not saying that the RDBMS can do it all. It needs help from you - in the form of a SQL that instructs it to process only the minimum amount of data required to get the required results. In the form of a sound physical design that provides optimal usage of data storage and access (like indexing, partitioning, clustering, etc).
Bottom line - you cannot use a REF CURSOR to make a SQL go faster. A REF CURSOR is simply a cursor in the SQL Engine. A cursor is nothing but the "compiled-and-executable" code of a SQL "source program". -
Problem using REF CURSOR in JDBC
i have several stored procedures and functions that return REF CURSOR object as output. however, i'm noticing that if
no rows are returned within the cursor, the JDBC driver is throwing a "No more data to read from socket" exception.
i'm using the Oracle Thin JDBC driver v8.1.6 for JDK 1.2.
any help is appreciated.
thanks,
gary
nullI am not able to reproduce the problem. Could you post a testcase so that we can follow it up?
Thanks. -
I have a procedure which is using one ref cursor as OUT paramater. Now when I call this procedure, it gives me the following error:
ORA-00932: inconsistent datatypes: expected CURSER got NUMBER
ORA-06512: at "APPS.ORDER_RETURN1", line 8
ORA-06512: at "APPS.ORDER_RETURN2", line 4
ORA-06512: at line 1
Below is my code
PROCEDURE ORDER_RETURN1(p_order OUT sys_refcursor) IS
TYPE OE_ORDER_rcur IS REF CURSOR;
rcur OE_ORDER_rcur;
BEGIN
OPEN rcur FOR
SELECT ORDER_NUMBER FROM OE_ORDER_HEADERS_ALL WHERE ROWNUM < 4;
FETCH rcur INTO p_order;
CLOSE rcur;
END ORDER_RETURN1;
PROCEDURE ORDER_RETURN2 IS
OE_ORDER_rcur11 sys_refcursor;
BEGIN
ORDER_RETURN1(OE_ORDER_rcur11);
end;
I tried to call proc ORDER_RETURN1 with the help of proc ORDER_RETURN2, but no change, it gives me same error if i call the first proc ORDER_RETURN1 or i call ORDER_RETURN2.
I am stuck with this problem, I had used ref cursor in procedure but not able to call the procedure which uses ref cursor as OUT parameter.
Please help me to resolve this.
Thanks
Nidhi..Check out this
SQL>VARIABLE X REFCURSOR
SQL>CREATE OR REPLACE PROCEDURE ORDER_RETURN1(p_order OUT sys_refcursor) IS
2 BEGIN
3 OPEN p_order FOR
4 SELECT OBJECT_ID FROM ALL_OBJECTS WHERE ROWNUM < 4;
5 END ORDER_RETURN1;
6 /
Procedure created.
SQL>EXEC ORDER_RETURN1(:X)
PL/SQL procedure successfully completed.
SQL>PRINT X
OBJECT_ID
4
39
30
SQL>Regards
Arun -
Problem with XSU when trying to execute pl/sql package returning ref cursor
Hi,
I'm exploring xsu with 8i database.
I tried running sample program which I took from oracle
documentation. Here is the details of these.
------create package returning ref cursor---
CREATE OR REPLACE package testRef is
Type empRef IS REF CURSOR;
function testRefCur return empRef;
End;
CREATE OR REPLACE package body testRef is
function testRefCur RETURN empREF is
a empREF;
begin
OPEN a FOR select * from emp;
return a;
end;
end;
---------package successfully created-----
Now I use java program to generate xml data from ref cursor
------------java program ----------
import org.w3c.dom.*;
import oracle.xml.parser.v2.*;
import java.sql.*;
import oracle.jdbc.driver.*;
import oracle.xml.sql.query.OracleXMLQuery;
import java.io.*;
public class REFCURt
public static void main(String[] argv)
throws SQLException
String str = null;
Connection conn = getConnection("scott","tiger"); //
create connection
// Create a ResultSet object by calling the PL/SQL function
CallableStatement stmt =
conn.prepareCall("begin ? := testRef.testRefCur();
end;");
stmt.registerOutParameter(1,OracleTypes.CURSOR); // set
the define type
stmt.execute(); // Execute the statement.
ResultSet rset = (ResultSet)stmt.getObject(1); // Get the
ResultSet
OracleXMLQuery qry = new OracleXMLQuery(conn,rset); //
prepare Query class
try
qry.setRaiseNoRowsException(true);
qry.setRaiseException(true);
qry.keepCursorState(true); // set options (keep the
cursor alive..
System.out.println("..before printing...");
while ((str = qry.getXMLString())!= null)
System.out.println(str);
catch(oracle.xml.sql.OracleXMLSQLNoRowsException ex)
System.out.println(" END OF OUTPUT ");
qry.close(); // close the query..!
// qry.close(); // close the query..!
// Note since we supplied the statement and resultset,
closing the
// OracleXMLquery instance will not close these. We would
need to
// explicitly close this ourselves..!
stmt.close();
conn.close();
// Get the connection given the user name and password..!
private static Connection getConnection(String user, String
passwd)
throws SQLException
DriverManager.registerDriver(new
oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@xxxx:1521:yyyy",user,passwd);
return conn;
when I ran the program after successful compilation,I got the
following error
==========
Exception in thread "main" oracle.xml.sql.OracleXMLSQLException:
1
at oracle.xml.sql.core.OracleXMLConvert.getXML(Compiled
Code)
at oracle.xml.sql.query.OracleXMLQuery.getXMLString
(OracleXMLQuery.java:263)
at oracle.xml.sql.query.OracleXMLQuery.getXMLString
(OracleXMLQuery.java:217)
at oracle.xml.sql.query.OracleXMLQuery.getXMLString
(OracleXMLQuery.java:194)
at REFCURt.main(Compiled Code)
============================
Can anybody tell me why I'm getting this error.Am I missing any
settings?
thanksWe are using 8.1.7 Oracle db with latest xdk loaded.
am I missing any settings?
Maybe you are looking for
-
Hi I am created Depo SO-> Depot Delivery. Now i am doing J1IJ against Depot Delivery, i am not able to see the Excise duties for Excise Invoice. While MIGO Incoming excise invoice created & it has excise Duties. any config missing? Reg, Antaa21
-
Powering Down HP Photosmart Premium C309g-m
Product: HP Photosmart Premium C309g-m Operating System: Windows 7 64-bit No Error Message I Use my HP Photosmart Premium C309g-m printer or scanner and when I'm finished I go to power down or shut down the printer it will not respond. After several
-
Regarding Converting file from UTF-8 encoding to ANSI
Hi Experts! I have a problem that my given file is in encoding UTF-8 and i have to convert it into ANSI first so that i can use my bdc session to upload the file. Kindly if you can help me out with that.If there is any fm available to do that. thanks
-
More XMP questions / filtering on edit settings
alright, i've imported one or two of my old CS projects into LR1.0. now i have a couple of questions. in CS, i used sidecar XMP files, both as a way to avoid the mystery of the photoshop database, and to future proof myself for when something like LR
-
Sha256 - how to do this javascript in ABAP. Is it possible?
Hello, I would like to use the amazon product advertising api. For this my requests need to be "signed". In an example I found the following javaScript for signing requests: function sign(secret, message) { var messageBytes = str2binb(mes