DbDataAdapter and stored procedures with Oracle cursors,
Because of the problems I've mentioned here ([PL/SQL stored procedure causes OracleException.. .but only sometimes | https://forums.oracle.com/forums/thread.jspa?threadID=2267290]), I am trying to replace a specific layer of data ODP.NET with the code that uses the related classes, independent provider and DbProviderFactory. Things seemed to go right up to the point where I'm trying to use a DbDataAdapter object to fill a DataSet. The stored procedure, I call looks like this.../* - - - - - - - - - - - - - - - - - - - - */
PROCEDURE GET_SOME_DATA)
IN_PARAM1 IN VARCHAR2,
O_RESULTS TO SYS_REFCURSOR);
/* - - - - - - - - - - - - - - - - - - - - */
Normally, I could do something like this...
/* - - - - - - - - - - - - - - - - - - - - */
var adapter = new OracleDataAdapter (cmd);
adapter. Fill (ds, cmd (OracleRefCursor). Parameters [1]. (Value);
/* - - - - - - - - - - - - - - - - - - - - */
.. .but that is not possible when you use DbProviderFactories since there is no equivalent of the Ref Cursor. I can use a DbDataAdapter instead of an OracleDataAdapter object, but I can't understand how to fill it with the cursor. All the examples I've seen (even the specific Oracle ones) seem to assume one is writing queries like "SELECT FOO FROM BAR" or something like that.
Am I going about this all wrong? Or is it simply not possible to use a DbDataAdapter to fill a DataSet like this? I was really hoping to be able to use the provider-independent code I could use the System.Data.OracleClient provider with my 9i database and then switch to the Oracle. DataAccess.Client once we have upgrade to 11g. Looks like I'll have to completely replace the data layer code and references. I knew that the former was necessary, but I hope this could be managed by interfaces of independent provider with concrete implementation changed via the config and/or my IoC container.
NOTE: I found this thread in the forums, but the posters to stop before the point at which they return the sliders and make use of them: [ODP.Net Ref Cursor and DbProviderFactory | https://forums.oracle.com/forums/thread.jspa?messageID=1278007]
Thank you!
I did yesterday a similar thing.
The code was specific ODP.NET (that always, it is and should be), but I didn't rely on a reference to Oracle.DataAccess directly in my particular case:
The code I ended up with is not very pretty, but it works.
var refCursorType = Enum.Parse (((dynamic) plant.)) CreateParameter()). OracleDbType.GetType (), "RefCursor");
dynamic oracleParameter4 = factory. CreateParameter();
oracleParameter4.Direction = ParameterDirection.Output;
var piInstance = oracleParameter4.GetType (). GetProperty ("OracleDbType");
piInstance.SetValue (oracleParameter4, refCursorType, null);
Tags: Database
Similar Questions
-
stored procedure with cursor as param output
This is the first time for me to test a stored procedure with a cursor as an out parameter. I performed the following:
SQL > user_cur VARIABLE REFCURSOR; VARIABLE ret_code VARCHAR2; exec TEST_API. SEARCH_USER (: ret_code, ",", "John", ",: user_cur); print ret_code; print user_cur;
I got the following error:
Use: VAR [IABLE] [< variable > [NUMBER |]] TANK | CHAR (n [CHAR |]) BYTE]) |
VARCHAR2 (n TANK). NCHAR. NCHAR (n) |
NVARCHAR2 (n) | CLOB | NCLOB | REFCURSOR]]
Can I know what is the problem?
The purpose of the stored procedure is looking for user with the name 'john '.
The declaration of input/output params to stored procedure is as follows:
PROCEDURE SEARCH_USER
(
RETURN_CODE OUT VARCHAR2,
USER_ID_IN IN VARCHAR2,
POSITION_IN IN VARCHAR2,
USERNAME_IN IN VARCHAR2,
STATUS_IN IN VARCHAR2,
USER_CUR_OUT ON REFCURSOR
)
Published by: user7383310 on October 19, 2008 21:05
Published by: user7383310 on October 19, 2008 21:05refer here for the use of refcursors in pl/sql...
http://download.Oracle.com/docs/CD/B14117_01/AppDev.101/B10807/06_ora.htm#sthref808You can code as...
SQL> create or replace procedure p1(id number,csr out sys_refcursor) is 2 begin 3 open csr for select ename from emp where deptno = id; 4 end; 5 / Procedure created.SQL> var csr1 refcursorSQL> var n numberSQL> exec :n := 30; PL/SQL procedure successfully completed. SQL> exec p1(:n,:csr1); PL/SQL procedure successfully completed. SQL> print csr1 ENAME----------ALLENWARDMARTINBLAKETURNERJAMES 6 rows selected.
-
Calling stored procedures with parameters with the database connectivity Toolkit
Hi all
I'm new to the forum and struggling to find a solution to a particular problem I have in this respect, using the LabVIEW Database Connectivity Toolkit on a project, I am currently working on my work. I have a database in which I tables and stored procedures with parameters. Some of these stored procedures have input, output and return parameters.
I tried to follow this example, but to no avail: http://digital.ni.com/public.nsf/allkb/07FD130746083E0686257300006326C4?OpenDocument
Such a stored procedure I am working on the implementation is named "dbo.getAllowablePNs", running "SELECT * from DeviceType" (DeviceType is the table). In this case, it requires no input parameter, it has an output parameter that generates the table [cluster] and has a return parameter that returns an integer value (status code for execution) to show if an error occurred. The DeviceType table has 3 columns; ID (PK, int not null), PN (nvarchar ((15), null) and NumMACAddresses (int, null).) I have surpassed many examples and I talk to the support OR try to implement this and similar procedures stored in LabVIEW but have not been successful. I am able to connect to the database with the VI of open connection without error, but spin in some confusion as a result of this step. I then try to use the VI of parameter query create to call the stored procedure and set the parameters. I guess I would then use the Set parameter value for each parameter that is connected to the entry of parameters on the previous query with parameters VI VI? I am also having some confusion during and after these steps as well. I would greatly appreciate advice or suggestions that anyone could have in this situation because I am not a SQL expert. Also, I would be happy to provide more information that might be useful.
Kind regards
Jon
Here's what I use to do this. I think I had to change him create parameterized query VI for him to work. There is a post on the forum about this somewhere.
-
How to call a stored procedure with a REF CURSOR output parameter
I'm looking forward to example calling a function/stored procedure with a REF CURSOR output parameter and get the result.
In other words, I have a stored function/procedure that runs a SELECT statement using the OCI library and then he could get the values of each row and each column.
I put a code snippet, it have only the main thing to call a simple stored procedure and to print the name of each column of the cursor, but I couldn t to print out values in the table that calls the stored procedure.
I understand that the next step is to call an OCIStmtFetch.
How to associate the slider with the OCIStmtFetch?
If you need more information, just tell me.
I use ANSI C with HP - UX (HP - UX C) operating system and Oracle 10 g.
Kind regards.
Antonio Garcia
/ * callOracleSP * /.
#include < stdio.h >
#include < string.h >
#include < oci.h >
#include < stdlib.h > to
char * pConnectChar = "Server";
char * pUsernameChar = "user";
char * pPasswordChar = "passwd";
char * sqlCharArray1 = "BEGIN SP_GETCITIES (:,: c); END; « ;
int retval;
UB4 parmcnt = 0;
UB4 pos2 = 0;
text * pcoln [20];
UB4 namelen [20];
char state_key [5];
OCIStmt * pOciStatement;
OCIStmt * pOciStatCursor;
OCIError * pOciError;
OCIEnv * pOciEnviron;
OCIServer * pOciServer;
OCISession * pOciSession;
OCISvcCtx * pOciServiceContext;
OCIBind * pOciBind [500];
OCIParam * pOciParam;
int main()
{
retval = OCIEnvCreate (& pOciEnviron, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);
retval = OCIEnvInit (& pOciEnviron, OCI_DEFAULT, 0, NULL);
retval = OCIHandleAlloc (pOciEnviron, (void *) & pOciError, OCI_HTYPE_ERROR, 0, NULL);
retval = OCIHandleAlloc (pOciEnviron, (void *) & pOciServiceContext, OCI_HTYPE_SVCCTX, 0, NULL);
retval = OCIHandleAlloc (pOciEnviron, (void *) & pOciStatement, OCI_HTYPE_STMT, 0, NULL);
retval = OCILogon (pOciEnviron, pOciError, & pOciServiceContext,(unsigned char *) pUsernameChar,
strlen (pUsernameChar), (unsigned char *) pPasswordChar, strlen (pPasswordChar).
(unsigned char *) pConnectChar, strlen (pConnectChar));
printf ("retval=%d\n",retval OCILogon);
retval = OCIStmtPrepare (pOciStatement, pOciError, (unsigned char *) sqlCharArray1, strlen (sqlCharArray1),)
OCI_NTV_SYNTAX, OCI_DEFAULT);
printf ("StmtPrepare retval=%d\n",retval);
retval = OCIHandleAlloc (pOciEnviron, (void *) & pOciStatCursor, OCI_HTYPE_STMT, 0, NULL);
retval = 1 OCIBindByPos(pOciStatement,&pOciBind[0], pOciError, (ub4), (void *) & state_key,)
((sb4) sizeof (state_key), SQLT_STR, (void *) 0, (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT (ub4));
printf ("BindByPos OCI_HTYPE_STMT retval=%d\n",retval);
retval = OCIBindByPos(pOciStatement,&pOciBind[1], pOciError, (ub4) 2, (void *) & pOciStatCursor,)
((sb4) 0, SQLT_RSET, (void *) 0, (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT (ub4));
printf ("BindByPos OCI_HTYPE_STMT retval=%d\n",retval);
strcpy (state_key, 'ca');
retval = OCIStmtExecute (pOciServiceContext, pOciStatement, pOciError, (ub4) 1, (ub4) 0,)
(OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT (ub4));
printf ("StmtExecute retval=%d\n",retval);
/ * How to get the values of the cursor? */
/ * Number of parameters of the cursor * /.
OCIAttrGet ((void *) pOciStatCursor, OCI_HTYPE_STMT (ub4), (void *) & parmcnt,(ub4 *) 0,)
(ub4) (OCI_ATTR_PARAM_COUNT, pOciError);
printf ("\nNumber of the slider settings = %d\n",parmcnt);
for (int pos = 1; pos < = (int) parmcnt; pos ++)
{
OCIAttrGet ((void *) pOciStatCursor, OCI_HTYPE_STMT (ub4), (void *) & pos2,(ub4 *) 0,)
(ub4) (OCI_ATTR_CURRENT_POSITION, pOciError);
retval = OCIParamGet ((void *) pOciStatCursor, OCI_HTYPE_STMT (ub4), pOciError, (void *) & pOciParam,)
POS (ub4));
OCIAttrGet pOciParam, (ub4) ((void*) OCI_DTYPE_PARAM,(void*) & pcoln [pos - 1],(ub4 *) & namelen [pos-1],)
(ub4) OCI_ATTR_NAME,(OCIError *) pOciError);
}
for (int i = 1; i < = (int) parmcnt; i ++)
printf ("%i\tNAME = % column. ("* s\n", i, namelen [i-1], pcoln [i-1]);
return 0;
}
This is the script that create the table, insert records and create the stored procedure
CREATE TABLE CITIES)
STATE_CODE VARCHAR2 (2) NULL,
CITY_CODE NUMBER (15.5) NULL,
CITY_NAME VARCHAR2 (30) NULL
)
/
INSERT INTO CITIES (STATE_CODE, CITY_CODE, CITY_NAME)
VALUES ('CA', 30, 'SAN DIEGO')
/
INSERT INTO CITIES (STATE_CODE, CITY_CODE, CITY_NAME)
VALUES ('CA', 40 'SACRAMENTO')
/
INSERT INTO CITIES (STATE_CODE, CITY_CODE, CITY_NAME)
VALUES ('FL', 10, 'MIAMI')
/
INSERT INTO CITIES (STATE_CODE, CITY_CODE, CITY_NAME)
VALUES ('FL', 20, 'ORLANDO')
/
INSERT INTO CITIES (STATE_CODE, CITY_CODE, CITY_NAME)
VALUES ('NEW YORK', 10, 'NEW YORK')
/
INSERT INTO CITIES (STATE_CODE, CITY_CODE, CITY_NAME)
VALUES ('NEW YORK', 20, 'ALBANY')
/
INSERT INTO CITIES (STATE_CODE, CITY_CODE, CITY_NAME)
VALUES ('CA', 10, 'LOS ANGELES')
/
INSERT INTO CITIES (STATE_CODE, CITY_CODE, CITY_NAME)
VALUES ('CA', 20, 'SAN FRANCISCO')
/
CREATE or REPLACE PACKAGE globalPkg AUTHID CURRENT_USER AS
/ * The following is specific global variables T/SQL. */
TYPE RCT1 IS REF CURSOR; / * new cursor low definition * /.
END globalPkg;
/
CREATE OR REPLACE PROCEDURE SP_ADDCITY)
P_STATE_CODE IN VARCHAR,
P_CITY_CODE NUMBER,
P_CITY_NAME IN VARCHAR2,
P_RETURN IN NUMBERS)
AS
StoO_error INTEGER;
StoO_selcnt INTEGER;
StoO_rowcnt INTEGER;
StoO_errmsg VARCHAR2 (255);
BEGIN
StoO_rowcnt: = 0;
StoO_error: = 0;
StoO_selcnt: = 0;
P_RETURN: = 0;
INSERT INTO CITIES (STATE_CODE, CITY_CODE, CITY_NAME)
VALUES (P_STATE_CODE, P_CITY_CODE, P_CITY_NAME);
StoO_rowcnt: = number of LINES SQL %;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
StoO_rowcnt: = 2;
WHILE OTHERS THEN
StoO_rowcnt: = 0;
StoO_selcnt: = 0;
StoO_error: = SQLCODE;
StoO_errmsg: = SQLERRM;
IF StoO_error! = 0 THEN
BEGIN
P_RETURN: = 1;
RETURN;
END;
END IF;
END;
/
CREATE OR REPLACE PROCEDURE SP_GETCITIES)
STATE_KEY IN VARCHAR,
RC1 IN OUT globalPkg.RCT1)
AS
StoO_error INTEGER;
StoO_selcnt INTEGER;
StoO_rowcnt INTEGER;
StoO_errmsg VARCHAR2 (255);
BEGIN
StoO_rowcnt: = 0;
StoO_error: = 0;
StoO_selcnt: = 0;
OPEN FOR RC1
SELECT STATE_CODE, CITY_CODE, FRANCISCO
CITIES
WHERE STATE_CODE = STATE_KEY
ORDER BY CITY_CODE;
StoO_rowcnt: = number of LINES SQL %;
EXCEPTION
WHILE OTHERS THEN
StoO_rowcnt: = 0;
StoO_error: = SQLCODE;
StoO_errmsg: = SQLERRM;
END;
/Hi Antonio,.
I see this:
c_buf=(ub1 **)calloc(sizeof(ub1 *),3); ... rc=OCIDefineByPos(pOciStatCursor,&pdef,(OCIError *)pOciError,pos,c_buf[pos-1],size+1,(ub2)type,(dvoid *)c_indp[pos-1],(ub2 *)0,(ub2 *)0,OCI_DEFAULT);
That I don't understand. You allocate space for 3 pointers ub1 but I don't see where these pointers are then initialized to point to where the data is to be stored.
I do not read correctly?
Sorry for posting code long, but here is an example of code that I have. It is much more 'code' for your code, but maybe that will be enough...
NOTE: This is just the code example and not rigorous. For example, I don't check the memory, allocations etc in this code!
Kind regards
Mark
#ifdef WIN32 #define _CRT_SECURE_NO_DEPRECATE 1 #endif #include
#include #include #include void checkerr(sword status, OCIError *errhp); int main(int argc, char *argv[]) { OCIEnv *envhp = NULL; /* OCI Environment handle */ OCIError *errhp = NULL; /* OCI Error handle */ OCISvcCtx *svchp = NULL; /* OCI Service Context handle */ OCIServer *srvhp = NULL; /* OCI Server handle */ OCISession *usrhp = NULL; /* OCI User Session handle */ OCIStmt *stmtp = NULL; /* OCI Statement handle */ OCIStmt *cursr = NULL; /* OCI Statement handle */ OCIParam *prmp1 = NULL; /* OCI Parameter handle */ OCIParam *prmp2 = NULL; /* OCI Parameter handle */ OCIParam *prmp3 = NULL; /* OCI Parameter handle */ OCIDefine *defp1 = NULL; /* OCI Define handle */ OCIDefine *defp2 = NULL; /* OCI Define handle */ OCIDefine *defp3 = NULL; /* OCI Define handle */ OCIBind *bndp1 = NULL; /* OCI Bind handle */ OCIBind *bndp2 = NULL; /* OCI Bind handle */ OCIBind *bndp3 = NULL; /* OCI Bind handle */ /* used to hold column width */ ub2 col_width; /* used to set the prefetch count */ ub4 prefetch_count = 32; /* will hold output from database */ oratext *pEmpId = NULL; oratext *pFirstName = NULL; oratext *pLastName = NULL; /* the anonymous block to execute */ /* this opens a ref cursor */ oratext *sqlstmt = "begin " \ " open :1 for " \ " select to_char(employee_id), " \ " first_name, " \ " last_name " \ " from hr.employees " \ " order by last_name, " \ " first_name; " \ "end;"; /* used to hold the results of each OCI call */ sword result = 0; /* Initialize and create a default environment */ result = OCIEnvCreate(&envhp, OCI_DEFAULT, (dvoid *) 0, 0, 0, 0, (size_t) 0, (dvoid **) 0); /* allocate an error handle */ result = OCIHandleAlloc((dvoid *) envhp, (dvoid **) &errhp, OCI_HTYPE_ERROR, 0, (dvoid **) 0); /* allocate a service context handle */ result = OCIHandleAlloc((dvoid *) envhp, (dvoid **) &svchp, OCI_HTYPE_SVCCTX, 0, (dvoid **) 0); /* allocate a server handle */ result = OCIHandleAlloc((dvoid *) envhp, (dvoid **) &srvhp, OCI_HTYPE_SERVER, 0, (dvoid **) 0); /* allocate a user session handle */ result = OCIHandleAlloc((dvoid *) envhp, (dvoid **) &usrhp, OCI_HTYPE_SESSION, 0, (dvoid **) 0); /* create a server context using the "ORADEMO" database */ result = OCIServerAttach(srvhp, errhp, "ORADEMO", (ub4) strlen("ORADEMO"), OCI_DEFAULT); /* set the server attribute in the service context handle */ result = OCIAttrSet((dvoid *) svchp, OCI_HTYPE_SVCCTX, (dvoid *) srvhp, (ub4) 0, OCI_ATTR_SERVER, errhp); /* open the session with the database */ /* using external authentication */ result = OCISessionBegin(svchp, errhp, usrhp, OCI_CRED_EXT, OCI_DEFAULT); /* set the user session attribute in the service context handle */ result = OCIAttrSet((dvoid *) svchp, OCI_HTYPE_SVCCTX, (dvoid *) usrhp, (ub4) 0, OCI_ATTR_SESSION, errhp); /* allocate the statement handle */ result = OCIHandleAlloc((dvoid *) envhp, (dvoid **) &stmtp, OCI_HTYPE_STMT, 0, (dvoid **) 0); /* prepare the statement for execution */ result = OCIStmtPrepare(stmtp, errhp, sqlstmt, (ub4) strlen((char *) sqlstmt), OCI_NTV_SYNTAX, OCI_DEFAULT); /* allocate the handle for the ref cursor */ result = OCIHandleAlloc((dvoid *) envhp, (void **) &cursr, OCI_HTYPE_STMT, 0, NULL); /* bind the ref cursor parameter */ result = OCIBindByPos(stmtp, &bndp1, errhp, 1, &cursr, 0, SQLT_RSET, NULL, 0, NULL, 0, 0, OCI_DEFAULT); /* execute the statement */ result = OCIStmtExecute(svchp, stmtp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT); /* get parameter descriptor for first column */ result = OCIParamGet((dvoid *) cursr, OCI_HTYPE_STMT, errhp, (dvoid **) &prmp1, (ub4) 1); /* get parameter descriptor for second column */ result = OCIParamGet((dvoid *) cursr, OCI_HTYPE_STMT, errhp, (dvoid **) &prmp2, (ub4) 2); /* get parameter descriptor for third column */ result = OCIParamGet((dvoid *) cursr, OCI_HTYPE_STMT, errhp, (dvoid **) &prmp3, (ub4) 3); /* get the first column width in characters */ result = OCIAttrGet((dvoid*) prmp1, (ub4) OCI_DTYPE_PARAM, (dvoid*) &col_width, (ub4 *) 0, (ub4) OCI_ATTR_DATA_SIZE, errhp); /* allocate memory to hold the result */ pEmpId = (oratext *) malloc(sizeof(oratext) * (col_width + 1)); /* define the first column in the results */ result = OCIDefineByPos(cursr, &defp1, errhp, 1, (dvoid *) pEmpId, (sword) col_width + 1, SQLT_STR, (dvoid *) NULL, (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT); /* get the second column width in characters */ result = OCIAttrGet((dvoid*) prmp2, (ub4) OCI_DTYPE_PARAM, (dvoid*) &col_width, (ub4 *) 0, (ub4) OCI_ATTR_DATA_SIZE, errhp); /* allocate memory to hold the result */ pFirstName = (oratext *) malloc(sizeof(oratext) * (col_width + 1)); /* define the second column in the results */ result = OCIDefineByPos(cursr, &defp2, errhp, 2, (dvoid *) pFirstName, (sword) col_width + 1, SQLT_STR, (dvoid *) NULL, (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT); /* get the third column width in characters */ result = OCIAttrGet((dvoid*) prmp3, (ub4) OCI_DTYPE_PARAM, (dvoid*) &col_width, (ub4 *) 0, (ub4) OCI_ATTR_DATA_SIZE, errhp); /* allocate memory to hold the result */ pLastName = (oratext *) malloc(sizeof(oratext) * (col_width + 1)); /* define the third column in the results */ result = OCIDefineByPos(cursr, &defp3, errhp, 3, (dvoid *) pLastName, (sword) col_width + 1, SQLT_STR, (dvoid *) NULL, (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT); /* loop through and print the results */ while ((result = OCIStmtFetch(cursr, errhp, (ub4) 1, (ub2) OCI_FETCH_NEXT, (ub4) OCI_DEFAULT)) == OCI_SUCCESS) { printf("Employee ID: %s\n", pEmpId); printf(" First Name: %s\n", pFirstName); printf(" Last Name: %s\n\n", pLastName); } /* free allocated memory */ free(pEmpId); free(pFirstName); free(pLastName); pEmpId = NULL; pFirstName = NULL; pLastName = NULL; /* terminate the session with the database */ result = OCISessionEnd(svchp, errhp, usrhp, OCI_DEFAULT); /* detach from the server */ result = OCIServerDetach(srvhp, errhp, OCI_DEFAULT); /* deallocate the environment handle */ /* OCI will deallocate the child handles */ result = OCIHandleFree((dvoid *) envhp, OCI_HTYPE_ENV); return OCI_SUCCESS; } void checkerr(sword status, OCIError *errhp) { oratext errbuf[512]; sb4 errcode = 0; switch (status) { case OCI_SUCCESS: break; case OCI_ERROR: case OCI_SUCCESS_WITH_INFO: (void) OCIErrorGet((dvoid *) errhp, (ub4) 1, (oratext *) NULL, &errcode, errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR); (void) printf("Error: %.*s\n", sizeof(errbuf), errbuf); break; case OCI_NEED_DATA: (void) printf("Error - OCI_NEED_DATA\n"); break; case OCI_NO_DATA: (void) printf("Error - OCI_NO_DATA\n"); break; case OCI_INVALID_HANDLE: (void) printf("Error - OCI_INVALID_HANDLE\n"); break; case OCI_STILL_EXECUTING: (void) printf("Error - OCI_STILL_EXECUTING\n"); break; case OCI_CONTINUE: (void) printf("Error - OCI_CONTINUE\n"); break; default: break; } } -
Java - a stored procedure with call by result
Hi the Oracle community,
I'm looking for some example Code how to use a Java-Stored procedure with output parameters. Don't get me wrong. I don't want to call a procedure with the parameters Out of Java (there are many examples in this respect over there). I want to just implement the appeal of the concept of results in a Java-Stored procedure. A customer calls this procedure with certain parameters and the Java procedure will fill the. So my first question: is it possible? And my second Question: how to implement it?
Greetings.
I found a solution. It's very simple.
Just setting the parameters as java array (e.g., String() P1). The first value (P1 [0]) is the returned value.
Finally just contained JDeveloper in dialog box "Edit method Signature" the parametermode OUT.
The dialog box are entitled on the stored procedure in the dbexport file. You can read this
in Section 6, publishing Java Classes with call specifications-> defining the Modes parameter in
The Oracle database Java Developer's Guide.
-
ADF view object and stored procedure
Hi all
I am facing a problem with the view object, the case is, I created a stored procedure with an input and an output parameter
view object I need to call this procedure inside the request object view and define the attribute transient output parameter
could you please help me in this case, please give an example
Thanks in advance
Mohamed,
Can you explain your use case to help you.
Is it possible to convert the stored procedure in function (and change the output parameter to return the parameters) and create a display object using the function.
Ex: Create a display object "read access only via the SQL query" for the query: SELECT HR. PLSQLTEST2 staff (first_name) OF
K
-
How to connect Forms 6i and reports 6i with oracle 10g R2?
Hey everybody,
I need your help in linking the two Forms 6i and reports 6i with Oracle 10 g Release 2 db, MS Access(2003, 2007) and SQL database (Microsoft Visual Studio 2008). I am a newbie. I installed all the on my laptop HP with Windows 7 installed Ultimate(32 bit OS). I want to generate reports and forms by accessing data from databases mentioned above. Please provide me with the configuration steps.
Thanks in advance...!Being new to the forum, I encourage you to consider the following before you post much more:
http://blogs.Oracle.com/Shay/entry/10_commandments_for_the_otn_fo
As for your question, I hope that you read my posts.
As I mentioned, form/reports 6 is very old and operating systems, you suggested that you will use are very new. This version of F/R is obsolete and expected that it works on a new operating system is not realistic. Why are spending you time with such an old version? Even if you're just trying to learn the product, learning with an old version is probably not a good idea.
The tnsnames.ora file, you need to update is this: c:\orant\net80\admin
If you want to learn how to use the product in detail, you probably won't be able to do it in a forum. It is not as if we were trying to learn MS Notepad. Forms/States (and all Oracle products) are enterprise-level products. All products Oracle would require that you spend time to review documentation and in many cases attend some courses to always be effective using them. You can find documents and training in countless places, including within the site of the Oracle. I recommend that you consider that your place of departure.
Here are some examples:
Forms of technical documents for most of the versions:
http://www.Oracle.com/technetwork/Developer-Tools/Forms/Overview/index.html11.1.2 of Documentation Forms Library:
http://docs.Oracle.com/CD/E24269_01/index.htmArchived forms documentation:
http://www.Oracle.com/technetwork/documentation/dev-arch-093406.htmlOracle Forms - Oracle Education
http://education.Oracle.com/pls/web_prod-PLQ-dad/db_pages.GetPage?page_id=501The forms and the report generator online help is also a good place for more information that in some cases, the sample code is provided.
-
Run the statement in a stored procedure with Out parameters and
Hi all
I have a stored procedure that calls a select statement. Here it is...
CREATE OR REPLACE PROCEDURE BLABLA_VIEW_PROCEDURE
* (BLABLA_KEY IN NUMBER, *)
XML_OUTPUT ON VARCHAR)
AS
BEGIN
SELECT SYS. XMLTYPE.getStringVal (OBJECT_VALUE) in XML_OUTPUT FROM BLABLA_VIEW WHERE extractValue (OBJECT_VALUE, ' / BLABLA_TYPE/BLABLA_KEY ') = 2876;
END;
Is to have both IN and OUT parameters as described above. I am able to compile and run the procedure.
The problem I want to share with everyone is...
I want to run the stored procedure together with a single EXEC command.
I tried different ways using the EXEC command but of no use.
Could someone help me?
Thanks in advance.
Published by: user10763276 on June 3, 2010 15:47Please visit the following...
sudhakar@ORCL>CREATE OR REPLACE PROCEDURE BLABLA_VIEW_PROCEDURE 2 (BLABLA_KEY IN NUMBER, 3 XML_OUTPUT OUT VARCHAR) 4 AS 5 BEGIN 6 XML_OUTPUT := BLABLA_KEY || ' and whatever else...'; 7 END; 8 / Procedure created. sudhakar@ORCL> sudhakar@ORCL>var XML_OUTPPUT varchar2(100); sudhakar@ORCL>exec BLABLA_VIEW_PROCEDURE (9151, :XML_OUTPPUT); PL/SQL procedure successfully completed. sudhakar@ORCL>print XML_OUTPPUT; XML_OUTPPUT -------------------------------------------------------------------------------- 9151 and whatever else... sudhakar@ORCL>
Post tells you...
var OUTPUT VARCHAR exec BLABLA_VIEW_PROCEDURE (9151, :OUTPUT); print OUTPUT
VARCHAR is not a valid TYPe to declare. Use VARCHAR2 (nnn) where nnn is a number.
VR,
Sudhakar B. -
How to call oracle stored procedure with hibernate
Hi all
I wrote the following stored procedure:
create or replace
PROCEDURE SP_GET_NUMBER (p_cursor sys_refcursor, departmentId in number, userId in number, documentTypeId number)
as
Enter the integer;
sqlScript varchar2 (60);
Start
sqlScript: = "select registrationnumber_seq.nextval from dual;
immediately run sqlScript in register;
dbms_output.put_line ('Nextval is: ' |) To_char (Regid));
insert into roketsanuser.registrationnumbers
(id, departmentid, documenttypeid, number, registrationstatus, status, updatedate, updateuserid, version)
values
(enter it, null, null, enter it, 0, 0, sysdate, 0, 0);
commit;
Open the p_cursor for
Select id
roketsanuser.registrationnumbers® systems
where reg.id = regid;
end;
And I define in the annotations in my entity class:
@Entity (name = "Number")
@Table (name = "REGISTRATIONNUMBERS")
@SequenceGenerator (name = "REGISTRATIONNUMBER_SEQ", sequenceName = "REGISTRATIONNUMBER_SEQ")
@org.hibernate.annotations.NamedNativeQuery (name = "SP_GET_NUMBER", query = "{call? "{= SP_GET_NUMBER (: departmentId,: userId,: documentTypeId)}"
Callable = true, readOnly = true, resultClass = RegistrationNumber.class)
@EntityListeners ({BaseEntityListener.class})
Number/public class extends BaseEntity
I call the query in my Dao class:
public number getNumberForIncomingPaperworkByStoredProcedure (EntityManager Manager, number number)
{
A session = (Session) manager.getDelegate ();
query org.hibernate.impl.SQLQueryImpl = (SQLQueryImpl) session.getNamedQuery ("SP_GET_NUMBER");
query.setParameter ("departmentId", ObjectUtil.isNotNull (registrationNumber.getDepartment ())? registrationNumber.getDepartment () .getId (): "");
query.setParameter ("userId", ObjectUtil.isNotNull (registrationNumber.getUser ())? registrationNumber.getUser () .getId (): "");
query.setParameter ("documentTypeId", ObjectUtil.isNotNull (registrationNumber.getDocumentType ())? registrationNumber.getDocumentType () .getId (): "");
Collection list = query.list ();
return new RegistrationNumber();
}
But when I run the application exception occurred:
< 01/02/2013 10:04:24 EET > < opinion > < Stdout > < BEA-000000 > < hibernation:
/ * name of SP_GET_NUMBER native SQL query * / {call? = SP_GET_NUMBER (?,?,?)} >
< 01/02/2013 10:04:27 EET > < opinion > < Stdout > < BEA-000000 > < 10:04:27, 811 ERROR [IncomingPaperworkMBean] EJB Exception:; nested exception is:
org.hibernate.exception.SQLGrammarException: could not execute the query. nested exception is: org.hibernate.exception.SQLGrammarException: could not execute the query >
This is perhaps the reason why, please help me?
Thanks in advanceMessage to research in syntax of:
@org.hibernate.annotations.NamedNativeQuery
It seems that following is a possible cause (but I'm not sure about this one):
Query = "{call?" "{= SP_GET_NUMBER (: departmentId,: userId,: documentTypeId)} '.
You can change this:
Query = "(?)". (= appeler SP_GET_NUMBER (: departmentId,: userId,: documentTypeId)) "...
or
Query = "(call SP_GET_NUMBER (: departmentId,: userId,: documentTypeId)).
and check if that helps...
You can take a look at:
https://Forum.Hibernate.org/viewtopic.php?p=2401604
HTH,
Bravo!
AJ -
Privileges differ between SQL * more and stored procedure
A user with the dba role can access dba_role_privs. But this is not possible in a stored procedure created by the same user.
Normally, the example should work fine
But with Oracle XE 11.02 - cost free database with some limitations - I get error 942
I show a simple example in SQL * more:
SQL > r
1 * select distinct dba_role_privs recipient where the recipient as "SY %.
DEALER
------------------------------
SYSTEM
SYS
SQL > create or replace procedure x as
2 start
3 for rec in (select distinct dba_role_privs dealer where the beneficiary as 'SY %')
4 loop
5 zero;
6 end of loop;
7 end;
8.
Warnung: Prozedur wurde mit Kompilierungsfehlern standing.
English translation: procedure created with compilation errors
SQL > show error
LINE/COL ERROR
-------- -----------------------------------------------------------------
3/14 PL/SQL: statement ignored
3/43 PL/SQL: ORA-00942: table or view does not exist
SQL >
How can I fix?Why do you think the example should work properly?
Normally, regardless of the version, the privileges granted through roles (such as DBA) not available for stored procedures. Stored procedure of a DEFINER rights can only take advantage of the privileges granted directly to the owner of the procedure. Stored procedure of the invoker rights can enjoy privileges granted by a role, but that requires that the appellant has independent privileges to query the table in question (and, in this case, would require dynamic SQL usage).
Generally, the simplest approach would be to grant the privilege to CHOOSE ANY DICTIONARY to the owner of the procedure.
Justin
-
How to convert MS SQL Server 2008 Stored Procedures of Oracle 11 g SPs?
We have an application from MS SQL Server 2008. We want to migrate to Oracle 11 g.
What is the recommended Oracle method for
(1) migration of data (Tables, triggers, sequences, views etc..)
(2) the stored Procedure migration.
What is the recommended tool or method pls?
We have 100s of MS Sql Server stored procedures. Then, needing a tool or method. We can rewrite all of them from scratch.Hello
Let me clarify some of the issues that you mention. But I advise you to get some professional help with migration because:
1. you must understand the architectural differences between SQL Server and Oracle. They are of different databases.
2. understand data type mappings.
3. understand the complete migration process. Just using the OTN article as a migration guide won't help because it just shows how use SQL Developer to this task.
4. understand that 100% of successful Oracle conversion is not possible with all the tools. There will always be gaps, gaps in functionality, bugs etc. So there will be some amount of manual work involved.
5. There are many other tasks involved in the migration that cannot be accomplished with SQL Developer.Get now your questions:
1. in 3.1, there is migration option for the "capture of database in offline mode". It is under the Tools option. So in 3.1 we do not have a separate tab, called "Migration."
2. use 3.1 because it is much better than 2.1 in terms of capabilities.
3 migration Wizard is the easiest way to migrate. Where are you getting confused?
4 "column data" seems to be a stored procedure in SQL Server. If it is not there in the underlying table, why he uses in the SQL statement in the procedure then? I think that we have a problem of "reserved word" with the name of column "Data". Will have to check that.
5 VARCHAR (@max) must be mapped to VARCHAR2 (4000) in Oracle. It may be a bug in SQL Developer. So during the mapping of data type in the migration wizard, you can change the default mappings.Concerning
Prakash
-
'ALL' to a stored procedure in Oracle 10 g
Hello
I have a stored procedure that takes the parameters from a report. I have two settings with a list of things in both entities.
Now, in the two settings, I have the word "ANYTHING" to pass to the stored procedure to indicate that all elements in the list of parameters should be consumed.
I kinow what should be in the WHERE clause, but have no idea how to do this in Oracle. This pseudo code below to get an idea of what I'm trying to accomplish here;
IF Parameter1 = "ALL".
then
Field1 = (select * from table1) other end parameter1 = Field1
IF Parameter2 = "ALL".
then
Field2 = (select * from table2) other Field2 = parameter end 2
Any help would be Apprecited guys!
Thank you
MannyHey, Manny,
I'm not sure that understand the question.
I think you want something like this query on the table scott.emp:VARIABLE target_deptno VARCHAR2 (5) VARIABLE target_job VARCHAR2 (10) EXEC :target_deptno := 'ALL'; EXEC :target_job := 'CLERK'; SELECT ename , deptno , job FROM scott.emp WHERE ( :target_deptno = TO_CHAR (deptno) OR :target_deptno = 'ALL' ) AND ( :target_job = job OR :target_job = 'ALL' ) ;
Output (with the settings as shown):
ENAME DEPTNO JOB ---------- ---------- --------- SMITH 20 CLERK ADAMS 20 CLERK JAMES 30 CLERK MILLER 10 CLERK
Try it with different values for the parameters. If either of the parameters is 'EVERYTHING', then all values (and NULL) in this column are in agreement.
In special cases (for example, if you know that deptno cannot be NULL) there is a little more simple ways to get the same results.
I hope that answers your question.
If not, post a small example data (CREATE TABLE and only relevant columns, INSERT statements) for all of the tables involved and also publish outcomes from these data.
Explain, using specific examples, how you get these results from these data. Given that this problem concerns the parameters, give a few sets of parameters and the results you want from the same sample for each game data.
If you can show the problem using commonly available (such as in the diagrams of scott or HR) tables, then you need not display the sample data; After the desired effect and the explanation.
Always tell what version of Oracle you are using. -
A stored procedure with input &; output parameter as XML
Hello
I have a requirement in which I need to have a stored procedure accepts with huge XML from Java and MS a process all the records in the XML file and return the output with a few messages inside XML.
CurrentY, I have a stored procedure to process the xml code stored in the Oracle database.
I am using the following SQL statement to read data from the XML column.
I want to run similar queries to retrieve data from the XML passed as parameter of entry of JAVA.select xmltest1.id,xmltest1.name from xmltest, XMLTABLE( XMLNamespaces(default 'syncpsna/schemas'), '/XMLTestRequest/insert/row' PASSING xmltest.data_xml COLUMNS "ID" number(10) PATH 'id', "NAME" varchar2(50) PATH 'name') xmltest1 where xmltest.id = 2;
If I could get some examples to read the XML and return the xml to the calling program.
ConcerningI can run the query to extract the different sections in the xml file when the XML is stored in a table column. How can do the same thing on XML passed as an input parameter.
Pretty much the same path, using the clause of PASSAGE.
Assuming that the input XML is passed as parameter 'p_inputXML', you can do:SELECT x.id , x.name FROM XMLTable( XMLNamespaces(default 'syncpsna/schemas'), '/XMLTestRequest/insert/row' PASSING p_inputXML COLUMNS "ID" number(10) PATH 'id', "NAME" varchar2(50) PATH 'name' ) x ;
-
a stored procedure with parameter
Hi all
Here is the code example
How to convert the code above in stored procedure in accepting "in_dt" as a parameter and pass the result the displayed value (output) setting OUT tell 'cur_out' (parameter)declare in_dt date := '1-feb-2010' ; col1 ...; col2 ...; col3 ...; begin select e.* into col1, col2, col3 from table_xyz e where e.start_dt = in_dt; end;
Thank you very much!!! I really appriciate it!variable cv refcursor; DECLARE P_DT DATE; BEGIN P_DT := '10-oct-2005'; scott.foo ( P_DT, :CV ); END; / print cv
REF CURSOR is when a program using Mickeysoft ODBC or Mickeysoft .NET needs a result set.
You don't need them in pure PL/SQL
Of course, you do not read further documentation and you ask me to ignore documentation.
I hate that!
I want to teach people how do fish not spoon feed them.-----------
Sybrand Bakker
Senior Oracle DBA -
Question packets and stored procedures
Been working with Oracle for a month now and I have a question about stored procedures/packages. I created 3 stored procedures and a search function to do some work as follows:
1 load the initial set of data into a table.
2. turn to day of the preceding table columns by using a specific search function.
3. put to update a single column with a value based on grouped subsets of the data in the table.
I divide the latter in separate proceedings to facilitate debugging and validation of each step, but now I want to put them all together and run them sequentially. In my view, there are two ways to do this:
1. create another stored procedure that will run the three in the right order.
2 create a package and move all procedures and functions and call each in the right order.
Don't know which approach is preferable, although I'm leaning towards the first option, any actual experience would be appreciated. Thanks in advance!
DaveHow about option 3:
3 create a package and move all procedures and functions, and then add an additional procedure in the package that calls each in the correct order and call this procedure.
PS. only this last procedure must be in the package spec. All others must be put into the body (and can remain hidden for the code outside the package).
Published by: Toon Koppelaars February 26, 2010 21:07
Maybe you are looking for
-
My question says it all.
-
Satellite C660-2EL does not start
Hi guys,. After a few days full of frustration here I am. I am working on a friends Satellite C660-2ELHe was stuck in the endless loop of boot Win 7 and would not be recovered by any means. So I decided a format was the way to go.After the format usi
-
Hello Basically, I have connected to the internet after a long period without access so there was quite a few automatic updates to download. After download, I turned back on my laptop, it started after the Toshiba screen and display a black screen th
-
RT vi no need to stop feature?
Just kind of a general question about target RT applications. As I see that we don't need a stop feature programmed on the side of the RT. Appropriate management of errors. But I don't see no matter what scenario why we would stop RT apps? If we chan
-
Replacement of a pirated version of Windows
So I need a new PC and this guy sells his computer but it has a pirated copy of Windows. If I buy a legitimate copy would be replaced the pirated copy and I can upgrade to Windows 10 very well? Thanks in advance