私は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に変更しましたが、それでもエラーが発生します。