Выполнить функцию oracle с php, имеющим пользовательский массив в качестве параметра - PullRequest
0 голосов
/ 11 марта 2020

У меня есть функция oracle, которая имеет массив в качестве параметра, как показано ниже:

addGroups($empGroupId, $employees);

и добавляет группы сотрудников, но этот параметр массива определяется как пользовательский тип в данных oracle основание, как показано ниже:

CREATE OR REPLACE TYPE EMPLOYEES."ARR_VAR2"  is table of varchar2(32000);

Я пытался вызвать эту функцию в php и передать этот массив, как показано ниже:

$postdata = file_get_contents("php://input");
$request = json_decode($postdata);

//recieving parameters
$empGroupId= $request->ID;
$employees= $request->EMPLOYEES;

//establish connection
$conn = oci_connect("EMPLOYEES", "****", "ip/orcl");

//test connection
if ($conn)
{
  if($empGroupId!=NULL && $employees!=NULL)
  {
      $stmt =  "begin :resu :=addGroups(:empGroupId,:employees, :result ); end;";
      $stid=oci_parse($conn,$stmt);

      oci_bind_by_name($stid, ":empGroupId", $empGroupId);
      oci_bind_array_by_name($stid, ":employees", $employees, 250, 250, SQLT_VCS );
      oci_bind_by_name($stid, ":result", $result, 40);
      oci_bind_by_name($stid, ":resu", $resu, 100);

      oci_execute($stid);
      oci_free_statement($stid);

      $result1['output'] = array("result" => $result);
      return $result1;
else
{
//connection failed
echo 500;
}

, но он возвращает эту ошибку:

ORA-01458: недопустимая длина внутри переменной символьной строки

Я также попробовал новую коллекцию oci, как показано ниже:

 $stmt =  "begin :resu :=addGroups(:empGroupId,:employees, :result ); end;";
      $stid=oci_parse($conn,$stmt);

      oci_bind_by_name($stid, ":empGroupId", $empGroupId);
      $IDs= oci_new_collection($conn, 'ARR_VAR', 'EMPLOYEES');
     foreach($employees as $emp)
     {
       $IDs->append($emp);
     }
     oci_bind_by_name($stid, ":employees", $IDs, -1, SQLT_CHR );
      oci_bind_by_name($stid, ":result", $result, 40);
      oci_bind_by_name($stid, ":resu", $resu, 100);

      oci_execute($stid);
      oci_free_statement($stid);

      $result1['output'] = array("result" => $result);
      return $result1;
else
{
//connection failed
echo 500;
}

, и это дает мне эту ошибку:

Предупреждение : oci_new_collection (): ORA-22318: тип ввода не является типом массива

Неустранимая ошибка : Неопределенная ошибка: вызов функции-члена append () для логического значения

есть ли способ решить эту проблему

заранее спасибо

1 Ответ

0 голосов
/ 12 марта 2020

Большое спасибо, Кристофер, это было очень полезно, так как моя проблема была решена, и казалось, что я просто должен был добавить оператор pl / sql после создания новой коллекции, как показано ниже:

$conn = $this->conn;
    $IDs = oci_new_collection($conn, 'ARR_VAR');
    for ($i = 0; $i < count($employees ); ++$i)
     {
       $IDs->append($employees[$i]);
     }
    $stmt =  "begin :resu :=addGroups(:empGroupId,:employees, :result ); end;";

    $stid=oci_parse($conn,$stmt);
    oci_bind_by_name($stid, ":empGroupId", $empGroupId);
    oci_bind_by_name($stid, ":employees", $IDs, -1, OCI_B_NTY );
    oci_bind_by_name($stid, ":result", $result, 40);
    oci_bind_by_name($stid, ":resu", $resu, 100);
    oci_execute($stid);
    oci_free_statement($stid);
    $result1['output'] = array("result" => $result);
    return $result1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...