Я использую PHP 5.5 на Windows с расширением PDO. До сих пор все с oracle работало даже со скриптами plsql. Ниже приведен упрощенный код из моего пакета plsql и моего php-кода.
В основном я просто хочу передать массив $remarks
к процедуре PLSQL VARRAY_TEST
, Дело не в логике функции, а в самом вызове pdo.
TYPE remarkarray IS VARRAY(64) of varchar2;PROCEDURE VARRAY_TEST
(
remarks IN remarkarray,
examplemsg OUT varchar2
)
AS
BEGIN
for remarkcounter in remarks.first ..remarks.last loop
examplemsg := examplemsg || ' ' || remarks(remarkcounter);
end loop;
END VARRAY_TEST;
Теперь приходит мой код PHP-PDO.
$exampleMsg = "";
$remarks = ["hoho", "haha"];
$query = $this->prepare("begin MY_PACKAGE.VARRAY_TEST(:remarks, :exampleMsg); end;");
try
{
$query->bindParam(':remarks', $remarks, PDO::PARAM_STR);
$query->bindParam(':exampleMsg', $exampleMsg, PDO::PARAM_STR, 200);
$query->execute();
var_dump($exampleMsg);
}
catch(Exception $ex)
{
var_dump($ex);
}
К сожалению, выбрасывается следующее исключение:
class PDOException#50 (9) {
...
string(257) "SQLSTATE[HY000]: General error: 6550 OCIStmtExecute: ORA-06550: row 1, column 7:
PLS-00306: Wrong number or types of arguments in call 'VARRAY_TEST'
ORA-06550: Zeile 1, Spalte 7: PL/SQL: Statement ignored (ext\pdo_oci\oci_statement.c:148)"...
}
У кого-нибудь есть идеи, как это исправить? Также обходные пути высоко ценятся.
Спасибо заранее.
РЕДАКТИРОВАТЬ:
Пробовал пока безуспешно
Последний / третий параметр вообще удален из $query->bindParam(':remarks'...
class PDOException#50 (9) {
...
string(257) "SQLSTATE[HY000]: General error: 6550 OCIStmtExecute: ORA-06550: row 1, column 7:
PLS-00306: Wrong number or types of arguments in call 'VARRAY_TEST'
ORA-06550: Zeile 1, Spalte 7: PL/SQL: Statement ignored (ext\pdo_oci\oci_statement.c:148)"...
}
добавленной PDO::PARAM_STMT
вместо PDO::PARAM_STR
в результате чего
class PDOException#50 (9) {
...
string(144) "SQLSTATE[HY000]: General error: 1008 OCIStmtExecute: ORA-01008: Not all variables seem to have a bound value (ext\pdo_oci\oci_statement.c:148)"...
}
Я посмотрел исходные файлы PDO OCI, * .c из
https://pecl.php.net/package/PDO_OCI
Насколько я понимаю, PDO не поддерживает массивы.
Кстати, последняя версия PDO_OCI 1.0 восходит к 2005-11-26 на этой странице, 11 лет назад.
Глядя на документацию OCI
https://docs.oracle.com/cd/B28359_01/appdev.111/b28395/oci05bnd.htm#r7c1-t10
, для связывания «Массив структур или статических массивов» требуется вызов OCIBindArrayOfStruct (). Исходный код * .c PDO_OCI не имеет вызовов этой функции.
http://php.net/manual/en/function.oci-bind-array-by-name.php
$c = oci_connect('hr', 'hrpwd', '//localhost/XE');
$a = array('abc', 'def', 'ghi', 'jkl');
$s = oci_parse($c, "begin mypkg.myinsproc(:p1); end;");
oci_bind_array_by_name($s, ":p1", $a, count($a), -1, SQLT_CHR);
oci_execute($s);
Надеюсь это поможет.