Как передать массив строк в процедуру plsql в php с pdo

Я использую 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)"...
    }
    

3

Решение

Я посмотрел исходные файлы 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 не имеет вызовов этой функции.

2

Другие решения

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);

Надеюсь это поможет.

1

По вопросам рекламы [email protected]