|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2006-12-13 17:09 UTC] alien at mosfasad dot ru
Description:
------------
when i execute procedure(ORACLE 10 R2) with out param. i catch error
in the version 5.1.4 all is ok.
Procedure wb_utils.ReportOrder is VALID !
PHP Version 5.2.1-dev
PHP API 20041225
PHP Extension 20060613
Zend Extension 220060519
OCI Revision $Revision: 1.269.2.16.2.26 $
PDO Driver for OCI 8 and later: enabled
Reproduce code:
---------------
$sSql = 'call wb_utils.ReportOrder(:var0,:out0,:var1,:var2,:var3)';
$aArguments = Array
(
[var0] => 24277102
[var1] =>
[var2] => args
[var3] => cols
)
$oStat = $this->oPDOs->prepare($sSql);
.....
$oStat->bindParam('out0',$this->Out0, PDO::PARAM_STR,4096);
.....
$oStat->execute($aArguments);
Expected result:
----------------
[13-дек-2006 19:49:57] PHP Fatal error: Uncaught in C:\prj\web\include\db.2.inc.php at 410 code :pdo_execute Param [HY000,SQLSTATE[HY000]: General error: 3131 OCIStmtExecute: ORA-03131: an invalid buffer was provided for the next piece
(ext\pdo_oci\oci_statement.c:142),
call wb_utils.ReportOrder(:var0,:out0,:var1,:var2,:var3)
] thrown in C:\prj\web\include\db.2.inc.php on line 410
Actual result:
--------------
execute procedure and get out param
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Nov 03 04:00:01 2025 UTC |
ini_set('display_errors','on'); $sSql = 'call wb_utils.ReportOrder(:var0,:out0,:var1,:var2,:var3)'; $sOut = ' '; $aArguments = Array ( 'var0' => 24277102, 'var1' => '', 'var2' => 'args', 'var3' => 'cols' ); $sDsn = 'oci:dbname=//saturn.icon3.ru/mito'; $sUser = 'XXX'; $sPass = 'XXXXXX'; $aArgs = array(); $oPDOs = new PDO($sDsn,$sUser,$sPass,$aArgs); /* !!! IF COMMENT LINE BELOW, NO ERROR */ $oPDOs->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); /**/ $oStat = $oPDOs->prepare( $sSql ); $oStat->bindParam('out0',$sOut, PDO::PARAM_STR,strlen( $sOut ) ); $oStat->execute($aArguments); echo '['.$sOut.']';i can temporary resolve this problem by this code: $sSql = 'call ReportOrder( :out0, :var0 , :var1)'; $sOut = ' '; $sVar0 = null; $aArguments = Array ('var0' =>'asdasasdasd','var1' =>'3242424' ); $sDsn = 'oci:dbname=********'; $sUser = '***'; $sPass = '*******'; $aArgs = array(); $oPDOs = new PDO($sDsn,$sUser,$sPass,$aArgs); $oStat = $oPDOs->prepare( $sSql ); $oStat->bindParam('out0', $sOut, PDO::PARAM_STR,strlen( $sOut ) ); /* !!!!!! this CODE !!!!*/ $oStat->bindParam('var0',$sVar0 ); $oStat->bindParam('var1',$sVar0 ); /* !!!!!!********!!!!*/ $oStat->execute($aArguments); echo '['.$sOut.']'; ?> PLSQL PROC : CREATE OR REPLACE PROCEDURE ReportOrder ( dCalcId OUT VARCHAR2, dFormId VARCHAR2, dFormId1 VARCHAR2 ) IS BEGIN dCalcId := dFormId || dFormId1; END;This bug is still exists in both PHP versions (5.2.12 & 5.3.1) I've set up two test VMs and am quite willing to help get this working. the following simple code easily re-produces the bug: try { $dbConn = new PDO('oci:dbname=.....); $dbConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = $dbConn->prepare(" BEGIN SELECT username INTO :chkId FROM USERS WHERE username = 'fred'; END; "); $sql->bindParam('chkId', $chkId); $sql->execute(); var_dump($chkId); } catch (Exception $e) { var_dump($e); } obviously I've censored our connection info. as the other user mentioned if I alter the bindParam to: $sql->bindParam('chkId', $chkId, PDO::PARAM_STR, 10); it works. however even missing off the variable length causes a error