Re: OCI8 Stored procedure execution

From: Date: Tue, 13 Jun 2000 19:25:03 +0000
Subject: Re: OCI8 Stored procedure execution
References: 1 2 3  Groups: php.db 
Request: Send a blank email to php-db+get-384@lists.php.net to get a copy of this message
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 my_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)

« previous php.db (#384) next »