Re: OCI8 Stored procedure execution

From: Date: Wed, 14 Jun 2000 13:06:06 +0000
Subject: Re: OCI8 Stored procedure execution
References: 1 2  Groups: php.db 
Request: Send a blank email to php-db+get-405@lists.php.net to get a copy of this message
On Wed, Jun 14, 2000 at 08:08:36AM -0400, Fred M. Bulah wrote: > > Thies, > All of the examples in the OCIBindByName() online description use variable > names with the colon prefix. I interpreted this to mean that they were > always necessary until your example with cursors. Cursors apparently are an my mistake - obviouly it makes no difference if you use ":name" or "name" in ocibindbyname. (just tried both in my refcurs.php) > exception(and possibly LOB and B_FILE). In this case, I thought that > ts_name had to be bound as a normal bind variable. Not so? I'm trying to ??? > understand completely what the rules are. Point taken aboout OCIFetch() - > it should only be used for explicit (vs implicit) cursors. from the manual: --- OCIFetch() fetches the next row (for SELECT statements) into the internal result-buffer. --- a refcursor is a special case where the reference to a "SELECT statements" is returned via a stored procedure or a nested table. the sample in the manual should be clear enough to understand OCIBindByName the sample (refcurs.php) i sent you shows in addition to that how to return REFCURSORs from stored procedues. tc > > > -----Original Message----- > From: thies@digicol.de [mailto:thies@digicol.de] > Sent: Wednesday, June 14, 2000 6:28 AM > To: Fred Bulah > Cc: php-db@lists.php.net > Subject: Re: [PHP-DB] OCI8 Stored procedure execution > > > > hmm, > > ocibindbyname($stmt, ":ts_name", &$ts_name, 32); > > looks wrong to me. why the colon? > > also note that you should only call ocifetch for cursors! you > stored procedure returns simple varchar2 fiels so your > results are in $ts_name and $tbl_name after ociexecute(). no > need to fetch anything. my sample returned a REFCURSOR, > therefore we needed the fetch (note: on the returned cursor). > > tc > > On Tue, Jun 13, 2000 at 03:25:03PM -0400, Fred Bulah wrote: > > > > Thanks, your samples worked fine. > > I created a variation that, once working, would make me confident that I > know how > > the mechanism works: > > > > CREATE OR REPLACE PACKAGE my_test_cursor1 AS > > > > Procedure get_tbl(ts_name IN VARCHAR2, > > tbl_name OUT VARCHAR2); > > CURSOR tbl_cur (ts_name VARCHAR2) IS > > SELECT table_name > > FROM user_tables > > WHERE tablespace_name = ts_name > > ORDER BY table_name; > > v_table_name VARCHAR2(64); > > END my_test_cursor1; > > / > > > > show error > > > > CREATE OR REPLACE PACKAGE BODY my_test_cursor1 AS > > Procedure get_tbl(ts_name IN VARCHAR2, > > tbl_name OUT VARCHAR2) > > IS > > BEGIN > > IF NOT tbl_cur%ISOPEN THEN > > OPEN tbl_cur(ts_name); > > END IF; > > > > v_table_name := null; > > > > FETCH tbl_cur INTO tbl_name; > > > > IF tbl_cur%NOTFOUND THEN > > CLOSE tbl_cur; > > END IF; > > > > END get_tbl; > > END my_test_cursor1; > > / > > show error > > > > > > the PHP: > > > > 1 <?php > > 2 > > 3 $conn = OCILogon("fredb","fmb22956"); > > 4 > > 5 $stmt = OCIParse($conn,"begin > y_test_cursor1.get_tbl( :ts_name, > > :tbl_name ); end;"); > > 6 > > 7 $ts_name = "MY_TABLESPACE_NAME"; > > 8 > > 9 ocibindbyname($stmt, ":ts_name", &$ts_name, 32); > > 10 > > 11 ocibindbyname($stmt, ":tbl_name", &$tbl_name, 32); > > 12 > > 13 ociexecute($stmt); > > 14 > > 15 // while (OCIFetchInto( $stmt, &$tbl_name )) > > 16 > > 17 while (OCIFetch( $stmt )) > > 18 > > 19 { > > 20 > > 21 var_dump($tbl_name); > > 22 > > 23 } > > 24 > > 25 OCIFreeStatement( $stmt ); > > 26 > > 27 OCILogoff( $conn ); > > 28 > > 29 ?> > > > > It produces the error: > > > > Warning: OCIFetch: ORA-24374: define not done before fetch or execute and > fetch > > in > > /home/fredb/xanboo/htdocs/my_test_cursor1.php on line 17 > > > > I am unsure how to get the results in this case. I tried OCIFetch() and > > OCIFetchInto() and got the same error. > > Is my package variation workable? > > > > > > thies@digicol.de wrote: > > > > > fred, please see my attached sample > > > > > > On Tue, Jun 13, 2000 at 12:59:55PM -0400, Fred M. Bulah wrote: > > > > > > > > I just tried this 2 ways and got errors on both: > > > > > > > > 1 - Removed colon from OCIBindByName() call only => same error. > > > > 2 - Removed colon from both OCIBindByName() and OCIParse() yields the > error: > > > > test 10: execute stored procedure 'mytest4' > > > > > > > > Warning: OCIBindByName: ORA-01036: illegal variable name/number > > > > in /home/fredb/xanboo/htdocs/testoci10.htm on line 15 > > > > > > > > > > > > Warning: OCIStmtExecute: ORA-06550: line 1, column 16: > > > > PLS-00201: identifier 'NAME' must be declared > > > > ORA-06550: line 1, column 7: > > > > PL/SQL: Statement ignored > > > > in /home/fredb/xanboo/htdocs/testoci10.htm on line 18 > > > > > > > > > > > > Warning: OCIFetchInto: ORA-24374: define not done before fetch or > > > > execute and fetch > > > > in /home/fredb/xanboo/htdocs/testoci10.htm on line 23 > > > > > > > > > > > > > > > > > > > > > > > > -----Original Message----- > > > > From: Fred M. Bulah [mailto:fredb@corecam.com] > > > > Sent: Tuesday, June 13, 2000 12:50 PM > > > > To: thies@digicol.de > > > > Cc: php-db@lists.php.net > > > > Subject: RE: [PHP-DB] OCI8 Stored procedure execution > > > > > > > > > > > > > > > > No colons on both the OCIParse() and OCIBindByName I presume? > > > > > > > > -----Original Message----- > > > > From: thies@digicol.de [mailto:thies@digicol.de] > > > > Sent: Tuesday, June 13, 2000 4:17 AM > > > > To: Fred Bulah > > > > Cc: php-db@lists.php.net > > > > Subject: Re: [PHP-DB] OCI8 Stored procedure execution > > > > > > > > > > > > On Mon, Jun 12, 2000 at 06:39:14PM -0400, Fred Bulah wrote: > > > > > > > > > > Another problem: > > > > > > > > > > The following PHP4 code is supposed to retrieve a list of user > tables: > > > > > > > > > > 1 <?php > > > > > 2 print "<HTML><PRE>"; > > > > > 3 print "test 10: execute stored procedure > > > > > 'mytest4'<br>"; > > > > > 4 $conn = OCILogon("fredb","fmb22956"); > > > > > 5 > > > > > 6 // $stmt = OCIParse( $conn, "select table_name from > user_tables" ); > > > > > 7 > > > > > 8 $stmt = OCIParse( $conn, "begin mytest4( :name ); end;" ); > > > > // What about here ^ ? > > > > > > > > > > > > > 9 OCIBindByName( $stmt, ':name', &$name, 32 ); > > > > > > > > OCIBindByName( $stmt, 'name', &$name, 32 ); // <- no > > > > colon. > > > > > > > > > 10 OCIExecute( $stmt ); > > > > > 11 $nrows = 0; > > > > > 12 while ( OCIFetchInto( $stmt, &$results, ORA_NUM ) ) > > > > > 13 { > > > > > 14 print "results[$nrows]=$results[0]<br>"; > > > > > 15 $nrows++; > > > > > 16 } > > > > > 17 > > > > > 18 OCIFreeStatement( $stmt ); > > > > > 19 OCILogOff($conn); > > > > > 20 print "</PRE></HTML>"; > > > > > 21 ?> > > > > > > > > > > Fails with the following error: > > > > > > > > > > test 10: execute stored procedure 'mytest4' > > > > > > > > > > Warning: OCIFetchInto: ORA-24374: define not done before fetch or > execute > > > > and > > > > > fetch > > > > > in /home/fredb/xanboo/htdocs/testoci10.htm on line 23 > > > > > > > > > > The stored procedure definition is: > > > > > > > > > > create or replace procedure mytest4( my_data out varchar2 ) > > > > > is > > > > > > > > > > cursor get_data is select table_name from user_tables; > > > > > begin > > > > > open get_data; > > > > > loop > > > > > dbms_output.put_line (my_data); > > > > > fetch get_data into my_data; > > > > > exit when get_data%notfound; > > > > > end loop; > > > > > close get_data; > > > > > end; > > > > > / > > > > > > > > > > I am not at all sure that this is the correct way to do this. > > > > > Clearly from the result it probably is not. > > > > > It works fine if I use the embedded SQL on line 6 instead of the > stored > > > > > procedure call and bind on lines 8 and 9. > > > > > The stored procedure works in sqlplus, but does require the > directive "set > > > > > serveroutput on" prior to invocation in order to see output > displayed on > > > > the > > > > > screen. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > > Thies C. Arntzen "One Big-Mac, Small Fries and a > Coke!" > > > > Digital Collections Phone +49 40 235350 Fax +49 40 > 23535180 > > > > Hammerbrookstr. 93 20097 Hamburg / > Germany > > > > > > -- > > > > > > Thies C. Arntzen "One Big-Mac, Small Fries and a Coke!" > > > Digital Collections Phone +49 40 235350 Fax +49 40 23535180 > > > Hammerbrookstr. 93 20097 Hamburg / Germany > > > > > > ------------------------------------------------------------------------ > > > > > > refcurs.phpName: refcurs.php > > > Type: application/x-httpd-php > > > > > > refcurs.sqlName: refcurs.sql > > > Type: Plain Text (text/plain) > > -- > > Thies C. Arntzen "One Big-Mac, Small Fries and a Coke!" > Digital Collections Phone +49 40 235350 Fax +49 40 23535180 > Hammerbrookstr. 93 20097 Hamburg / Germany -- Thies C. Arntzen "One Big-Mac, Small Fries and a Coke!" Digital Collections Phone +49 40 235350 Fax +49 40 23535180 Hammerbrookstr. 93 20097 Hamburg / Germany

« previous php.db (#405) next »