join a Ref cursor to a table
Hello all;Can you please show me a simple example on how to join a Ref cursor to a table, because I have a function that returns a Ref Cursor and I want to call this function in another function (B) and then he join a table in this function (B)
How do I join a Ref cursor to a table
I can do on my 11 GR 2
SQL> declare
c sys_refcursor;
l_ename emp.ename%type;
begin
open c for
select * from dept where loc = 'DALLAS';
select ename
into l_ename
from emp, xmltable ('ROWSET/ROW' passing xmltype (c) columns deptno number path 'DEPTNO') x
where emp.deptno = x.deptno
and rownum = 1;
dbms_output.put_line (l_ename);
end;
/
SCOTT
PL/SQL procedure successfully completed.
Tags: Database
Similar Questions
-
How to perform procedures with REF CURSOR &; PLSQL settings table in SQL Dev?
I have 3 SQL Developer. I create a procedure with a set of tables/PL/SQL as an input parameter and a SYS_REFCURSOR as output parameter.
When I press the green arrow (Run button) block the dialog box run PL/SQL PL/SQL has no place at the PL/SQL table with records of entry and also to see the output of the SYS_REFCURSOR.
I get the error ORA-06550 and many other errors when I run the present.
How to do this please?In the debug code, lose the ABS. Prefix the SYS_REFCURSOR QC_SQL_DEVELOPER_TEST.
Also, do not use same name of your settings on your bind variable (so e.g.: OUT_REF_CURSOR).
REF CURSOR is supported output types, so you will get the output of their share in the output tab.
However the output system does not recognize your own types as your PL/SQL table. You need to write an exit procedure yourself, indexing correctly, using the DBMS_OUTPUT.Have fun
K. -
help how to extract the ref cursor in the table field
Hello.
I have a query similar to the following:
Expecting to get several lines, I want this select this option to be in bulk sampled in a table variable nested (of another type of nested table) which is copied to an out parameter in a procedure. I have some doubts:select department_id, cursor (select employee_id from employees where department_id = d.department_id) from departments d
1 should. what I create the column in the inner nested table that will keep the result of the ref cursor? Ref cursor colunm? A sort of column Adrien?
2. If the column in the nested table inside that will keep the result of the ref cursor is another array, how can I write the result of the entire query in a single volume?
(I want to bulk collect everything in a single query, I know how to do with pl/sql do not inflate but using two nested for loops, that's what I try to avoid).
Thanks in advance.It would be simpler:
declare type dep_emp_list_tbl_type is table of sys.OdciVarchar2List; v_dep_emp_list_tbl dep_emp_list_tbl_type; v_dep_id_tbl sys.OdciNumberList; begin select department_id, cast(multiset(select employee_id from hr.employees where department_id = d.department_id) as sys.OdciVarchar2List) bulk collect into v_dep_id_tbl,v_dep_emp_list_tbl from hr.departments d; end; /
SY.
-
How to start the view off of the ref cursor Oracle as input/output param
Hello world
We use JDev 11.1.2.3 WL 10.3.6 and Java 7.
We are at the beginning of our transition from Oracle Forms to ADF. We have a very large forms that uses many store procedures that have IN/OUT ref Cursor parameters and tables plsql. I tried to find information on best practices to achieve, but only seemed to find tutorials on SEO of the Oracle ref Cursor return functions. I hope we don't have to rewrite our code of database to work with ADF.
This is an example of a proc currently a block on a form based on directly
The ref cursor parameter is input/output to satisfy the way the form handles this type of paradigm.
ADF we want I hope to reuse these procs existing (without the need to wrap/overload them) on the basis of the display objects.
Example:
/ * my record type which houses the information I want to go back * /.
TYPE rec_hist_vacpac_status IS RECORD)
rec_order NUMBER (5),
rec_rownum NUMBER (5),
return_column SAM_VACPAC.vacpac_status%TYPE,
rec_login_id SAM_VACPAC.ins_user%TYPE,
status_date SAM_VACPAC.status_date%TYPE
);
/ * Sets the ref cursor type * /.
TYPE lcur_hist_vacpac_status IS REF CURSOR;
/ * This is a procedure that would take some info link go / return
Return the ref cursor of this information as an in / out * /.
PROCEDURE prc_myinfo_refcur)
pnum_identify_seq_id in NUMBERS
pcur_myinfo IN OUT lcur_hist_vacpac_status);
Can anyone point me in the right direction on documentation on this?
Thank you!
Hi Cemerson:
See this example:
- 1. create a TYPE as an object
CREATE OR REPLACE
TYPE GOTYOB_EQUI
AS AN OBJECT
(
CDELEM VARCHAR2 (50).
TIELEM VARCHAR2 (2)
);
- 2. create a TABLE TYPE AS
CREATE OR REPLACE
TYPE GOTYTA_EQUI
AS THE GOTYOB_EQUI TABLE;
- 3 create a function, it returns the TYPE of the TABLE
FUNCTION fn_equiposarriba)
pa_cdelem IN VARCHAR2,
pa_nucomp in NUMBERS
pa_anperi in NUMBERS
pa_meperi in NUMBERS
)
Gotyta_equi RETURN PIPELINED IS
CURSOR trae_equimani (va_cdelem VARCHAR2) IS
SELECT cdelem, tielem, cdelempadr,
(SELECT cdequi
Of evm_alim
WHERE anperi = eq.anperi
AND meperi = eq.meperi
AND nucomp = eq.nucomp
AND cdalim = eq.cdalim) cdalim
Of evm_equimani eq
WHERE anperi = pa_anperi
AND meperi = pa_meperi
AND nucomp = pa_nucomp
AND cdelem = va_cdelem
AND cdelempadr <> cdelem
AND tielem <> 'A ';
equimani trae_equimani % ROWTYPE;
va_cdalim VARCHAR2 (100);
BEGIN
-Loading los equipos aguas arriba
WHILE equimani.cdelempadr IS NOT NULL LOOP
OPEN trae_equimani (equimani.cdelempadr);
equimani: = NULL;
SEEK trae_equimani INTO equimani;
CLOSE Trae_equimani;
IF equimani.cdelem IS NOT NULL THEN
PIPE ROW (gotyob_equi (equimani.cdelem, equimani.tielem));
END IF;
END LOOP;
RETURN;
END;
- 4 SQL Query with the help of the function... you can use this SQL in a display object
SELECT
*
Of
TABLE (gopq_eventos.fn_equiposarriba (' F-SCZ-043-103', '))
1,
2013,
6
)
)
Best regards, Marcelo
-
Join of two tables or more in a Ref Cursor columns
Hi all
I try to display data columns from two different tables in a cursor.
Here is the code I am trying...
How can this be achieved?DECLARE v_dname VARCHAR2(100); v_query VARCHAR2(4000); TYPE ref_cur IS REF CURSOR; v_ref ref_cur; d_cname VARCHAR2(100); d_salary NUMBER; --v_dname VARCHAR2(100); BEGIN SELECT dname INTO v_dname FROM dept WHERE deptno = 20; v_query := 'SELECT v_dname, a.* FROM customer a '; OPEN v_ref FOR v_query; LOOP FETCH v_ref INTO v_dname, d_cname, d_salary; EXIT WHEN v_ref%notfound; dbms_output.put_line(v_dname||' '|| d_cname||' '|| d_salary); END LOOP; END; / I'm trying to get the output as below RESEARCH Dave 9000 RESEARCH Amy 10000 RESEARCH Anita 11000 RESEARCH Bob 12000 RESEARCH Marwin 5000 RESEARCH Shawn 12000 RESEARCH chris 8000 RESEARCH Henrik 14000 RESEARCH Tricia 7000 RESEARCH Nita 9000
Thank you.
Published by: polasa on October 31, 2008 10:25polasa wrote:
I'm v_dname as invalid identifier.Using the code of origin you have validated, right? This is because you are using dynamic SQL statements where you shouldn't be (the local variable v_dname does not exist under your dynamic SQL is running in).
Justin
-
How to create a Ref cursor table
I have a proc that returns a Ref Cursor, what is the easiest way to create a table based on the return of the ref cursor?
declare
type rc is ref cursor;
p_data rc;
Start
call_my_proc (p_data);
: result: = p_data; ((- If I run this in TOAD I can see the data here, but I want to create a table based on it rather than showing)
end;
Thank you.
Edit: sorry. typed this wrong, first time, should be right nowI recommend you read this first... {: identifier of the thread = 886365}
and then you'll have a better idea of how to make to create a table in your query.
-
using plsql table and ref cursor in oracle's 10 g
Hi all
Can someone give me an example of a scenario where we need to create a form manually based on a stored database procedure.
And in this process, I created a pl/sql table and a Ref cursor at the database level.
CREATE OR REPLACE PACKAGE SCOTT. TYPE BONUS_PKG IS bonus_rec
IS (RECORD
EmpNo bonus_EMP.empno%TYPE,
Ename bonus_EMP.ename%TYPE,
employment bonus_EMP.job%TYPE,
SAL bonus_EMP.sal%TYPE,
Comm bonus_EMP.comm%TYPE);
TYPE b_cursor IS REF CURSOR RETURN bonus_rec;
TYPE bontab IS TABLE OF bonus_rec INDEX DIRECTORY.
PROCEDURE bonus_refcur (bonus_data IN OUT b_cursor);
PROCEDURE bonus_query (bonus_data IN OUT bontab);
END bonus_pkg;
CREATE OR REPLACE PACKAGE BODY SCOTT. BONUS_PKG IS
PROCEDURE bonus_query (bonus_data IN OUT bontab) IS
II NUMBER;
CURSOR bonselect IS
SELECT empno, ename, job, sal, comm bonus_EMP ORDER BY empno;
BEGIN
OPEN bonselect.
II: = 1;
LOOP
Look FOR bonselect IN
.EmpNo bonus_data (ii),
.ename bonus_data (ii),
.job bonus_data (ii),
.Sal bonus_data (ii),
.comm bonus_data (ii);
EXIT WHEN bonselect % NOTFOUND;
II: = ii + 1;
END LOOP;
END bonus_query;
PROCEDURE bonus_refcur (bonus_data IN OUT b_cursor) IS
BEGIN
Bonus_data OPEN to SELECT empno, ename, job, sal, comm bonus_EMP ORDER BY empno;
END bonus_refcur;
END bonus_pkg;
I want to fill in the data in the forms manually is not using Forms data block Wizard and by program.
Please answer...Can someone give me an example of a scenario where we need to create a form manually based on a stored database procedure.
In general, you will use a block of proceedings based when you have a collection of data from several tables presented in a form and your username must be able to update the information displayed.
In your sample code, looks like you are using Oracle Support document "Melting a block on a Stored Procedure - examples of Code [ID 66887.1]". If this is the case, continue to follow the document - it guides you through all the steps. There is no need to manually configure things that the data block Wizard will work for you!
I want to fill in the data in the forms manually is not using Forms data block Wizard and by program.
Why? Let the wizard block configuration data of your block based on a procedure for you. There is no need to manually browse the data! I did what you're trying, and it's more work needed. Leave forms to do the work for you. :)
If you absolutely have to do things manually, I recommend that you use the PROCEDURE bonus_query (bonus_data IN OUT bontab) instead of bonus_refcur (bonus_data IN OUT b_cursor) . Then, in your code create a variable of type BONTAB, and then call the bonus_query procedure. Then, it's a simple case of a loop in the table of records returned by the bonus_query procedure. For example:
DECLARE t_bonus bonus_pkb.bontab; BEGIN bonus_pkg.bonus_query(t_bonus); FOR i in 1 .. t_bonus.count LOOP :YOUR_BLOCK.EMPLOYEE_NUMBER := t_bonus(i).empno; :YOUR_BLOCK.EMPLOYEE_NAME := t_bonus(i).ename; :YOUR_BLOCK.EMPLOYEE_JOB := t_bonus(i).job; :YOUR_BLOCK.EMPLOYEE_SALARY := t_bonus(i).sal; :YOUR_BLOCK.EMPLOYEE_COMMISSION := t_bonus(i).comm; END LOOP; END;
This code example shows the basics, but as is the sample code - you will need to adapt to your situation.
Also, I highly recommend that you look at the article inol listed. It is a very thorough debate on the REF CURSOR. If you have set up using a procedure based on the data source - it is more effective to spend the record table to your form that it must pass a ref cursor Using a ref cursor, you might as well just using a standard called cursor and loops on your named cursor. The effect is the same (a line returned at the same time creating lots of network traffic). Using the table of records is more efficient because the data set is returned if the network traffic is reduced.
Hope this helps,
Craig B-)If someone useful or appropriate, please mark accordingly.
-
Converts the ref cursor effect of function table
I have a function named fn_get_emp(), whose return type is sys_refcursor. When I select fn_get_emp of double; I get the output to the format of the cursor. I want to convert to the table like format so that I can use in my insert statements insert into foo select * from fn_get_emp();
Please note that the columns in the output of the fn_get_emp() is not fixed.
Published by: user10566312 on January 30, 2012 22:25Here are the steps in the package DBMS_SQL, you need to turn your Ref Cursor a cursor DBMS_SQL.
http://docs.Oracle.com/CD/E11882_01/AppDev.112/e25788/d_sql.htm#CHDJDGDG
and then the rest of the documentation of the DBMS_SQL package gives many examples of how to treat this a cursor dbms_sql.
Here is an example to use the package dbms_sql to process a request and produce some projection of sql and the database is in the query to CSV file...
As user sys:
CREATE OR REPLACE DIRECTORY TEST_DIR AS '\tmp\myfiles' / GRANT READ, WRITE ON DIRECTORY TEST_DIR TO myuser /
As myuser:
CREATE OR REPLACE PROCEDURE run_query(p_sql IN VARCHAR2 ,p_dir IN VARCHAR2 ,p_header_file IN VARCHAR2 ,p_data_file IN VARCHAR2 := NULL) IS v_finaltxt VARCHAR2(4000); v_v_val VARCHAR2(4000); v_n_val NUMBER; v_d_val DATE; v_ret NUMBER; c NUMBER; d NUMBER; col_cnt INTEGER; f BOOLEAN; rec_tab DBMS_SQL.DESC_TAB; col_num NUMBER; v_fh UTL_FILE.FILE_TYPE; v_samefile BOOLEAN := (NVL(p_data_file,p_header_file) = p_header_file); BEGIN c := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(c, p_sql, DBMS_SQL.NATIVE); d := DBMS_SQL.EXECUTE(c); DBMS_SQL.DESCRIBE_COLUMNS(c, col_cnt, rec_tab); FOR j in 1..col_cnt LOOP CASE rec_tab(j).col_type WHEN 1 THEN DBMS_SQL.DEFINE_COLUMN(c,j,v_v_val,2000); WHEN 2 THEN DBMS_SQL.DEFINE_COLUMN(c,j,v_n_val); WHEN 12 THEN DBMS_SQL.DEFINE_COLUMN(c,j,v_d_val); ELSE DBMS_SQL.DEFINE_COLUMN(c,j,v_v_val,2000); END CASE; END LOOP; -- This part outputs the HEADER v_fh := UTL_FILE.FOPEN(upper(p_dir),p_header_file,'w',32767); FOR j in 1..col_cnt LOOP v_finaltxt := ltrim(v_finaltxt||','||lower(rec_tab(j).col_name),','); END LOOP; -- DBMS_OUTPUT.PUT_LINE(v_finaltxt); UTL_FILE.PUT_LINE(v_fh, v_finaltxt); IF NOT v_samefile THEN UTL_FILE.FCLOSE(v_fh); END IF; -- -- This part outputs the DATA IF NOT v_samefile THEN v_fh := UTL_FILE.FOPEN(upper(p_dir),p_data_file,'w',32767); END IF; LOOP v_ret := DBMS_SQL.FETCH_ROWS(c); EXIT WHEN v_ret = 0; v_finaltxt := NULL; FOR j in 1..col_cnt LOOP CASE rec_tab(j).col_type WHEN 1 THEN DBMS_SQL.COLUMN_VALUE(c,j,v_v_val); v_finaltxt := ltrim(v_finaltxt||',"'||v_v_val||'"',','); WHEN 2 THEN DBMS_SQL.COLUMN_VALUE(c,j,v_n_val); v_finaltxt := ltrim(v_finaltxt||','||v_n_val,','); WHEN 12 THEN DBMS_SQL.COLUMN_VALUE(c,j,v_d_val); v_finaltxt := ltrim(v_finaltxt||','||to_char(v_d_val,'DD/MM/YYYY HH24:MI:SS'),','); ELSE v_finaltxt := ltrim(v_finaltxt||',"'||v_v_val||'"',','); END CASE; END LOOP; -- DBMS_OUTPUT.PUT_LINE(v_finaltxt); UTL_FILE.PUT_LINE(v_fh, v_finaltxt); END LOOP; UTL_FILE.FCLOSE(v_fh); DBMS_SQL.CLOSE_CURSOR(c); END;
This allows the header line and the data to write into files separate if necessary.
for example
SQL> exec run_query('select * from emp','TEST_DIR','output.txt'); PL/SQL procedure successfully completed.
Output.txt file contains:
empno,ename,job,mgr,hiredate,sal,comm,deptno 7369,"SMITH","CLERK",7902,17/12/1980 00:00:00,800,,20 7499,"ALLEN","SALESMAN",7698,20/02/1981 00:00:00,1600,300,30 7521,"WARD","SALESMAN",7698,22/02/1981 00:00:00,1250,500,30 7566,"JONES","MANAGER",7839,02/04/1981 00:00:00,2975,,20 7654,"MARTIN","SALESMAN",7698,28/09/1981 00:00:00,1250,1400,30 7698,"BLAKE","MANAGER",7839,01/05/1981 00:00:00,2850,,30 7782,"CLARK","MANAGER",7839,09/06/1981 00:00:00,2450,,10 7788,"SCOTT","ANALYST",7566,19/04/1987 00:00:00,3000,,20 7839,"KING","PRESIDENT",,17/11/1981 00:00:00,5000,,10 7844,"TURNER","SALESMAN",7698,08/09/1981 00:00:00,1500,0,30 7876,"ADAMS","CLERK",7788,23/05/1987 00:00:00,1100,,20 7900,"JAMES","CLERK",7698,03/12/1981 00:00:00,950,,30 7902,"FORD","ANALYST",7566,03/12/1981 00:00:00,3000,,20 7934,"MILLER","CLERK",7782,23/01/1982 00:00:00,1300,,10
The procedure allows for the header and the data to separate files if necessary. Just by specifying the file name "header" will put the header and the data in a single file.
Adapt to the exit of styles and different types of data are needed.
-
wanted to extract data from nested table pl/sql Ref Cursor getting an erro
create or replace type 'DEPT12' as an object (dno number (2), dname varchar2 (30), varchar2 (50)) loc;
create or replace type dept_tab in the table in "DEPT12".
create or replace type 'LOC12' as an object (locno number, loc_name varchar2 (100))
create or replace type loc_tab in the table of "LOC12.
create or replace type dept_loc_rec1 as an object (dept_tab, eno number, loc_dt loc_tab dept_dt);
Create type dept_loc_tb as table of the dept_loc_rec1
create table dept_loc_tb_bk1 (dept_dt dept_tab, eno number, loc_dt loc_tab)
NESTED TABLE dept_dt
STORE AS dept_tab12,
NESTED TABLE loc_dt
STORE AS loc_tab12
insert into dept_loc_tb_bk1 values (dept_tab (dept12(3,'ABD','LOC')
dept12(4,'ABD','LOC')
(, dept12(5,'ABD','LOC')), 3, loc_tab (loc12(21,'AAB'),
loc12(22,'AAB'),
loc12(23,'AAB')));
When I try to extract data from Ref cursor to pl/sql table that I get an error ora-06504: pl/sql: return types of the result set of variables or request do not match.
I created a table nested, as well as the pl/sql nested table object dept_loc_tb and I said the same dept_loc_tb lv_dept_loc_tb, but trying to get in this variable we get an error above.
Please anyone can solve my problem.
-----------------
declare
type cr is ref cursor;
cr_obj cr;
lv_dept_loc_tb dept_loc_tb;
Start
Open cr_obj to select dept_dt, eno, dept_loc_tb_bk1 loc_dt;
collect the fetch cr_obj in bulk in lv_dept_loc_tb;
close cr_obj;
end;Your query selects 3 distinct columns requires so 3 collections of matching types. You want to treat these 3 columns as an object of type DEPT_LOC_REC1:
SQL> declare 2 type cr is ref cursor; 3 cr_obj cr; 4 5 lv_dept_loc_tb dept_loc_tb; 6 7 begin 8 open cr_obj for select dept_dt,eno,loc_dt from dept_loc_tb_bk1; 9 fetch cr_obj bulk collect into lv_dept_loc_tb; 10 close cr_obj; 11 end; 12 / declare * ERROR at line 1: ORA-06504: PL/SQL: Return types of Result Set variables or query do not match ORA-06512: at line 9 SQL> declare 2 type cr is ref cursor; 3 cr_obj cr; 4 5 lv_dept_loc_tb dept_loc_tb; 6 7 begin 8 open cr_obj for select DEPT_LOC_REC1(dept_dt,eno,loc_dt) from dept_loc_tb_bk1; 9 fetch cr_obj bulk collect into lv_dept_loc_tb; 10 close cr_obj; 11 end; 12 / PL/SQL procedure successfully completed. SQL>
SY.
P.S. discover sys_refcursor. -
Recovery of the records by using the Ref Cursor or indexes per Table (which is better)
Hi all
I am interested to know if there is a performance (or other) advantages to return a result set from an Oracle stored procedure for a client application (for example, in Java) by using a Ref Cursor or Index by Table, respectively. Most of the people I met who know Java seem to use a Ref Cursor but did not say why this method is preferable. I'm not too familiar with Java and do not have the opportunity to test the difference between either method, but I am very interested in the other user forum about this view, gauging
Kind regards
Kevin.KevinFitz wrote:
Hi zerathul,Thanks for the quick and helpful response. A REF CURSOR would be the best solution if the same set of results (content and number of records returned) should be dealt with by the application of the 'customer '. I'm guessing that maybe in this situation 'theoretical' that there might be less network traffic to return the set of results through an associative array,
Kind regards
Kevin.
Yes, it would always be the best solution, because an associative array would mean collecting all the data in memory of expensive PGA on the database server before they pass any return on the network, while a fair Ref cursor is to feed the data over the network (maybe a little extra load, but you were unlikely to notice). Also the client application would treat a ref as of rows returned cursor data recovery and could treat them upon their arrival, an associative array is a collection of data which will then be entirely spent before any treatment could be done and then the treatment should go through the entire table to do.
REF CURSOR will also provide other information such as the error codes etc regarding SQL if necessary. If you get an error when filling a table on the side of the database, it is not so easy to recover this error to the client.
REF CURSOR is designed for this purpose. Use them.
-
Pipelined table vs ref cursor in a function return
Hi gurus,
Everybody has discovered that a (subject) is faster on the other? Data will be primarily consumed from an external application (.net). What are the benefits? I can't decide if that use is
Thank you very much.user12868294 wrote:
Hi gurus,Everybody has discovered that a (subject) is faster on the other? Data will be primarily consumed from an external application (.net). What are the benefits? I can't decide if that use is
Thank you very much.
They are two different things.
A pipeline table acts as an array, but you must always choose in it and so if your consumption that in .net, you would still use a Ref Cursor I guess to query this table in pipeline (I guess .net is not query the tables directly, but must use some sort of slider Ref?)
Tables in pipeline can be fast, but it depends on what you need to. Is there a reason why you really need a feature in pipeline? If this is not the case, just use a normal query with a Ref Cursor, so your .net application only retrieves the data properly.
-
Casting table PL/SQL for the type of existing table and back ref cursor
Hello
I have the problem of casting a pl/sql table for the type of an existing table and turning the ref cursor to the application. Casting a ref cursor back and number of pl/sql table works well.
Declarant
< strong > TYPE type_table_name IS TABLE OF THE package_name.table_name%ROWTYPE; < facilities >
within the stored procedure, fill in a table of this type temp_table_name and returning the ref cursor help
< strong > results OPEN to SELECT * FROM TABLE (CAST (temp_table_name AS type_table_name)); < facilities >
generates an error. type_table_name is unknown in this distribution. According to me, this happens because of the declaration of the type locally.
Statement type_table_name inside the package specification does not work neither. Incredible, cast to the said dbms_sql.number_table to specify ref cursor back and dbms_sql package works very well!
< strong > CREATE TYPE type_table_name IS TABLE OF THE package_name.table_name%ROWTYPE; < facilities > deals without any error but creates an invalid type complain a reference to package_name.table_name
I don't want to declare every column in the table in type_table_name, because any change the table_name table would result in an inconsistent type_table_name.
Thanks in advance!
Edited by: user6014545 the 20.10.2008 01:04In any case you are right that there is a problem around anchorage (or maintaining) types of objects persistent to match the table structures, they may represent.
In the case you describe, you might be better off just open the refcursor immediately the using one of the techniques described in the http://www.williamrobertson.net/documents/comma-separated.html to manage the delimited list.
In the more general case where the line of treatment is necessary, you may make the pipeline functions.
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production SQL> CREATE TABLE table_name 2 AS 3 SELECT ename column_name 4 FROM emps; Table created. SQL> CREATE OR REPLACE PACKAGE package_name 2 AS 3 TYPE type_name IS TABLE OF table_name%ROWTYPE; 4 5 FUNCTION function_name_pipelined ( 6 parameter_name IN VARCHAR2) 7 RETURN type_name PIPELINED; 8 9 FUNCTION function_name_refcursor ( 10 parameter_name IN VARCHAR2) 11 RETURN sys_refcursor; 12 END package_name; 13 / Package created. SQL> CREATE OR REPLACE PACKAGE BODY package_name 2 AS 3 FUNCTION function_name_pipelined ( 4 parameter_name IN VARCHAR2) 5 RETURN type_name PIPELINED 6 IS 7 BEGIN 8 FOR record_name IN ( 9 SELECT table_alias.* 10 FROM table_name table_alias 11 WHERE table_alias.column_name LIKE parameter_name) LOOP 12 13 PIPE ROW (record_name); 14 END LOOP; 15 16 RETURN; 17 END function_name_pipelined; 18 19 FUNCTION function_name_refcursor ( 20 parameter_name IN VARCHAR2) 21 RETURN sys_refcursor 22 IS 23 variable_name sys_refcursor; 24 BEGIN 25 OPEN variable_name FOR 26 SELECT table_alias.* 27 FROM TABLE (package_name.function_name_pipelined ( 28 parameter_name)) table_alias; 29 30 RETURN variable_name; 31 END function_name_refcursor; 32 END package_name; 33 / Package body created. SQL> VARIABLE variable_name REFCURSOR; SQL> SET AUTOPRINT ON; SQL> BEGIN 2 :variable_name := package_name.function_name_refcursor ('%A%'); 3 END; 4 / PL/SQL procedure successfully completed. COLUMN_NAME ----------- ALLEN WARD MARTIN BLAKE CLARK ADAMS JAMES 7 rows selected. SQL> ALTER TABLE table_name ADD (new_column_name VARCHAR2 (1) DEFAULT 'X'); Table altered. SQL> BEGIN 2 :variable_name := package_name.function_name_refcursor ('%A%'); 3 END; 4 / PL/SQL procedure successfully completed. COLUMN_NAME NEW_COLUMN_NAME ----------- --------------- ALLEN X WARD X MARTIN X BLAKE X CLARK X ADAMS X JAMES X 7 rows selected. SQL>
-
Irregular data loss - function from PL/SQL returning data using Ref Cursor
Database Version: 10.2.0.4.0 (node 2 CARS)
The high-level process flow is as below:
(1) insert records in a few tables & commit the same
(2) call the pl/sql function to extract files (on certain conditions with joins with other tables) of the tables which are filled in step 1.
-> It uses the ORDER BY clause to queries inline & line number 5000 records return for each call.
Sense - if inline query is supposed to return 1,00,000 records then 20 calls to the same function. This, because the application cannot contain records beyond number.
(3) the data returned by the ref cursor is then processed by application (Tibco BW) to generate the flat file.
We are facing the problem of data loss in the file and there is no fixed model. It happens once between 200-300 calls process.
Resolution: When the problem occurs, triggering the process and in almost every time re-outbreak of the process provides required data.
Guidance on what could be the reason?
* Examples of Code for the function:
CREATE OR REPLACE FUNCTION FUNC_GET_HRCH_TOTAL_DATA)
outinstrid in NUMBERS
outinstrkey in NUMBERS
rownumberstart in NUMBERS
rownumbereend in NUMBERS
err_code OUT VARCHAR2,
err_msg OUT VARCHAR2)
RETURN PACK_TYPES. HRCH_TOTAL_CURSOR
IS
REF_HRCH_TOTAL_CURSOR PACK_TYPES. HRCH_TOTAL_CURSOR;
BEGIN
OPEN FOR REF_HRCH_TOTAL_CURSOR
SELECT *.
FROM (SELECT A.HIERARCHY_KEY, B.KEY, B.VAL_KEY, A.KEY_NEW, C.ITEMID, B.VAL_TAG, B.sort_order, ROWNUM ROWNUMBER
OF AOD_HRCH_ITEM A, AOD_HRCH_ATTR B, AOD_HRCH_ITEMS C
WHERE A.outputid = B.outputid
AND A.outputid = C.outputid AND A.outputkey = B.outputkey
AND A.outputkey = C.outputkey AND A.outputid = outinstrid
AND A.outputkey = outinstrkey AND A.ITEM_SEQ = B.ITEM_SEQ
AND A.ITEM_SEQ = C.ITEM_SEQ AND A.HIERARCHY_LEVEL_ORDER = B.SORT_ORDER
ORDER BY A.HIERARCHY_LEVEL_ORDER DESC)
WHERE ROWNUMBER < rownumbereend
AND ROWNUMBER > = rownumberstart;
RETURN REF_HRCH_TOTAL_CURSOR;
EXCEPTION
WHILE OTHERS
THEN
err_code: = x_progress | ' - ' || SQLCODE;
err_msg: = SUBSTR (SQLERRM, 1, 500);
END FUNC_GET_HRCH_TOTAL_DATA;
/
Published by: meet_sanc on February 16, 2013 10:42Your SELECT statement is almost certainly incorrect
SELECT * FROM ( SELECT A.HIERARCHY_KEY, B.KEY, B.VAL_KEY, A.KEY_NEW, C.ITEMID, B.VAL_TAG, B.sort_order,ROWNUM ROWNUMBER FROM AOD_HRCH_ITEM A, AOD_HRCH_ATTR B, AOD_HRCH_ITEMS C WHERE A.outputid = B.outputid AND A.outputid = C.outputid AND A.outputkey = B.outputkey AND A.outputkey = C.outputkey AND A.outputid = outinstrid AND A.outputkey = outinstrkey AND A.ITEM_SEQ = B.ITEM_SEQ AND A.ITEM_SEQ = C.ITEM_SEQ AND A.HIERARCHY_LEVEL_ORDER = B.SORT_ORDER ORDER BY A.HIERARCHY_LEVEL_ORDER DESC) WHERE ROWNUMBER < rownumbereend AND ROWNUMBER >= rownumberstart;
Since the ORDER BY is applied after the ROWNUM is assigned in this case, your query is requested for a period of 5000 lines any arbitrariness. It would be perfectly valid for a single line to return in each of your 200 different calls or for a line to return in any of them.
You definitely want to do something in the sense of the canonical askTom wire
select * from ( select a.*, rownum rnum from ( YOUR_QUERY_GOES_HERE -- including the order by ) a where rownum <= MAX_ROWS ) where rnum >= MIN_ROWS
That said, it seems inconceivable that Tibco is unable to manage a cursor that returns more than a certain number of lines. You do a ton of work to return the data pages that are certainly not necessary. Unless you're saying that you somehow paralyzed your installation of Tibco giving him a ridiculously small amount of memory to process, something doesn't look good. A slider is just a pointer - it holds that no data - so the number of lines that you can extract a slider should have no impact on the amount of memory on the client application needs.
As others have already pointed out, your exception handler is almost certainly do more harm than good. Return the error codes and error messages as from the OUT parameters, instead of simply allowing the exception to propagate deletes a ton of useful information (such as the mistake of the stack) and makes your process much less robust.
Justin
-
Create a REF CURSOR as an array of display/temp
Hello world
I had to upgrade a number of Crystal Reports Using REF CURSOR as part of an ERP upgrade project. The new version of the ERP application supports more use of the REF CURSOR and only supports the use of views/tables.
I don't see how I can rewrite the REF CURSOR (which are defined in the PL/SQL procedures), in the form of VIEWS / TEMP TABLES with a single call. That is to say when the user runs the report.
Can anyone suggest a method of conversion of the REF CURSOR in view/Temp Table without the two steps, the steps to populate a temporary table and then, i.e. 1 - 2 - query the table in the report. ??? -I was looking at a Pipelining as an option but again could reach with only two stages, pre filling before running the report.
Any advice would be greatly received.
Kind regards
David.
I found a solution by creating a FUNCTION with a PIPELINED return cursor, and then create a temporary table in the result set. Not really ideal was to use a Pragma AUTONOMOUS_TRANSACTION, but will work for me.
Thank you
David.
-
I get the following error when you try to select using a ref cursor
SQL error: ORA-06504: PL/SQL: return variables of the game results or the query types do not match
Here are the steps that I have followeed. Can someone tell me what I did wrong.
-CREATE AN OBJECT
create or replace type rsn_rec as object ( rsn_cd varchar2(10), rsn_desc varchar2(30) );
-CREATES A TABLE OF OBJECT
create or replace type rsn_tbl as table of rsn_rec;
PACKAGE/CREATED FUNCTION
create or replace package pkg_rept_test as type refcur is ref cursor; function get_rsn return rsn_tbl pipelined; end pkg_rept_test; create or replace package body pkg_rept_test as function get_rsn return rsn_tbl pipelined is o_cursor refcur; rec rsn%ROWTYPE; begin open o_cursor for select rsn_cd, rsn_desc from rsn; loop fetch o_cursor into rec; exit when (o_cursor%notfound); pipe row(rsn_rec(rec.rsn_cd, rec.rsn_desc) ); end loop; return; end; end pkg_rept_test;
-THE TABLE SELECTION
select * from table(pkg_rept_test.get_rsn)
-ERROR
SQL error: ORA-06504: PL/SQL: return variables of the game results or the query types do not matchYour code works for me just as you posted.
Connected to:
Oracle Database 11 g Enterprise Edition Release 11.2.0.1.0 - 64 bit Production
With partitioning, OLAP, Data Mining and Real Application Testing options
SQL > create table rsn (rsn_cd varchar2 (10), rsn_desc varchar2 (30));
Table created.
SQL > insert into rsn values ("cd test", "test description");
1 line of creation.
SQL > commit;
Validation complete.
SQL > create or replace the rsn_rec as an object type
2 (
3 rsn_cd varchar2 (10),
rsn_desc 4 varchar2 (30)
5 );
6.
Type of creation.
SQL > create or replace type rsn_tbl in the rsn_rec table;
2.
Type of creation.
SQL > create or replace package pkg_rept_test as
2 type refcur is ref cursor;
3 function get_rsn return rsn_tbl in pipeline;
4 end pkg_rept_test;
5.
Package created.
SQL > create or replace package body pkg_rept_test as
2 function get_rsn
3 return rsn_tbl pipeline is
4 o_cursor refcur.
5 rec rsn % ROWTYPE;
6 start
7. open o_cursor for
8. Select
rsn_cd 9,.
10 rsn_desc
11 of rsn;
12 loop
13 extract o_cursor in rec;
When exit 14 (o_cursor % notfound);
line 15 pipe (rsn_rec (rec.rsn_cd, rec.rsn_desc)
16 );
17 end of loop;
18 return;
end 19;
20 end pkg_rept_test;
21.
Package body created.
SQL > select * from table (pkg_rept_test.get_rsn);
RSN_CD RSN_DESC
---------- ------------------------------
tests of cd test description
Maybe you are looking for
-
No sound for a HP ZV6000 - please don't help
Thanks in advance for anyone who sees this and tries to help me. I have recently reinstalled the partition on my computer. In doing so, I apparently lost my audio drivers. Downloaded the recommended outside the site of HP... BUT, it doesn't work, or
-
Since another laptop Toshiba Satellite L300 - can I use Recovery CD?
Hello I can't get a computer to load Vista (Equium l300 (I think).Ubuntu loads very well (I have a linux partition 8 GB, with GRUB installed in a separate partition), but when I try to load vista I get "to go". "and nothing happens. I tried HDDRecove
-
I recently changed Windows 10 and until today, I had no problem printing. However, for some reason, the prnter is now offline and I can't figure how to get it "online". Can anyone help?
-
I have 2 laptops and one desktop. Desktop & laptop are very good. 2nd laptop computer cannot access the internet. I get a message media disconnected. I tried everything please help. I use Windows XP
-
Error code: 0x8024200D and KB2345886 will not install.
Original title: KB2345886 will not install little matter what I do. Can you tell me how to install? I tried almost every suggestion Fix - it that was given to me, and yet there is not way to this KB to install. I have also received an error 0x80242