4

私はPHP-PDOとOracle11gを使用しています。多くの関数とストアドプロシージャを備えたOracleパッケージを使用しています。これで、sql * plusまたはsql開発者IDEから関数の1つを呼び出すときに、このコマンドを実行して結果セットを取得します。

   select package_name.function_name(param1,param2) from dual

それは正常に動作し、私の結果セットを返します。同じことをすると、PDO例外処理からエラーが発生します。PHP側のコードは次のようになります。

$stmt = "select package_name.function_name (?,?) from dual";
$res = $this->ConnOBJ->prepare($stmt);
$param1 = '1';
$param2 = null;
$result->bindParam(1,$param1);
$result->bindParam(2,$param2);
$result->execute();  

そして、ログファイルに記録されている例外が返されます。

Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 904 OCIStmtExecute: ORA-00904: "PACKAGE_NAME"."FUNCTION_NAME"": invalid identifier  (/var/www/php-5.3.3/ext/pdo_oci/oci_statement.c:146)' in /opt/web/dir/ora_class.php:209 Stack trace: #0 /opt/web/dir/ora_class.php(209): PDOStatement->execute() #1 /opt/web/dir/ora_class.php(298): dbPDO->execPackage() #2 {main}   thrown in /opt/web/dir/ora_class.php on line 209

クエリを間違った方法で渡していませんか?または、パラメータを間違った方法でバインドしていますか?

アップデート

これで、データがOracleに渡され、null値を渡す方法が見つかりました。私のコードは今

$stmt = "select package_name.function_name(?,?) from dual";
$res = $this->ConnOBJ->prepare($stmt);

$param1 = 1;
$param2 = null;

$res->bindParam(1,$param1,PDO::PARAM_INT);
$res->bindParam(2,$param2,PDO::PARAM_NULL);

$res->execute();
var_dump($res->fetchAll());

そして今、データを渡すと、エラーが返されます

PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 932 OCIStmtFetch: ORA-00932: inconsistent datatypes: expected CHAR got DTYCWD  (/var/www/php-5.3.3/ext/pdo_oci/oci_statement.c:467)' in /opt/web/dir/ora_class.php:216 Stack trace: #0 /opt/web/dir/ora_class.php(216): PDOStatement->fetchAll() #1 /opt/web/dir/ora_class.php(305): dbPDO->execPackage() #2 {main}   thrown in /opt/web/dir/ora_class.php on line 216

すべてのタイプが正しいことを確認していますが、それでも同じエラーが返されます。null値を削除して文字列を渡し、pdoタイプをPDO :: PARAM_STRに変更しましたが、それでもエラーが発生します。

4

3 に答える 3

1

関数は 1 つまたは 2 つのパラメーターを取りますか? SQL*Plus では、2 つのパラメーターを渡します。PHP では、1 つだけを渡します。関数が 2 つのパラメーターを必要とし、1 つのパラメーターのみを受け取るオーバーロードされたメソッドがない場合、このエラーが発生します。

于 2011-01-19T20:43:19.367 に答える
1

私はもう PDO を使用していません。OCI ドライバーを使用する予定です。助けてくれてありがとう。

于 2011-01-24T14:36:17.030 に答える