I know the example of Ref Cursor
I tried to learn the Ref cursor, I can't find simple example. can anyone of you please tell me a Ref Cursor?
Okies, I'll try that...
Thank you very much.
Tags: Database
Similar Questions
-
By the way the Ref cursor to the subprogrammes-taking islet of time to return
Hello
Version Oracle 11.2.0.1
I test the way other Ref Cursor sub programs using examples of schema scott. Please see below for the code.
Everything compiled fine.while execution of the procedure taking a lot of time.create or replace package typ_ref_cursor_pkg as Type t_ref_cursor is REF CURSOR; end typ_ref_cursor_pkg; / create or replace package emp_info_pkg is Type rec_emp is record ( name emp.ename%TYPE, sal emp.sal%Type ); l_emp_rec rec_emp; Procedure get_emp_salary(p_cursor typ_ref_cursor_pkg.t_ref_cursor); Procedure get_emp_by_dept(p_deptno emp.deptno%type); end emp_info_pkg; / create or replace package body emp_info_pkg is Procedure get_emp_salary(p_cursor typ_ref_cursor_pkg.t_ref_cursor) is begin Loop Fetch p_cursor into l_emp_rec; exit when p_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(l_emp_rec.name||' - '||l_emp_rec.sal); end Loop; End get_emp_salary; Procedure get_emp_by_dept(p_deptno emp.deptno%type) is v_emp typ_ref_cursor_pkg.t_ref_cursor; Begin open v_emp for select ename,sal from emp where deptno=p_deptno; LOOP get_emp_salary(v_emp); END LOOP; close v_emp; END get_emp_by_dept; END emp_info_pkg; /
what I am doing wrong? Could you point me to the right direction?execute emp_info_pkg.get_emp_by_dept(10);
Thank you
SGSg049 wrote:
Everything compiled fine.while execution of the procedure taking a lot of time.execute emp_info_pkg.get_emp_by_dept(10);
How long is a long time? Is the code you have posted takes a lot of time, or is it just a case of quick test that works quickly?
Start by checking the SQL code. Get an execution plan for SQL that you run and see if you do a scan of the complete table on the table - if so an index on deptno could help.
I think you have an endless loop in get_emp_by_dept. I was unable to see a way out the manual of the WHILE loop.
-
Report regions - use of the Ref Cursor?
APEX 4.2
See http://mikesmithers.wordpress.com/2012/02/22/getting-apex-to-play-with-ref-cursors
The above article is older than 2 years. The techniques shown in the link above still valid today if we want to create a report region in the APEX are based on a function that returns a Ref Cursor? Are there improvements in this area for the next APEX 5.0 and/or database Oracle 12 c?
Thank you
HELEN wrote:
APEX 4.2
See http://mikesmithers.wordpress.com/2012/02/22/getting-apex-to-play-with-ref-cursors
The above article is older than 2 years. The techniques shown in the link above still valid today if we want to create a report region in the APEX are based on a function that returns a Ref Cursor?
If the function returns the ref cursor is the only point of access that you have data then Yes, it probably is. If you have direct access to the underlying database objects and the function does not have something very complicated, then you are probably better off creating your own body of the function returning SQL query data source.
Everything about the dynamics of ref Cursor now I divided in 2 layers, with a function for generating the dynamic SQL and another for bind parameters open the ref cursor. APEX apps can then reuse the functions of SQL query in function body return SQL query data sources (if you take a bit of care to keep the bind variable names vaguely APEX-point-friendly).
Are there improvements in this area for the next APEX 5.0 and/or database Oracle 12 c?
See this for the technical background on why APEX is not yet support ref Cursor and this for more information of the Oracle team on the possibility of future support. Obviously, he did not he in 4.1. I suspect that data REF CURSOR region sources depended on a minimum requirement of DB of the 11.1.0.6 (where was introduced support for the conversion of the REF CURSOR in the cursors DBMS_SQL). As minimum DB for APEX 5.0 version is 11.1.0.7, it would be a possible feature for 5.0, but it is not classified as one.
-
Made Oracle 6i LOV with ref cursor returned by a function of database
Hi all
I want to dynamically create a LOV in oracle forms 6i using the value of ref cursor returned by the function of database.
is this possible?
Using loop, I could able to display the values returned by the ref cursor, but how can I assign these values in the LOV?
You will need to loop through your REF Cursor and assign each value to a group of registration of forms and then assign the Group Record to your LOV. Take a look at the built-ins CREATE_GROUP, ADD_GROUP_COLUMN and ADD_GROUP_ROW in the help system of forms for more information about how to use these built-ins and examples of how to use them.
Craig...
-
Difference of cursor (REF Cursor &; Sys_Refcursor)
Hello
Is there a difference between REF Cursor and SYS_Refcursor?
I see some packages using sys_refcursor and others using the REF Cursor.
Package 1 (Spec):
I'm going through this link (http://sql-plsql.blogspot.com/2007/05/oracle-plsql-ref-cursors.html) but did not find the answer.
PROCEDURE s_demo1 (
ret_rset OUT sys_refcursor
);
Package 2 (Spec):
TYPE cur_set IS REF CURSOR;
PROCEDURE s_test1 (out_data OUT cur_set);
PROCEDURE s_test2 (out_data OUT cur_set);SYS_REFCURSOR is a REF CURSOR defined by oracle. Thus, you can not compare SYS_REFCURSOR and REF CURSOR.
SYS_REFCURSOR is a week REF CURSOR, meaning it doesn't have a return type precise than what we will have in a refcursor defined by the user.
And in your example, I see no difference between SYS_REFCURSOR and CUR_SET because only the two week REF CURSOR.
Published by: Karthick_Arp on November 17, 2010 06:36
-
Hi guys,.
You can develop the ref cursor please. I'm new to the plsql...
Hi Alex,
Introduction to the REF CURSOR
With the help of
REF
CURSOR
s is one of the most powerful, flexible and scalable means to return the query results to an Oracle database to a client application.A
REF
CURSOR
is a PL/SQL data type whose value is the memory address of a workspace of query on the database. In essence, aREF
CURSOR
is a pointer or a handle to a game on the database of results.REF
CURSOR
s are represented by theOracleRefCursor
class ODP.NET.REF
CURSOR
s have the following characteristics:- A
REF
CURSOR
refers to a memory on the database address. Therefore, the client must be connected to the database during the lifetime of theREF
CURSOR
to access. - A
REF
CURSOR
involves a round-trip of additional database. While theREF
CURSOR
is returned to the customer, the actual data is not returned until the customer open itREF
CURSOR
and requests the data. Note that the data are not be retrieved until the user tries to read it. - A
REF
CURSOR
is not editable. The result set represented by theREF
CURSOR
is read-only. You cannot update the database using aREF
CURSOR
. - A
REF
CURSOR
is not back with scroll. The data represented by theREF
CURSOR
is only accessible in a way before and in series. You cannot position a record pointer inside theREF
CURSOR
to point to records in the result set. - A
REF
CURSOR
is a PL/SQL data type. You create and return aREF
CURSOR
within a block of PL/SQL code.
See this link which explained on cursor by Zerathul ref: PL/SQL 101: understanding Ref Cursor
Kind regards
Jitendra
- A
-
Need the difference between strong Ref Cursor and weak Ref Cursor examples
Oracle 9.2
It would be great if someone can help understand the differences between
1 Strong Ref Cursors(return type)
and
2. weak Ref Cursor (no return type)
What I read is weak ref Cursor as sys_refcursor is better to use the ref Cursor, because in the case of slider strong Ref object type that will be returned must be declared in advance. It dosent make sense to me?
I start with the examples would be appreciate for advice
Strong Ref Cursor
create the package str_pack
is
type sref_type is ref cursor return emp % rowtype;
SVAR sref_type;
end str_pack;
Create procedure st_proc (eid in number, c1 on str_pack.sref_type)
is
Start
Open c1 to select empno, ename, sal from emp where empno = eid;
end;
declare
str_pack.sref_type C1;
type rec is RECORD (eid, ename varchar2 number (20), number of sal);
SheikYerbouti rec;
Start
st_proc(10,C1);
loop
When exit c1% notfound;
Fetch c1 into SheikYerbouti.
end loop;
Close c1;
end;
There could be errors in the above example but its basically to get a better understanding.
For weak Ref Cursor
procedure of the child
Create procedure child_proc (in number, c1 on sys_refcursor eid)
is
Start
Open c1 to select empno, ename, sal from emp where empno = eid;
end;
parent process
Create procedure parent_proc (recnum varchar2)
is
p_retcur sys_refcursor;
emp_row emp % rowtype;
Start
child_proc (eid, p_retcur);
loop
extract the p_retcur in emp_row;
dbms_output.put_line(emp_row.empno ||) e '|| emp_row. Ename | "wins". emp_row. SAL);
end loop;
end parent_proc;
Concerning
@Hello
the fundamental difference is to do with the compiling and linking of runtime type that occurs.
The he should explain a lot more detail than I could ever!
http://asktom.Oracle.com/pls/asktom/f?p=100:11:0:P11_QUESTION_ID:1640161160708P;
-
Best approach - whether to return Collections or the Ref Cursor?
I have the table that the column is a nested table (column address) type. Now, I want to fill the same
in a jsp page.
As his collection type I am thinking to send variable Collection to front-end. And most of java professionals
argue that the collections are the best approach.
But here, in a lot of posts, I read that collections at the front end is the worst approach and it degrades performance
and increases the load.
But java assert that even if connection fails they can always display the data as the data set is with them
How to get a set of results COLLECTION.
As ref cursor is just a pointer to the real cursor lies in the comics... they're going to make one record of the other instead and once the connection is lost... they can no longer display the data. This assertion seems
to be reasonable!
How you condemn it? and prove ref Cursor is good way?
Here's the example scenario that I have with me.
Using the Collectioncreate type t_adress is object(t_h_no varchar2(500),t_pin_code number); / create type t_address_tbl is table of t_adress; / create table r_dummy (emp_name varchar2(200),emp_id number,emp_address t_address_tbl) nested table emp_address store as emp_address_tbl; insert into r_dummy values('raghu',1,t_address_tbl(t_adress('598',500035),t_adress('600',500036))) insert into r_dummy values('raghu nadh',2,t_address_tbl(t_adress('598',500035),t_adress('600',500036)))
Using Ref CursorCreate or replace procedure p_using_col ( p_emp_id in r_dummy.emp_name%type, p_emp_dtls out t_address_tbl ) is begin Select t_adress(cl.t_h_no,cl.t_pin_code) bulk collect into p_emp_dtls from r_dummy,table(emp_address) cl where emp_id = p_emp_id; end; / set serveroutput on; declare l_emp_id r_dummy.emp_name%type := 1; l_emp_dtls t_address_tbl; begin p_using_col(l_emp_id,l_emp_dtls); for i in 1..l_emp_dtls.count loop dbms_output.put_line(l_emp_dtls(i).t_h_no); end loop; end;
ConcerningCreate or replace procedure p_using_ref ( p_emp_id in r_dummy.emp_name%type, p_emp_dtls out sys_refcursor ) is begin Open p_emp_dtls for Select cl.t_h_no,cl.t_pin_code from r_dummy,table(emp_address) cl where emp_id = p_emp_id; end; / set serveroutput on; declare l_emp_id r_dummy.emp_name%type := 1; l_emp_dtls sys_refcursor; l_h_no varchar2(500); l_pin_code number; begin p_using_ref(l_emp_id,l_emp_dtls); loop fetch l_emp_dtls into l_h_no,l_pin_code; exit when l_emp_dtls%notfound; dbms_output.put_line(l_h_no||' '||l_pin_code); end loop; close l_emp_dtls; end;
RUSSORUSSO says:
I would like to know what really happens behind the screen IE in PGA... when we return collections...A collection is a PL/SQL variable. Like all PL/SQL variables, it resides in the global area of the server process that executes PL/SQL code. This memory is part of the process the process's private memory.
If need more memory, more memory server be malloc' ed by the process.
As he is dedicated and private memory, no other process can reap the benefits of this memory in use. It is not 'ideal' - shared memory however benefits all the processes that are involved in sharing that allocated the memory. As is the case with the SGA
How long my set of data will reside in the PGA? He immediately fade after returning to the calling procedure? and how it degrades performance. Help me with a good link.
Assume that you create a collection of 10 MB. The process server malloc' ed 10 MB of server memory. The PGA has thus extended.
When your code executes the variable usage (it is out of reach of runtime), the PL/SQL engine can theoretically free up 10 MB of memory. However, it may have allocated 4 KB memory after this assignment of 10 MB. Only 4 KB is still in use. This moment results in that the process cannot shrink its allocated memory - as this free piece of 10 MB is slapbang in the middle of the used memory space.
PGA memory is 'expensive' because it's not shared memory is private, with only the current process. PGA in memory is not so easy to decline. Memory management is a complex issue and you who ceases to use a large part of the PGA memory almost never means that this memory suddenly become free and available for other processes to use.
Also, you have to ask yourself why you want to copy data from disk blocks into the SGA buffer (for SQL procedures) cache, then copy these data blocks of APG in the PGA (using a collection and extraction in bulk) and then copy this PGA memory on the network to the client process (TOAD or .net or Java or whatever).
It's a lot of moving parts - which increases the complexity, lowers the performance and scalability and ups the risk of something going wrong due to the increased complexity.
It is much simpler and much stronger, to maintain the number of moving parts to a minimum. For example to copy data directly from cache buffers of the SGA to the customer via a ref cursor
-
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.
-
Return of the ref cursor of procedure where the cursor is defined in the specification
Hello
Here's pseudo-code
create or replace package test
as
cursor c_emp (number cv_emp_id)
is
Select emp_name emp where emp_id = cv_emp_id;
type ref_c is ref cursor;
function get_emp_name (number p_emp_id) return ref_c;
end test;
/
create or replace the test physics package
as
ref_c function get_emp_name (number p_emp_id)
is
ret_val ref_c;
Start
Open c_emp (p_emp_id);
ret_val: = c_emp;
return ret_val;
end get_emp_name;
end test;
/
Returns me "PLS-00382: expression is of the wrong type. I tried to use a strongly typed Ref cursor based on the cursor, but nothing helped.
Clearly, I understand something... and if I can't assign as ' ret_val: = c_emp "and if there is another key way it so please let me know.
Thank you
Ralph
Published by: user13024707 on May 5, 2010 04:43user13024707 wrote:
Clearly the point of my question is being missed.Or maybe the question is not been clearly asked. ;)
I want to set the cursor in the PACKAGE SPECIFICATION, and not in the package body. The issue of the bind variable and the string is neither here nor there because I pass parameters to the cursor.
What you ask is to use a PL/SQL cursor (defined in the specifications of the package or elsewhere) and that convert a Ref Cursor. N ° cannot be done.
PL/SQL cursors should be used in the PL/SQL code. REF CURSOR is primary used to pass back a reference to a cursor (and all queries are cursors) to a layer of application outside of PL/SQL for example .net, java, etc.. Once you start using the ref Cursor only really, you have the choice of opening it based on a (dynamic) or a fixed query string as in the examples given. You cannot open a cursor of a PL/SQL cursor definition Ref.The difference is that when you do:
CURSOR cur_mycursor IS SELECT ...
you declare a cursor in pl/sql definition, not actually a slider itself. The cursor itself is created when you issue an OPENING or a statement FOR etc. So a Ref Cursor (reference to a slider) cannot refer to the definition of the cursor because it is only a definition, not a cursor (i.e. it has not been sent engine sql and instantiated at that time here). Instead the Ref Cursor must reference a cursor (query), itself, and that may be presented as a string or as the query itself that is issued against the sql engine and then the ref cursor points
Thus, slider ref and PL/SQL cursors are different concepts, both designed to manage cursors in a slightly different way of programming. You cannot mix them.
-
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
-
View BC item from the ref cursor oracle
Is there an easy way to jdev 11.1.1.4 to create a view based on a ref cursor oracle object?It's in the docs http://docs.oracle.com/cd/E21043_01/web.1111/b31974/bcadvvo.htm#sm0341 search for 'How to create a display on a REF CURSOR object'
An example can be found here http://adfpractice-fedor.blogspot.de/2011/01/adf-bc-programmatically-populated-vo.htmlTimo
-
The use of bind variables in dynamic query created for Ref Cursor
Hello
I'm in a situation where there is a Ref cursor to which the query is built execution based on a loop. This is why the number of links would be known until the program runs.
The application is currently using literals instead of bind variables.
code snippet of the above is
strSql: = "select * from emp where 1 = 1 and ().
loop cursor1
If cond is true then
strSql = strSql | "ename = ' |" Cursor1.ColumnName;
end loop;
Open cursor2 for strSql;
How to use links in the example above.sb92075 wrote:
user13019948 wrote:
HelloHere is the code I have my trying to change literal-based link to the base.
What do you mean by "based bind?
who, what, how determines the values to be 'bound '?
He's referring to the coding style. He is currently using concatenated literal, and the goal is to change it to use the bindings.
If I understand this it is known as method 4 dynamic SQL and requires DBMS_SQL. There are examples autour but they vary according to the type of statement being generated - SELECT statements require column lists to be parsed, unlike the INSERT/UPDATE/DELETE.
This came up recently on my current project and I hit a demo. Here a table of names and values accepted procedure and had to build these in a single WHERE clause along the lines of
AND t_names(i) = t_values(i)
for an undetermined number of elements in the array. For this demonstration, I used a table that we called "attribute" (don't ask) which has columns including 'attribute_id' and 'name', and I need to build a query along the lines of
select description from attribute where attribute_id = :b1 and name = :b2
by the way '1012' and 'ISIN' respectively. (I use a table better and after a CREATE statement for her but I have to rush right now, sorry).
declare k_sql_base constant varchar2(500) := 'select description from attribute'; t_names constant varchar2_t := varchar2_t('attribute_id', 'name'); t_values constant varchar2_t := varchar2_t('1012', 'ISIN'); l_sql varchar2(500) := k_sql_base; l_rows_fetched integer := 0; l_value varchar2(4000); l_cursor_handle integer; begin -- Construct the SQL statement with column names and bind variables e.g. -- 'select description from mars.attribute where attribute_id = :b1 and name = :b2' for i in t_names.first .. t_names.last loop l_sql := l_sql || case i when t_names.first then ' where ' else ' and ' end || t_names(i) || ' = :b' || i; end loop; dbms_output.put_line('SQL statment = ' || l_sql); -- Parse the statement we built above (the remaining steps require a parsed cursor): l_cursor_handle := dbms_sql.open_cursor; dbms_sql.parse(l_cursor_handle, l_sql, dbms_sql.native); -- Associate the 1st column of output with variable l_value - required for SELECT statements: -- (actually the 3rd param here 'column' seems to be only used to get a datatype, in this case we want a string - -- dbms_sql.column_value actually extracts the value into a specified variable, which can be different. -- All examples in the documentation pass a local variable without further comment, so not entirely clear what this does other than set the output datatype.) dbms_sql.define_column(l_cursor_handle, 1, l_value, 4000); -- Now go through values array binding actual values to :bn variables in the cursor (similar to USING clause of EXECUTE IMMEDIATE) for i in t_values.first .. t_values.last loop dbms_sql.bind_variable(l_cursor_handle, ':b'||i, t_values(i)); dbms_output.put_line('Bound :b'||i || ' as ' || t_values(i)); end loop; -- Open the cursor and fetch the result (no loop here because we are expecting a single-row result): l_rows_fetched := dbms_sql.execute_and_fetch(l_cursor_handle); -- 'Returns value of the cursor element for a given position in a cursor' -- Copy the value of column 1 to variable l_value (has to match -- dbms_sql.column_value(l_cursor_handle, 1, l_value); dbms_sql.column_value(l_cursor_handle, 1, l_value); dbms_output.put_line('Result = ''' || l_value || ''''); dbms_sql.close_cursor(l_cursor_handle); end;
Hope that helps...
-
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.
-
Example of using a Ref Cursor variable procedure
I'm looking for an example of how to execute a stored procedure with a Ref cursor variable in SQL Developer 3.0. I am familiar with the syntax in SQL * Plus, for example:
variable my_cur refcursor;
Start
my_package.my_proc ("in param"
(: my_cur);
end;
/
print: my_cur
How would I do the same thing in SQL Developer 3.0?
Thank you!Run a procedure directly. For example, select the package in the browser-> menu-> Run. The dialogue with anonymous block box. Edit, OK it to run, then the procedure would be and all settings including Ref Cursor appear in the grid. (This functionality is there since 3.0)
Maybe you are looking for
-
Qosmio G20-127: keys Fn & shortcut keys do not work with Vista RC1
This problem is really annoying me. Shortcut keys (play, pause, forward, record, brightness), or Fn keys work since I installed windows vista RC1.I need to find a solution to this problem. If someone did experience please provide me with your comment
-
6/14, I tried several times to download & install the following in office 2007, but getting the 00000646 error code when you try to install. Can help you, please. KO-982308, 979441, 982158, 982135, 982312, 982331 & 983486 Thank youD.
-
ThinkPad T510 - recovery Win7 64-bit
Hello. I have a T510 (4312-2KY). Comes originally with Win XP PRO 32 bit and recovery to Win 7 32 bit. Lenovo said that the license from microsoft are for both version. My question is if I can use a 64-bit version and where can I download a recovery
-
Aspire switchable graphics issue E5 - 521G
Hello I recently purchased Aspire E5 - 521G with AMD R5 graphic m240 which should have 1 GB of video memory dedicated. Atleast desciption of the computer said that, before I bought it. When I got the pc, I noticed that there is 2 GB of video memory d
-
How to improve rendering in Windows Movie Maker?
I use CamStudio (on Windows XP) to make a few instructional videos on Visual Studio for our development team, and one of the necessary videos a few changes to remove audio and video errors and to add a better term. CamStudio output to .avi files, and