Procedure to return a recordset in ASP.
I'll admint that my background is with MS SQL and Oracle is a bit different!
In SQL I can create a stored procedure that will return a recordset, filtered by the parameter that I pass to the procedure. Such as:
CREATE PROCEDURE sp_DriverList @BusCoID int
AS
SELECT DISTINCT ListName, DriverID
FROM T_Drivers
WHERE BusCoID = @BusCoID
ORDER BY ListName
In ASP I get back a list of all the Drivers for a given company, using the @BusCoID parameter.
When I try to implement this same method in Oracle 9i, I get an error. Can someone provide an example, comparable to the SQL version above, that would return a recordset?
Thanks!!!
Your post will likely get a better response on the ODP.NET forum, but here's how I would do it.
CREATE OR REPLACE PACKAGE my_package
IS
TYPE refc IS REF CURSOR
RETURN t_drivers%ROWTYPE refc;
Function fetch_drivers(p_busid_in IN number);
END my package;
CREATE OR REPLACE PACKAGE BODY my_package
IS
Function fetch_drivers (p_busid_in IN number)
IS
l_curser refc;
BEGIN
OPEN l_cursor FOR
SELECT DISTINCT ListName, DriverID
FROM T_Drivers
WHERE BusCoID = p_busid_in
ORDER BY ListName;
RETURN l_cursor;
END fetch_drivers;
Similar Messages
-
How to test a procedure which returns a recordset from pl/sql
hello,
Is it possible to test a procedure which returns a recordset from pl/sql?
Everything I try results in errors like PLS-00382: expression is of wrong type, when I try to open the result cursor
or PLS-00221: tc is not a procedure or is undefined.
I created the following procedure:
CREATE OR REPLACE PACKAGE test AS
TYPE cursorType is REF CURSOR;
PROCEDURE test_cursor( tc IN OUT cursorType,
v_err OUT varchar2,
v_msg OUT varchar2);
END;
CREATE OR REPLACE
PACKAGE BODY test AS
PROCEDURE test_cursor
(tc IN OUT cursorType,
v_err OUT varchar2,
v_msg OUT varchar2)
AS
BEGIN
open tc for
SELECT '1' "number" FROM dual
union
select '2' "number" from dual;
v_msg := 'no errors';
v_err := 0;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_msg := 'no data found';
v_err := SQLCODE;
WHEN OTHERS
THEN
v_msg := SQLERRM;
v_err := SQLCODE;
END;
END;
I try to get the output from pl/sql with something like this:
DECLARE
TC PROVGRON.TEST.cursorType;
V_ERR VARCHAR2(200);
V_MSG VARCHAR2(200);
BEGIN
V_ERR := NULL;
V_MSG := NULL;
PROVGRON.TEST.TEST_CURSOR ( TC, V_ERR, V_MSG );
DBMS_OUTPUT.Put_Line('V_ERR = ' || V_ERR);
DBMS_OUTPUT.Put_Line('V_MSG = ' || V_MSG);
-- in tc I was hoping to hava a cursor??
FOR i IN tc
LOOP
DBMS_OUTPUT.PUT_LINE (i.number);
END LOOP;
END;
Without the for loop (or open tc) the pl/sql will output:
V_ERR = 0
V_MSG = no errors
PL/SQL procedure successfully completed.
With anything I try with the cursor I get errors?
What am I doing wrong?http://download.oracle.com/docs/cd/B19306_01/server.102/b14357/ch5.htm#sthref1122
-
Error executing Stored Procedure that returns a recordset in Visual Basic 6
Hello, i tried to use the example in the link posted as a response to my question in a previous thread, and in Visual Basic 6, when i execute the Stored procedure it gives me the following error:
This is the package created as indicated in the example FAQ you posted.
package types
as
type cursorType is ref cursor;
end;
This is the procedure created as indicated in the example FAQ you posted.
PROCEDURE SP_TITUVALO(T_BR IN VARCHAR2,
P_Cursor OUT TYPES.cursorType )
AS
BEGIN
OPEN P_Cursor FOR
SELECT * FROM TASAS WHERE BR=T_BR AND TASA > 0;
END;
This is the code used to execute the Stored Procedure in VB6:
Dim objConn As New ADODB.Connection
Dim connString
Dim cmdStoredProc As New ADODB.Command
Dim param1 As New ADODB.Parameter
Dim RS As ADODB.Recordset
Set param1 = cmdStoredProc.CreateParameter("T_BR", adVarChar, adParamInput, 255, "97")
cmdStoredProc.Parameters.Append param1
objConn.Open strconex
Set cmdStoredProc.ActiveConnection = objConn
cmdStoredProc.CommandText = "SP_TITUVALO"
cmdStoredProc.CommandType = adCmdStoredProc
Set RS = cmdStoredProc.Execute
This is the error returned:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'SP_TITUVALO'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
****************************************************************Juan,
Not sure about FAQ you are referring to, but it seems that you need to set PLSQLRSet property of ADODB.Command to TRUE. Because if you fail to do so - errors with refcursors are likely to happen.
Consider:
Set objConn = CreateObject("ADODB.Connection")
objConn.ConnectionString = "Provider=OraOLEDB.Oracle;Persist Security Info=False;Data Source=test9ora;User ID=max;Password=blabla"
objConn.Open
'Dim cmdStoredProc
Set cmdStoredProc = CreateObject("ADODB.Command")
Dim param1
Set param1 = cmdStoredProc.CreateParameter("T_BR", adVarChar, adParamInput, 255, "97")
param1.Value = "X"
cmdStoredProc.Parameters.Append param1
'Dim RS
Set cmdStoredProc.ActiveConnection = objConn
'The following line was missed out
cmdStoredProc.Properties("PLSQLRSet") = True
cmdStoredProc.CommandText = "SP_TITUVALO"
cmdStoredProc.CommandType = adCmdStoredProc
Set RS = cmdStoredProc.ExecuteThis works fine, at least for me.
Cheers. -
Return a Recordset in a PL/SQL
Hello All,
I'm attempting to write a PL/SQL statement over some very large tables. The processing of the statement takes over 45 minutes to complete.
I've been able to speed up processing by creating a temp table over the largest of the tables, and it truly has speed up processing. The problem is that this statement will be used in a report run from SQL Reporting Services, using PL/SQL. This will be used in various reports and would like to make this an adhoc type of job - launched by executing the report.
I've tried writing a procedure that returns a recordset, but I'm having no luck. I'm new to writing Stored Procedures, Functions and Packages, and am trying to get my head around the best way to approach this.
Here is what I have so far - and it's not even close to working, but you can see the logic I'm trying to follow as far was what I need to return.
CREATE OR REPLACE PACKAGE PKG_BillSegs_ZeroUsage AS
TYPE cursor_type IS REF CURSOR;
Procedure GETBILLSEG_ZEROUSAGE (
p_RevMth IN bi_bill_segment.rev_month%TYPE,
p_recordset OUT PKG_BillSegs_ZeroUsage.cursor_type);
END PKG_BillSegs_ZeroUsage;
CREATE OR REPLACE PROCEDURE GetBillSeg_ZeroUsage (p_RevMth IN bi_bill_segment.rev_month%TYPE,
p_recordset OUT PKG_BillSegs_ZeroUsage.cursor_type) AS
BEGIN
OPEN p_recordset FOR
select * from bi_bill_segment where usage_qty = 0 and rev_month = p_RevMth;
END GetBillSeg_ZeroUsage;
Any help is greatly appreciated!Here's the output from explain plan - sorry for the output, but couldn't get it to be any prettier :
OPERATION OPTIONS OBJECT_NAME OBJECT_TYPE OPTIMIZER SEARCH_COLUMNS ID PARENT_ID POSITION COST CARDINALITY BYTES
SELECT STATEMENT REMOTE CHOOSE 0 91911 91911 2 4902
TABLE ACCESS BY INDEX ROWID BI_BILL_SEGMENT_T ANALYZED 1 0 1 91911 2 4902
INDEX RANGE SCAN BI_BILL_SEGMENT_IE7 NON-UNIQUE ANALYZED 1 2 1 1 659 178774 -
Executing a Function in a Stored Procedure to Return Cursor
I have a function named f_CPCRBPBR who base on the following types
CREATE Or Replace TYPE RecType_fAC
AS OBJECT ( << Structure >>);
CREATE Or Replace TYPE Tbl_fAC
AS TABLE OF RecType_fAC;
Create Or Replace
Function f_CPCRBPBR (
i_Vtp Varchar2,
i_Mnth Varchar2,
i_Location Varchar2,
i_vno integer,
i_vnoTo integer,
St_Date Varchar2,
En_Date Varchar2
Return TBL_fAC
Pipelined
Is
RetVal RecType_fAC;
Begin
Now the problem is that I want to Call this Function from Within a Procedure who would return the Recordset..
can any body suggest..
I want to use the Record Type used for the Said Function..
Please Help..This is Excellent .. This is great.. actually this is marvellous.. can u please defined a bit about Sys_RefCursor...
this is an excellent thing..
I finally Concluded the procedure as follows who not only called but also returned the cursor..
Create Or Replace Procedure p_CPCRBPBR (TstCrsr In Out Sys_RefCursor,
i_Vtp Varchar2,
i_Mnth Varchar2,
i_Location Varchar2,
i_vno integer,
i_vnoTo integer,
St_Date Varchar2,
En_Date Varchar2
as
Begin
Open TstCrsr FOr
Select * from Table(f_CPCRBPBR (i_VTP, i_Mnth, i_Location, i_VNo, i_VNoTo, '', ''));
End;
Can u please help me what will be the exact syntax to call / test this procedure in SQL Developer..
as if i try this procedure as
Execute p_CPCRBPBR null, 'CP', '01', 'L', 1, 1, null, null
it give error Invalid SQL Statement ..
2. Can u please check this code and refer me a solution for Calling this function
create or replace function NewTest (iEN Integer)
return sys_refcursor
as
rc sys_refcursor;
begin
open rc for select * from Scott.Emp Where EmpNo=iEN;
return rc;
end;
This function easily created but when i tried to execute this with the following statement
Select * from Table(NewTest (7369))
It gives error
Cannot Access Rows From a Non-Nested Table Item..
.. Thanx for ur patience... -
How in ColdFusion with in variables get a Oracle stored procedure to return values?
How in ColdFusion with in variables get a Oracle stored procedure to return values?
We have tried several things, we can get a stored procedure to return a result set if we are not passing in variables but we cannot get them when we are passing in variables.
We know how to do it calling MS SQL.
Thanks for any help,
Nathan Sr
P.S. we have heard this may not be possible with the current Oracle Driver is there a different Oracle driver?I can only barely understand what you're asking here (not from a technical perspective, but from understanding your written English), but I suspect you're wanting to know how to pass back values other than recordsets from Oracle?
You should be able to pass them back via a type=out proc param, shouldn't you?
If you could reword your post so it's a bit more coherent, and possibly post some code, that might help.
Adam -
[perl] How call function/procedure that returns SYS_REFCURSOR type?
I've got some simple procedure which returns record(s):
CREATE OR REPLACE PROCEDURE "GET_SYS_DATE"
RESULTSET IN OUT SYS_REFCURSOR
IS
BEGIN
OPEN RESULTSET FOR
SELECT SYSDATE FROM DUAL;
END;
In perl i invoke it with somthing like this:
my $ret;
my $s= "BEGIN GET_SYS_DATE(:1); END;";
my $sth = $dbh->prepare($s);
$sth->bind_param_inout(1, \$ret, 0 { TYPE => XXX}); # tried to use many DBD::SQL_* types (SQL_ROW, SQL_REF, etc.)
$sth->execute(); #... but without luck
I always get:
DBD::ODBC::st execute failed: [Oracle][ODBC][Ora]ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'GET_SYS_DATE'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
Of course if i use other datatype in SP (e.g. VARCHAR2) and bind it as SQL_VARCHAR it works well... Moreover, if i use DBD::Oracle and bind it as ORA_RSET type it also works.
Is it possible that ODBC doesn't know SYS_REFCURSOR type? Then, is there any way to call SP and retrieve cursor from perl without using DBD::Oracle?
Or, if it is possible, then how to retrieve that cursor and data stored within it? Any help?Hi,
I have not one eensy teensy bit of knowledge about PERL, other than how to spell it.
I do however, know about ref cursors, and ODBC, so maybe this will help.
ODBC has nothing for REF CURSOR built in. ODBC is made to the lowest common denoninator of databases, and a refcur is an Oracle thing. So, what that means is that you can't BIND anythign to the ref cursor, as there is no appropriate ODBC type to bind.
Does that mean you can't call a refcur via ODBC? No, it doesnt.
What happens is that Oracle's ODBC driver kinda "magically" goes out behind the scenes and describes the procedure or pacakge to determine if any of the parameters are ref cursors, and if so automatically sets up the bind for them.
Here's a complete working example using VB and ADO rather than PERL, but maybe you can port it over and get it working. Note that the proc takes two params, but we only bind one (for the IN number)
Hope it helps,
Greg
'create or replace package testrefcur as
' type mycur is ref cursor;
' procedure getemps(dno in number, ecur out mycur);
' end;
'create or replace package body testrefcur as
'procedure getemps(dno in number, ecur out mycur) is
' begin
' open ecur for select * from emp where deptno = dno;
' end;
'end;
Private Sub Command1_Click()
Dim con As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
strcnn = "dsn=orcl;uid=scott;pwd=tiger"
con.Open strcnn
cmd.CommandText = "{call testrefcur.getemps(?)}"
Set cmd.ActiveConnection = con
Set param1 = cmd.CreateParameter("param1", adNumeric, adParamInput, 4)
param1.Value = 10
param1.Precision = 4
cmd.Parameters.Append param1
Set rst = cmd.Execute
While Not rst.EOF
strrslt = strrslt & rst.Fields("ename").Value & " "
rst.MoveNext
Wend
MsgBox strrslt
End Sub -
The simplest way for plsql procedure to return multiple rows
Hi,
What is the simplest way for plsql procedure to return multiple rows (records). There are many combination of ways to do it but I am looking for a solution that is appropriate for plsql beginners. Many solutions use cursors, cursor variables, collections and more that kind of things that are complex on the face of it. Is it somehow possible to achieve the same with less effort?
Sample query would be: SELECT * FROM EMPLOYEES;
I want to use returned rows in APEX to compose APEX SQL(in that context plsql) report.
It is enough to use just SELECT * FROM EMPLOYEES query in APEX but I want to use plsql procedure for that.
Thank you!Hi,
It depends :-).
With +...that is appropriate for plsql beginners...+ in mind... it still depends!
The list of techniques (ref cursors, cursor variables, collections, arrays, using explict SQL) you have referenced in your post can be made to work. but...
+Is it somehow possible to achieve the same with less effort?+ Less effort : That needs to be defined (measured). Especially in the context of pl/sql beginners (who is a beginner?) .
What is the level of "programming experience" ?
What is the level of understanding of "Relational Result set" as processible in Oracle?
If you are looking for
Process_the_set_of rows_in APEX () kind of capabilitywhich "abstracts/hides" relation database from developers when working on relation database, it may not be the best approach (at least strategically). Because I believe it already is abstracted enough.
I find REF CUROSOR most effective for such use, when the "begginer" has basic understanding of processing SQL result set .
So in a nut shell, the techniques (that you already are familiar with) are the tools available. I am not aware of any alternative tools (in pure Oracle) that will simplify / hide basics from develpers.
vr,
Sudhakar B. -
Calling stored procedure and returning multiple resultsets
Hello,
Is it possible to create a procedure that return multiple result sets?
e.g.
procedure GetDataFromTables() is
begin
select * from table_one;
select * from table_two;
end GetDataFromTables;
And I want to call this procedure that returns multiple resultsets (one for table_one and another for table_two)
I have referred to the OCCI sample occiproc.cpp, but I am not sure how to handle multiple resultsets.
Your help is highly appreciated.Thank You,
Got the REF cursor in storedproc.cpp.
But as it is documented, getCursor() gets the REF CURSOR value of an OUT parameter as a ResultSet.
So, is it true that if I have to write a procedure that selects * from 50 tables (50 SQL statements) , I have to set 50 OUT parameters to get the result sets.?
Is there any better way of doing this?
e.g. in DB2, we can open multiple cursors in the procedure body and then get the result set one after another.
CREATE PROCEDURE get_staging_data ()
RESULT SETS 1 <no. of result sets>
LANGUAGE SQL
BEGIN ATOMIC
DECLARE L_SQL varchar(5000);
DECLARE c CURSOR WITH RETURN TO CLIENT FOR L_STMT;
SET L_SQL = '';
SET L_SQL = 'SELECT * FROM ';
SET L_SQL = L_SQL || IN_Tab_Name ;
SET L_SQL = L_SQL || ' WHERE VERIFY_FLAG=''S'' FOR READ ONLY OPTIMIZE FOR 2000 ROWS' ;
PREPARE L_STMT FROM L_SQL;
OPEN c; < can open multiple cursors in the prodedure body>
END -
Sort/filter datablock based on procedure that return table type
Hi All,
I’ve got datablock based on procedure that return table type. In the form I have to provide ‘filter and sort records’ functionality. Previously, using tables/views based datablocks, I’ve done that by using:
-- filter
SET_BLOCK_PROPERTY (L_BLOCK_NAME, DEFAULT_WHERE, L_WHERE_CLAUSE);
-- sort
SET_BLOCK_PROPERTY(L_BLOCK_NAME ,ORDER_BY, L_ORDER_BY_CLAUSE);
-- and then
EXECUTE_QUERY;
It doesn’t work with procedure that return table type. How I can do that?
BartekI agree with Andreas, from the sample you have given us, I don't see any reason why you could not merge these queries into a single UNION/UNION ALL query. Also, I would add your summation query to your main query to eliminate this extra step. The result would look something like:
SELECT DISTINCT
pih.id
,d.document_id
,pih.doc_serial_no
,pih.purch_invoice_date
,oh.company_name
,(SELECT NVL(SUM(amount),0)
FROM "YOUR TABLE HERE" yth
WHERE yth."YOUR COLUMN HERE" = pih.id) AS sum_amount
FROM "YOUR TABLES HERE"
WHERE "YOUR JOIN CONDITIONS HERE"
UNION ALL
SELECT DISTINCT
sih.id
,d.document_ind
,sih.doc_serial_no
,sih.sales_invoice_date
,sih.company_name
,(SELECT NVL(SUM(amount),0)
FROM "YOUR TABLE HERE" yth
WHERE yth."YOUR COLUMN HERE" = sih.id) AS sum_amount
FROM "YOUR TABLES HERE"
WHERE "YOUR JOIN CONDITIONS HERE"
[/code]
Hope this helps.
Craig...
+If a response is helpful or correct, please mark it accordingly+
Edited by: CraigB on Feb 23, 2010 1:39 PM
It appears the CODE tags are not working as well as the URL tags. :( -
Calling a stored procedure which returns a value
Hi Friends,
I want to call a stored procedure which returns a value.
Eg
create or replace procedure xyz(a1 in varchar2, a2 in varchar2, z1 out number)
thanksHi,
use this.
declare
retval number;
begin
abc('aaa','bbb',retval);
dbms_output.put_line('retval is ' ||retval);
end;
--Basava.S -
Stored procedure that returns a cursor (result set)
Hi,
We have a stored procedure that returns a cursor (result set) but when I compliled it and catalouged (introspected) it in the OBPM I got all the primitive type parameters (either IN or OUT) in the proc call except the cursor type (the result set) which is the out param of the stored proc.
Any pointers please?
ThanksResult set is of RowType and is not supported as a Stored Procedure as far as I know.
HTH
Sharma -
Stored procedure that returns multiple tables
Hello everyone,
I was wondering if there's a way to write a stored procedure that returns multiple result set as in sql server. for example, in sql server, you can write 2 select statements and when loading them in c#, u can get two data tables.
I am not sure having a single ref cursor for each select is the only solution. I might need to return a variable number of tables per procedure call (based on a certain criteria).
Any ideas?
thanks for your timeSure. Ref cursor is the only easier answer for your problem.
satyaki>
satyaki>select * from v$version;
BANNER
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
Elapsed: 00:00:01.43
satyaki>
satyaki>create or replace procedure ref_gen_arg(choice in int,b in out sys_refcursor)
2 is
3 str varchar2(500);
4 begin
5 if choice = 1 then
6 str := 'select * from emp';
7 elsif choice = 2 then
8 str := 'select * from dept';
9 end if;
10
11 open b for str;
12 exception
13 when others then
14 dbms_output.put_line(sqlerrm);
15 end;
16 /
Procedure created.
Elapsed: 00:00:04.38
satyaki>
satyaki>
satyaki>declare
2 rec_x emp%rowtype;
3 rec_y dept%rowtype;
4 w sys_refcursor;
5 begin
6 dbms_output.enable(1000000);
7 ref_gen_arg(1,w);
8 loop
9 fetch w into rec_x;
10 exit when w%notfound;
11 dbms_output.put_line('Employee No: '||rec_x.empno||' - '||
12 'Name: '||rec_x.ename||' - '||
13 'Job: '||rec_x.job||' - '||
14 'Manager: '||rec_x.mgr||' - '||
15 'Joining Date: '||rec_x.hiredate||' - '||
16 'Salary: '||rec_x.sal||' - '||
17 'Commission: '||rec_x.comm||' - '||
18 'Department No: '||rec_x.deptno);
19 end loop;
20 close w;
21
22 ref_gen_arg(2,w);
23 loop
24 fetch w into rec_y;
25 exit when w%notfound;
26 dbms_output.put_line('Department No: '||rec_y.deptno||' - '||
27 'Name: '||rec_y.dname||' - '||
28 'Location: '||rec_y.loc);
29 end loop;
30 close w;
31 exception
32 when others then
33 dbms_output.put_line(sqlerrm);
34 end;
35 /
Employee No: 9999 - Name: SATYAKI - Job: SLS - Manager: 7698 - Joining Date: 02-NOV-08 - Salary: 55000 - Commission: 3455 - Department No: 10
Employee No: 7777 - Name: SOURAV - Job: SLS - Manager: - Joining Date: 14-SEP-08 - Salary: 45000 - Commission: 3400 - Department No: 10
Employee No: 7521 - Name: WARD - Job: SALESMAN - Manager: 7698 - Joining Date: 22-FEB-81 - Salary: 1250 - Commission: 500 - Department No: 30
Employee No: 7566 - Name: JONES - Job: MANAGER - Manager: 7839 - Joining Date: 02-APR-81 - Salary: 2975 - Commission: - Department No: 20
Employee No: 7654 - Name: MARTIN - Job: SALESMAN - Manager: 7698 - Joining Date: 28-SEP-81 - Salary: 1250 - Commission: 1400 - Department No: 30
Employee No: 7698 - Name: BLAKE - Job: MANAGER - Manager: 7839 - Joining Date: 01-MAY-81 - Salary: 2850 - Commission: - Department No: 30
Employee No: 7782 - Name: CLARK - Job: MANAGER - Manager: 7839 - Joining Date: 09-JUN-81 - Salary: 4450 - Commission: - Department No: 10
Employee No: 7788 - Name: SCOTT - Job: ANALYST - Manager: 7566 - Joining Date: 19-APR-87 - Salary: 3000 - Commission: - Department No: 20
Employee No: 7839 - Name: KING - Job: PRESIDENT - Manager: - Joining Date: 17-NOV-81 - Salary: 7000 - Commission: - Department No: 10
Employee No: 7844 - Name: TURNER - Job: SALESMAN - Manager: 7698 - Joining Date: 08-SEP-81 - Salary: 1500 - Commission: 0 - Department No: 30
Employee No: 7876 - Name: ADAMS - Job: CLERK - Manager: 7788 - Joining Date: 23-MAY-87 - Salary: 1100 - Commission: - Department No: 20
Employee No: 7900 - Name: JAMES - Job: CLERK - Manager: 7698 - Joining Date: 03-DEC-81 - Salary: 950 - Commission: - Department No: 30
Employee No: 7902 - Name: FORD - Job: ANALYST - Manager: 7566 - Joining Date: 03-DEC-81 - Salary: 3000 - Commission: - Department No: 20
Department No: 10 - Name: ACCOUNTING - Location: NEW YORK
Department No: 20 - Name: RESEARCH - Location: DALLAS
Department No: 30 - Name: SALES - Location: CHICAGO
Department No: 40 - Name: LOGISTICS - Location: CHICAGO
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.73
satyaki>Regards.
Satyaki De. -
Function calling stored procedure that returns a cursor into a LOV
Hello,
Is it possible in HTML DB to implement a process that has a function that calls a stored procedure that returns a cursor, used to then populate a select list?
Or can I do a function call to a stored procedure in the 'List of values definition' box for the item itself that returns a cursor to populate the item's select list?Hi Vikas,
Actually, I just found another posting that shows how to do what I'm looking for:
Re: Filling a LOV with a cursor
Check it out. I posted another question in response to that discussion...maybe you could answer that? Thanks!
Laura -
Invoking stored procedure that returns array(oracle object type) as output
Hi,
We have stored procedures which returns arrays(oracle type) as an output, can anyone shed some light on how to map those arrays using JPA annotations? I tried using jdbcTypeName but i was getting wrong type or argument error, your help is very much appreciated. Below is the code snippet.
JPA Class:
import java.io.Serializable;
import java.sql.Array;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.eclipse.persistence.annotations.Direction;
import org.eclipse.persistence.annotations.NamedStoredProcedureQuery;
import org.eclipse.persistence.annotations.StoredProcedureParameter;
* The persistent class for the MessagePublish database table.
@Entity
@NamedStoredProcedureQuery(name="GetTeamMembersDetails",
procedureName="team_emp_maintenance_pkg.get_user_team_roles",
resultClass=TeamMembersDetails.class,
returnsResultSet=true,
parameters={
@StoredProcedureParameter(queryParameter="userId",name="I_USER_ID",direction=Direction.IN,type=Long.class),
@StoredProcedureParameter(queryParameter="employeeId",name="I_EMPLOYEEID",direction=Direction.IN,type=Long.class),
@StoredProcedureParameter(queryParameter="TEAMMEMBERSDETAILSOT",name="O_TEAM_ROLES",direction=Direction.OUT,jdbcTypeName="OBJ_TEAM_ROLES"),
@StoredProcedureParameter(queryParameter="debugMode",name="I_DEBUGMODE",direction=Direction.IN,type=Long.class)
public class TeamMembersDetails implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private long userId;
private List<TeamMembersDetailsOT> teamMembersDetailsOT;
public void setTeamMembersDetailsOT(List<TeamMembersDetailsOT> teamMembersDetailsOT) {
this.teamMembersDetailsOT = teamMembersDetailsOT;
public List<TeamMembersDetailsOT> getTeamMembersDetailsOT() {
return teamMembersDetailsOT;
Procedure
PROCEDURE get_user_team_roles (
i_user_id IN ue_user.user_id%TYPE
, o_team_roles OUT OBJ_TEAM_ROLES_ARRAY
, i_debugmode IN NUMBER :=0)
AS
OBJ_TEAM_ROLES_ARRAY contains create or replace TYPE OBJ_TEAM_ROLES_ARRAY AS TABLE OF OBJ_TEAM_ROLES;
TeamMembersDetailsOT contains the same attributes defined in the OBJ_TEAM_ROLES.A few things.
You are not using a JDBC Array type in your procedure, you are using a PLSQL TABLE type. An Array type would be a VARRAY in Oracle. EclipseLink supports both VARRAY and TABLE types, but TABLE types are more complex as Oracle JDBC does not support them, they must be wrapped in a corresponding VARRAY type. I assume your OBJ_TEAM_ROLES is also not an OBJECT TYPE but a PLSQL RECORD type, this has the same issue.
Your procedure does not return a result set, so "returnsResultSet=true" should be "returnsResultSet=false".
In general I would recommend you change your stored procedure to just return a select from a table using an OUT CURSOR, that is the easiest way to return data from an Oracle stored procedure.
If you must use the PLSQL types, then you will need to create wrapper VARRAY and OBJECT TYPEs. In EclipseLink you must use a PLSQLStoredProcedureCall to access these using the code API, there is not annotation support. Or you could create your own wrapper stored procedure that converts the PLSQL types to OBJECT TYPEs, and call the wrapper stored procedure.
To map to Oracle VARRAY and OBJECT TYPEs the JDBC Array and Struct types are used, these are supported using EclipseLink ObjectRelationalDataTypeDescriptor and mappings. These must be defined through the code API, as there is currently no annotation support.
I could not find any good examples or doc on this, your best source of example is the EclipseLink test cases in SVN,
http://dev.eclipse.org/svnroot/rt/org.eclipse.persistence/trunk/foundation/eclipselink.core.test/src/org/eclipse/persistence/testing/tests/plsql/
http://dev.eclipse.org/svnroot/rt/org.eclipse.persistence/trunk/foundation/eclipselink.core.test/src/org/eclipse/persistence/testing/tests/customsqlstoredprocedures/
James : http://www.eclipselink.org
Maybe you are looking for
-
PLEASE HELP! my iPod got stolen but i got it back . and now it can be off i try to charge it and it would go to the silver apple and it would have a loading circle and it freezes |: PLEASE HELP
-
What is the diffrence of 'call screen 100' and 'leave to screen 100'
Thank u
-
Hi We have a starge issue. We use the table SWWUSERWI to see all the work items in the user's inbox. If we delete the work item in this table it will remove the same from user's inbox. We have a problem now. Even after we deleted all the work items t
-
Solution to syncing with two computers
i have a client who wanted to sync her addresses, datebook, mail etc at her office and her music and photos at home. i was told by many many people at apple that this was impossible. finally i got a great iphone guy on the phone who said sure, you ca
-
I have a number of buttons in a tutorial that need to open specific urls when clicked. I've set them to open in new tabs as per other comments on this issue I've seen elsewhere but the links still do not open. The tutorial is saved on a web server. P