Dynamic query with ref cursors
please help me out there.
can you give an example of how to construct a procedure using ref cursors.
say if I had an employee table.
employee table
first name
last name
position
dept
I would have three input parameters, last name, position, dept. Sometimes only one parameters would be passed. Sometimes only two or sometimes all three.
How can I construct the procedure being that the parameters will be dynamic
thanks.
Don't worry user484105 I don't do kicking, sarcasm and bad humour are other matters though.
Yes you can use sys_refcursor, in fact all the tests that Todd and I have supplied, have done just that. Do you have a development database to work in?
if so I would recommend
1. Run demobld.sql if you don't already have emp table.
2. Copy my second post in your other thread.
3. Edit out all the sqlplus output and the first four columns.
4. If any of this puzzles you see if you can find the answer in the SQL Reference, PL/SQL Guide or SQL*Plus manuals
http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/toc.htm
http://download-east.oracle.com/docs/cd/B19306_01/appdev.102/b14261/toc.htm
http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14357/toc.htm
5. If you can't find the answer post what you have and the error here.
6. It is probably best if you use sqlplus for this.
You will learn a lot if you can do this.
Similar Messages
-
Hi all,
I am trying see if we can use LINQ like functionality to query a ref cursor resultset. I have about 50 procedures( as part of 12 packages) which send the ref cursor output to a front end application when called individually. Now I need to create a procedure to get only specified records from each of these 50 ref cursors and output it to another ref curosr.
In other words how can I use the following
select col_2 from pkg_abc.pro_ref_cursor_out(arg1, arg2...) where col_1 = 'X':I am not inclined to use a fetch as I foresee performance issues?
Thanks@ Tubby. Here is what I am looking to do. Let us say I have two packages as below each with one ref cursor. In reality there are about 15 packages and 50 procedures and hence 50 ref cursors.
CREATE OR REPLACE PACKAGE pkg_1
IS
TYPE resultset_typ IS REF CURSOR;
PROCEDURE pro_1 (
i_region IN VARCHAR2,
o_resultset OUT resultset_typ, -- 'recordset' output
END pkg_1;
CREATE OR REPLACE PACKAGE BODY pkg_1
IS
PROCEDURE pro_1 (
i_region IN VARCHAR2,
o_resultset OUT resultset_typ,
IS
BEGIN
OPEN o_resultset FOR
SELECT 'employees' AS person_type, employee_name FROM tbl_employees WHERE region = i_region;
END;
END pro_1;
END pkg_1;
CREATE OR REPLACE PACKAGE pkg_2
IS
TYPE resultset_typ IS REF CURSOR;
PROCEDURE pro_2 (
i_region IN VARCHAR2,
o_resultset OUT resultset_typ, -- 'recordset' output
END pkg_2;
CREATE OR REPLACE PACKAGE BODY pkg_2
IS
PROCEDURE pro_2 (
i_region IN VARCHAR2,
o_resultset OUT resultset_typ,
IS
BEGIN
OPEN o_resultset FOR
SELECT 'customers' AS person_type, customer_name FROM tbl_customers WHERE region = i_region;
END;
END pro_2;
END pkg_2;Currenlty the front end app calls these packages individually when required. But I want to create an additional package as follows so that I dont have to write the underlying queries again.
CREATE OR REPLACE PACKAGE pkg_3
IS
TYPE resultset_typ IS REF CURSOR;
PROCEDURE pro_3 (
i_region IN VARCHAR2,
i_name IN VARCHAR2,
o_resultset OUT resultset_typ, -- 'recordset' output
END pkg_3;
CREATE OR REPLACE PACKAGE BODY pkg_3
IS
PROCEDURE pro_3 (
i_region IN VARCHAR2,
i_name IN VARCHAR2,
o_resultset OUT resultset_typ,
IS
BEGIN
OPEN o_resultset FOR
SELECT * FROM pkg_1.pro_1(i_region) WHERE employee_name = i_name
UNION ALL
SELECT * FROM pkg_2.pro_2(i_region) WHERE customer_name = i_name
END;
END pro_3;
END pkg_3; -
PLS-00428 Why SELECT must be adorned with REF CURSOR to work?
hello
*"PLS-00428: an INTO clause is expected in this SELECT statement"* - This problem has been resolved. I just want to understand WHY SELECT statements need to be paired with REF CURSOR.
To reproduce this,
DECLARE
Id1 numeric(19,0);
Id2 numeric(19,0);
CreateTimestamp date;
BEGIN
-- ATTN: You'd either need to select into variable or open cursor!
select * from SystemUser left join Person on Person.Id = SystemUser.PersonId WHERE Person.PrimaryEmail in ('[email protected]','[email protected]');
END;
Solution?
* In install script:
CREATE OR REPLACE PACKAGE types
AS
TYPE cursorType IS REF CURSOR;
END;
* Then in your query:
DECLARE
Id1 numeric(19,0);
Id2 numeric(19,0);
Result_cursor types.cursorType;
BEGIN
OPEN Result_cursor FOR select * from SystemUser left join Person on Person.Id = SystemUser.PersonId WHERE Person.PrimaryEmail in ('[email protected]','[email protected]');
END;
I Googled for reasonable explaination - closest is: http://www.tek-tips.com/viewthread.cfm?qid=1338078&page=34
That in oracle block or procedures are expected to do something and a simple SELECT is not!! (Very counter intuitive). What needs to be done is therefore to put the select output into a ref-cursor to fool oracle so that it thinks the procedure/block is actually doing something. Is this explanation right? Sounds more like an assertion than actually explaining...
Any suggestion please? Thanks!Opening a cursor (ref cursor or otherwise) is not the same as executing a select statement.
A select statement returns data, so if you are using it inside PL/SQL code it has to return that data into something i.e. a local variable or structure. You can't just select without a place for the data to go.
Opening a cursor issues the query against the database and provides a pointer (the ref cursor), but at that point, no data has been retrieved. The pointer can then be used or passed to some other procedure or code etc. so that it may then fetch the data into a variable or structure as required.
It's not counter-intuitive at all. It's very intuitive. -
Link Query and Ref Cursor Query
Hi all!!
How can I link Query and Ref Cursor Query??
I mean, How can I pass input parameters to the PL/SQL procedure if they are not User parameters but they come from another table??
Thanks a lot
F.I have searched the forum and this is the closest to my problem.
Just started using ref cursors in my reports.
The problem I am running into is that I have two ref cursor queries in my report - they each contain a column named seq_no which forms a join (in the database) .
My report returns the correct number of records in each query, but I can't find a way to enforce the join. I've tried all the methods I can think of including combining the results into one query.
The IDE won't let me join on a column and when I join on the group (which I make only contain the seq_no fields) that join is ignored.
Can anyone help me on this? -
ORA-01008 with ref cursor and dynamic sql
When I run the follwing procedure:
variable x refcursor
set autoprint on
begin
Crosstab.pivot(p_max_cols => 4,
p_query => 'select job, count(*) cnt, deptno, row_number() over (partition by job order by deptno) rn from scott.emp group by job, deptno',
p_anchor => Crosstab.array('JOB'),
p_pivot => Crosstab.array('DEPTNO', 'CNT'),
p_cursor => :x );
end;I get the following error:
^----------------
Statement Ignored
set autoprint on
begin
adsmgr.Crosstab.pivot(p_max_cols => 4,
p_query => 'select job, count(*) cnt, deptno, row_number() over (partition by
p_anchor => adsmgr.Crosstab.array('JOB'),
p_pivot => adsmgr.Crosstab.array('DEPTNO', 'CNT'),
p_cursor => :x );
end;
ORA-01008: not all variables bound
I am running this on a stored procedure as follows:
create or replace package Crosstab
as
type refcursor is ref cursor;
type array is table of varchar2(30);
procedure pivot( p_max_cols in number default null,
p_max_cols_query in varchar2 default null,
p_query in varchar2,
p_anchor in array,
p_pivot in array,
p_cursor in out refcursor );
end;
create or replace package body Crosstab
as
procedure pivot( p_max_cols in number default null,
p_max_cols_query in varchar2 default null,
p_query in varchar2,
p_anchor in array,
p_pivot in array,
p_cursor in out refcursor )
as
l_max_cols number;
l_query long;
l_cnames array;
begin
-- figure out the number of columns we must support
-- we either KNOW this or we have a query that can tell us
if ( p_max_cols is not null )
then
l_max_cols := p_max_cols;
elsif ( p_max_cols_query is not null )
then
execute immediate p_max_cols_query into l_max_cols;
else
RAISE_APPLICATION_ERROR(-20001, 'Cannot figure out max cols');
end if;
-- Now, construct the query that can answer the question for us...
-- start with the C1, C2, ... CX columns:
l_query := 'select ';
for i in 1 .. p_anchor.count
loop
l_query := l_query || p_anchor(i) || ',';
end loop;
-- Now add in the C{x+1}... CN columns to be pivoted:
-- the format is "max(decode(rn,1,C{X+1},null)) cx+1_1"
for i in 1 .. l_max_cols
loop
for j in 1 .. p_pivot.count
loop
l_query := l_query ||
'max(decode(rn,'||i||','||
p_pivot(j)||',null)) ' ||
p_pivot(j) || '_' || i || ',';
end loop;
end loop;
-- Now just add in the original query
l_query := rtrim(l_query,',')||' from ( '||p_query||') group by ';
-- and then the group by columns...
for i in 1 .. p_anchor.count
loop
l_query := l_query || p_anchor(i) || ',';
end loop;
l_query := rtrim(l_query,',');
-- and return it
execute immediate 'alter session set cursor_sharing=force';
open p_cursor for l_query;
execute immediate 'alter session set cursor_sharing=exact';
end;
end;
/I can see from the error message that it is ignoring the x declaration, I assume it is because it does not recognise the type refcursor from the procedure.
How do I get it to recognise this?
Thank you in advanceThank you for your help
This is the version of Oracle I am running, so this may have something to do with that.
Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production
I found this on Ask Tom (http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:3027089372477)
Hello, Tom.
I have one bind variable in a dynamic SQL expression.
When I open cursor for this sql, it gets me to ora-01008.
Please consider:
Connected to:
Oracle8i Enterprise Edition Release 8.1.7.4.1 - Production
JServer Release 8.1.7.4.1 - Production
SQL> declare
2 type cur is ref cursor;
3 res cur;
4 begin
5 open res for
6 'select * from (select * from dual where :p = 1) connect by 1 = 1'
7 using 1;
8 end;
9 /
declare
ERROR at line 1:
ORA-01008: not all variables bound
ORA-06512: at line 5
SQL> declare
2 type cur is ref cursor;
3 res cur;
4 begin
5 open res for
6 'select * from (select * from dual where :p = 1) connect by 1 = 1'
7 using 1, 2;
8 end;
9 /
PL/SQL procedure successfully completed.
And if I run the same thing on 10g -- all goes conversely. The first part runs ok, and the second
part reports "ORA-01006: bind variable does not exist" (as it should be, I think). Remember, there
is ONE bind variable in sql, not two. Is it a bug in 8i?
What should we do to avoid this error running the same plsql program code on different Oracle
versions?
P.S. Thank you for your invaluable work on this site.
Followup June 9, 2005 - 6pm US/Eastern:
what is the purpose of this query really?
but it would appear to be a bug in 8i (since it should need but one). You will have to work that
via support. I changed the type to tarray to see if the reserved word was causing a problem.
variable v_refcursor refcursor;
set autoprint on;
begin
crosstab.pivot (p_max_cols => 4,
p_query =>
'SELECT job, COUNT (*) cnt, deptno, ' ||
' ROW_NUMBER () OVER ( ' ||
' PARTITION BY job ' ||
' ORDER BY deptno) rn ' ||
'FROM emp ' ||
'GROUP BY job, deptno',
p_anchor => crosstab.tarray ('JOB'),
p_pivot => crosstab.tarray ('DEPTNO', 'CNT'),
p_cursor => :v_refcursor);
end;
/Was going to use this package as a stored procedure in forms but I not sure it's going to work now. -
Hi All,
I have a requirement that i need to execute query having dynamic number of columns using Ref Cursor e.g.
v_string := 'PO_NUMBER , ORG_ID' ;
v_query := 'SELECT '|| v_string || 'FROM table_name';
Can someone please quide me how to define Type dynamically for the above requirement ?
Thanks
Vipul Maheshwarihope you understand how to use this with the help of ref cursor
CURSOR Expressions
A CURSORexpression returns a nested cursor. This form of expression is equivalent to
the PL/SQL REF CURSORand can be passed as a REF CURSORargument to a function.
A nested cursor is implicitly opened when the cursor expression is evaluated. For
example, if the cursor expression appears in a select list, a nested cursor will be
opened for each row fetched by the query. The nested cursor is closed only when:
■ The nested cursor is explicitly closed by the user
■ The parent cursor is reexecuted
■ The parent cursor is closed
■ The parent cursor is cancelled
■ An error arises during fetch on one of its parent cursors (it is closed as part of the
clean-up)
Restrictions on CURSOR Expressions The following restrictions apply to CURSOR
expressions:
■ If the enclosing statement is not a SELECTstatement, then nested cursors can
appear only as REF CURSORarguments of a procedure.
■ If the enclosing statement is a SELECTstatement, then nested cursors can also
appear in the outermost select list of the query specification or in the outermost
select list of another nested cursor.
■ Nested cursors cannot appear in views.
■ You cannot perform BINDand EXECUTEoperations on nested cursors.
Examples The following example shows the use of a CURSORexpression in the
select list of a query:
SELECT department_name, CURSOR(SELECT salary, commission_pct
FROM employees e
WHERE e.department_id = d.department_id)
FROM departments d
ORDER BY department_name;
The next example shows the use of a CURSORexpression as a function argument. The
example begins by creating a function in the sample OEschema that can accept the
REF CURSORargument. (The PL/SQL function body is shown in italics.)
CREATE FUNCTION f(cur SYS_REFCURSOR, mgr_hiredate DATE)
RETURN NUMBER IS
emp_hiredate DATE;
before number :=0;
after number:=0;
begin
loop
fetch cur into emp_hiredate;
exit when cur%NOTFOUND;
if emp_hiredate > mgr_hiredate then
after:=after+1;
else
before:=before+1;
end if;
end loop;
close cur;
if before > after then
return 1;
else
return 0;
end if;
end;
The function accepts a cursor and a date. The function expects the cursor to be a query
returning a set of dates. The following query uses the function to find those managers
in the sample employeestable, most of whose employees were hired before the
manager.
SELECT e1.last_name FROM employees e1
WHERE f(
CURSOR(SELECT e2.hire_date FROM employees e2
WHERE e1.employee_id = e2.manager_id),
e1.hire_date) = 1
ORDER BY last_name; -
Dynamic sql and ref cursors URGENT!!
Hi,
I'm using a long to build a dynamic sql statement. This is limited by about 32k. This is too short for my statement.
The query results in a ref cursor.
Does anyone have an idea to create larger statement or to couple ref cursors, so I can execute the statement a couple of times and as an result I still have one ref cursor.
Example:
/* Determine if project is main project, then select all subprojects */
for i in isMainProject loop
if i.belongstoprojectno is null then
for i in ProjectSubNumbers loop
if ProjectSubNumbers%rowcount=1 then
SqlStatement := InitialStatement || i.projectno;
else
SqlStatement := SqlStatement || PartialStatement || i.projectno;
end if;
end loop;
else
for i in ProjectNumber loop
if ProjectNumber%rowcount=1 then
SqlStatement := InitialStatement || i.projectno;
else
SqlStatement := SqlStatement || PartialStatement || i.projectno;
end if;
end loop;
end if;
end loop;
/* Open ref cursor */
open sql_output for SqlStatement;
Thanks in advance,
Jeroen Muis
KCI Datasystems BV
mailto:[email protected]Example for 'dynamic' ref cursor - dynamic WHERE
(note that Reports need 'static' ref cursor type
for building Report Layout):
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
ref_cur_dyn type_ref_cur_dyn;
BEGIN
OPEN ref_cur_dyn FOR
'SELECT * FROM dept WHERE ' | | NVL (p_where, '1 = 1');
RETURN ref_cur_dyn;
END;
END;
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;
Regards
Zlatko Sirotic
null -
How to populate table name dynamically to a ref cursor
Hi,
I came accross with a requirement that in ref cursor how can i pass the table name
for ex
open ref_cur for select * from emp;Like that i've some 100 tables , instead of typing each and every time the table name
that should be dynamically changed
Like below
open ref_cur for select * from &tbl_nm;How can i do that??
Thank youI assume you are using SQL*Plus:
SQL> variable ref_cur refcursor;
SQL> begin
2 open :ref_cur for select * from &tbl_nm;
3 end;
4 /
Enter value for tbl_nm: emp
old 2: open :ref_cur for select * from &tbl_nm;
new 2: open :ref_cur for select * from emp;
PL/SQL procedure successfully completed.
SQL> print ref_cur
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 12/17/1980 00:00:00 800 20
7499 ALLEN SALESMAN 7698 02/20/1981 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 02/22/1981 00:00:00 1250 500 30
7566 JONES MANAGER 7839 04/02/1981 00:00:00 2975 20
7654 MARTIN SALESMAN 7698 09/28/1981 00:00:00 1250 1400 30
7698 BLAKE MANAGER 7839 05/01/1981 00:00:00 2850 30
7782 CLARK MANAGER 7839 06/09/1981 00:00:00 2450 10
7788 SCOTT ANALYST 7566 04/19/1987 00:00:00 3000 20
7839 KING PRESIDENT 11/17/1981 00:00:00 5000 10
7844 TURNER SALESMAN 7698 09/08/1981 00:00:00 1500 0 30
7876 ADAMS CLERK 7788 05/23/1987 00:00:00 1100 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7900 JAMES CLERK 7698 12/03/1981 00:00:00 950 30
7902 FORD ANALYST 7566 12/03/1981 00:00:00 3000 20
7934 MILLER CLERK 7782 01/23/1982 00:00:00 1300 10
14 rows selected.
SQL> begin
2 open :ref_cur for select * from &tbl_nm;
3 end;
4 /
Enter value for tbl_nm: dept
old 2: open :ref_cur for select * from &tbl_nm;
new 2: open :ref_cur for select * from dept;
PL/SQL procedure successfully completed.
SQL> print ref_cur
DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> SY. -
Error while working with ref cursor
Hi I tried the following but getting the err
DECLARE
TYPE ref_nm IS REF CURSOR;
vref REF_NM;
vemp emp%rowtype;
BEGIN
OPEN vref FOR SELECT ename ,sal FROM EMP;
LOOP
FETCH vref INTO vemp;
EXIT WHEN vref%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ( vemp.ename ||','||vemp.sal );
END LOOP;
CLOSE vref;
END;Error is
ORA-06504: PL/SQL: Return types of Result Set variables or query do not matchSyntactically correct - but a horrible approach performance wise if you only need specific columns.
The basic problem here is using the wrong tool. A ref cursor. Why? There's no reason in this code for using a ref cursor. Using a standard cursor data type addresses the requirement a lot better.
As you can define the cursor:
cursor myCursor is select c1, c2 from tab1;
You can define an array data type for fetching that cursors data - and thus definition does not need to be touched when you change the cursor itself to include/exclude columns:
type TMyCursorBuffer is table of myCursor%RowType;
And finally you can define a bulk collection buffer for bulk processing the output of the cursor:
myBuffer TMyCursorBuffer; -
Dear All,
Version : '11.2.0.2.0'
I have a procedure which gets called from a screen ( on .Net) if use pushes a particular button.
The procedure takes 15 minutes to complete.
My requirement is to intimate the front end(.Net) as soon as the procedures gets called successfully without waiting for its completion as it is going to take 15 mins.
The reason being, the front end will popup a message saying that " The process is going to take long time, A mail will be sent to u after its completion" once it has been intimated that the procedure has been called successfully.
Could you please suggest can i return a cursor to front end without even manipulating the data.
i hope my question is understandable.9876564 wrote:
Dear All,
Version : '11.2.0.2.0'
I have a procedure which gets called from a screen ( on .Net) if use pushes a particular button.
The procedure takes 15 minutes to complete.
My requirement is to intimate the front end(.Net) as soon as the procedures gets called successfully without waiting for its completion as it is going to take 15 mins.
The reason being, the front end will popup a message saying that " The process is going to take long time, A mail will be sent to u after its completion" once it has been intimated that the procedure has been called successfully.
Could you please suggest can i return a cursor to front end without even manipulating the data.
i hope my question is understandable.
It seems to me that your problem is not an Oracle one, but a user interface one.
I'm assuming the slowness of the procedure is due to how long it's taking to query the data, and if you can't speed that up then, to have the procedure return a ref cursor, the connection between the front end and the procedure must be maintained (the process on Oracle must belong to a session, and the front end needs to be connected to that session).
So, you can't have Oracle go off and start a seperate process and then pass back the ref cursor when it's finished, because even though you can spawn off seperate processes such as using DBMS_JOB or DBMS_SCHEDULER, they will run in their own 'session' and the calling code won't keep a hold on any of those sessions... they're effectively stand-alone and seperate.
What you'll have to do is likely get your .net application to spawn off a child process to the main app, that presents the message saying it'll take some time, does the call to Oracle and waits for Oracle to return the resultant ref cursor, which it can then pass back to the main application etc. Due to .net allowing for multi-tasking, that is where the split processing should take place. -
Parallel piplelined function not parallelizing with ref cursor
RDBMS 11.2.0.3
I have a function with the following signature
function to_file (
p_source in sys_refcursor
, p_file_name in varchar2
, p_directory in varchar2 default 'DD_DUMP'
return dd_dump_ntt
pipelined
parallel_enable ( partition p_source by any )
authid current_user;The function works in parallel when I use a cursor expression like this
begin
for rec in ( select *
from table(dd_dump.to_file( cursor(select /*+ parallel(i 4) */ c1||chr(9)||c2 from mytable i), 'f.out' ))
loop
dbms_output.put_line(rec.file_name || chr(9) || rec.num_records );
end loop;
end;
f.out_162 276234
f.out_213 280399
f.out_230 286834
f.out_70 289549But when I use a refcursor, it does not run in parallel
declare
rc sys_refcursor;
begin
open rc for 'select /*+ parallel(i 4) */ c1||chr(9)||c2 from mytable i';
for rec in ( select *
from table(dd_dump.to_file( rc, 'f.out' ))
loop
dbms_output.put_line(rec.file_name || chr(9) || rec.num_records );
end loop;
end;
f.out_914 1133016Is this an expected behavior or am I doing something wrong? How can I use the function when the client returns the SQL statement as a character string
Edited by: Sanjeev Chauhan on Mar 9, 2012 11:54 AMSanjeev Chauhan wrote:
I am not performing any DML in the pipelined function. If you read the note carefuly it shows parallel_enable works only when you use:
table(table_function(<font color=red>CURSOR</font>(select...)))and not when you use
table(table_function(<font color=red>ref-cursor-name</font>))SY. -
VC 7.0 Oracle stored procedures resultset with ref cursor
Can VC (we are on NW7 SP13) handle Oracle's datatype ref cursor - which is the standard solution in Oracle to return result sets - as the return value of a stored procedure?
When testing a data service in the VC story board based upon a simple Oracle function like:
create or replace package pkg_dev
is
type t_cursor is ref cursor;
end;
create or replace function vc_stub return pkg_dev.t_cursor
as
l_cursor pkg_dev.t_cursor;
begin
open l_cursor for select ename from emp;
return l_cursor;
end;
(just as example - I know that could be easily retrieved using the BI JDBC connector framework and accessing tables / views)
I am always running in the "portal request failed ( Could not execute Stored Procedure)" error - so I am not able to use the "add fields" function to bind the output.
The defaulttrace contains entries like:
Text: com.sap.portal.vc.HTMLBRunTime
[EXCEPTION]
com.sapportals.connector.execution.ExecutionException: Could not execute stored procedure
Caused by: java.sql.SQLException: Invalid column type
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
We deployed Oracle's own jdbc-driver for Oracle 10g. Using that driver and a portal jdbc connector framework entry the stored procedures of the Oracle database user mapped to the portal user are discovered and available in the "Find Data Services" section.We deployed the drivers as described in the HowTo Papers (e.g.Hwo to Configure UD Connect on the J2EE Server for JDBC Access to External Databases). When deploying the drivers you assign a freely definable name for the set of Oracle's jar-files (eg. oracle_10) as library name. Having deployed the drivers in that way only System Definitions via BI JDBC connector framework were working. With a little help from SAP Support (call lasted more than 2 months till a very capable member of the support team made things working in a very short time) we got the portal jdbc connection with Oracle's jar-files working:
Here are instructions how to add reference:
1. Connect to the j2ee using telnet, e.g in the cmd window type:
telnet <host> <port> + 8, enter uid and pwd of j2ee admin.
2. jump 0
3. add deploy
4. change_ref -m com.sapportals.connectors.database <your lib name> <your lib name = oracle_10>
Trying to manually add this reference in visual admin connector container for JDBCFactory failed - reference could be added and saved, but then disappeared (at least in NW7 with SP12). Adding the reference as described above solved the problem. -
64bit OraOLEDB failed when calling stored procedure with Ref Cursor
Hi everyone,
I used the ADO VB sample provided with the Oracle 10g provider installation.
But I compiled it in 64bit Visual Studio 2005 and ran on Windows 2003 x64 server.
The function call "cmd.Execute" when it is trying to call a stored procedure which has an Out Ref Cursor parameter. The exception is
"PLS-00306: wrong number or types arguments in call"
I already set the property "PLSQLRSet" to true. But it doesn't help.
The same code works if I compiled in 32 bit.
It also works if the stored procedure does not have Ref Cursor parameter.
I am guessing this is a bug in the 64bit Oracle provider. Anyone can confirm this please? or am I missing anything?
WilsonIt appears to work with 11.1.0.6.20 OLEDB provider but only for ExecuteNonQuery, I'm not able to work with Fill, and yes... in x86 works perfectly, but in x64 we are still having the ORA-06550 and PLS-00306 error.
Our Connection string is as follows:
"Provider=OraOLEDB.Oracle.1;OLEDB.NET=true;Password=xxxxx;Persist Security Info=True;User ID=exxxxx;Data Source=ECOR; PLSQLRSet=True"
We are not using ODP.NET.
Can you confirm that Fill method works with such update? -
Stored procedure call with REF CURSOR from JDBC
How can I call a SP with a REF CURSOR OUT parameter from JDBC?
This is a breeze.
CallableStatement oraCall = oraConn.prepareCall("BEGIN PKG_SOMETHING.RETURNS_A_SP(?);END;");
oraCall.registerOutParameter(1,oracle.jdbc.driver.OracleTypes.CURSOR);
oraCall.execute();
ResultSet rsServList = (ResultSet) oraCall.getObject(1);
... use ResultSet ...
rsServList.close();
oraCall.close();
slag -
Dynamic query and Open Cursor fetch into ??
Hi;
I think we took the wrong turn some were... because looks like a dead end...
What I need to do:
Create a procedure to compare two generic tables in diferente databases and find rows that have diferent data.
(No restritions on what tables it might compare)
What I have done:
CREATE OR REPLACE PROCEDURE COMPARE_TABLES_CONTENT_V3(
tableName_A IN VARCHAR2, tableName_B IN VARCHAR2, filter IN VARCHAR2) AS
-- Get all collumns present in [TableName_A]
-- This is necessary to create a dynamic query
select column_name bulk collect
into v_cols1
from all_tab_columns
where table_name = v_tab1
and owner = nvl(v_own1, user)
order by column_id;
-- If there is no columns in table A ... them no need to proceed
if v_cols1.count = 0 then
dbms_output.put_line('[Error] reading table ' || tableName_A ||
' collumns information. Exit...');
return;
end if;
-- Collect Collumns information by ',' separated, for the query
for i in 1 .. v_cols1.count loop
compareCollumns := compareCollumns || ',' || v_cols1(i);
end loop;
-- Create the query that gives the diferences....
getDiffQuery := 'select ' || compareCollumns ||
' , count(src1) CNT1, count(src2) CNT2 from (select a.*, 1 src1, to_number(null) src2 FROM ' ||
tableName_A ||
' a union all select b.*, to_number(null) src1, 2 src2 from ' ||
tableName_B || ' b) group by ' || compareCollumns ||
' having count(src1) <> count(src2)';
Whats the problem?
I'm lost...I can access the query using debugging on the oracle procedure... and run it OK on a new SQL window. No problem here... its perfect.
But I dont know how to access this information inside the procedure, I need to format the information a bit...
I try a cursor...
open vCursor for getDiffQuery;
fetch vCursor into ??????? -- Into what... query, columns and tables is all dynamic...
close vCursor;
Any ideas..Making the issue more simple....
At this point I have a oracle procedure that generates a dynamic sql query, based on the table names passed by parameter.
getDiffQuery := 'select ' || compareCollumns || (.....)
end procedure;
This ''getDiffQuery'' contains a query that gets the diferences in the tables. (Working fine)
I would like to access this information in the same procedure.
I cant use cursor because the table, columns... actualy all is dynamic based on the generated query:( !
Maybe you are looking for
-
I've lost my hue/saturation screen in photoshop. How do I get it back?
I've lost my hue/saturation screen in photoshop. How do I get it back?
-
Flag to identify if Partial payment made to Accoutning document
Hi, I've an issue with a scenario presented to me. I'm an ABAPer. I have a set of FI documents in a Z-table which are open. We check if they have migrated to BSAD (Customer Closed AR) and decide if they are open or closed. The issue currently is; if
-
Stay awake option while charging in the developer options section in settings
Since 4.4 update, my phone will not stay awake while connected to power as before, the screen blacks out in 10min which is the setting I have the display on. BTW, what has happened to the forum format? I don't like the changes, I like seeing the pos
-
Hello. I'm trying to install arch, but I've been stuck on configuring network for a day already. The point is: I need to connect to the local university network (wired) to be able to connect to the Internet via PPPoE. The university network has PEAP
-
Call front-end API from WD ABAP
Hi experts, I'm trying to call font-end API (Destination: SAP_SSFATGUI) from webdynpro. It giving me communication_error but if i call it from ABAP its working. Pls help.