oci_execute (): ORA-06550: PLS-00306: неверное число или типы аргументов - PullRequest
0 голосов
/ 17 декабря 2018

Я использовал приведенный ниже код для выполнения хранимой процедуры oracle с использованием php.

$s = oci_parse($db, 'begin :bind2 := XXXXXXXXX(:bind1); end;');

if(!$s)
{
    echo "wrong"; 
}
else
{
    echo "Right";
    $in_var = 'XXXXXXX';
    $in = oci_bind_by_name($s, ':bind1', $in_var);

    if(!$in)
    {
        echo "Incorrect in";
    }
    else
    {
        echo "Correct in";
        $cursor = oci_new_cursor($db);
        // On your code add the latest parameter to bind the cursor resource to the Oracle argument
        $k = oci_bind_by_name($s,':bind2', $cursor, -1, OCI_B_CURSOR);
        if(!$k)
        {
            echo "Wrong";
        }
        else
        {
            echo "Correct";
            // Execute the statement as in your first try
            $execute = oci_execute($s) or die ("Unable to execute query\n");
            if(!$execute)
            {
                echo "false";
            }
            else
            {
                echo "correct";
                // and now, execute the cursor
                $result = oci_execute($cursor,OCI_DEFAULT);
                echo $result;
                //oci_bind_by_name($s, ":bind2", $out_var, 20); // 20 is the return length
                //oci_execute($s,OCI_DEFAULT);
                //echo "Procedure returned value: " . $out_var;

                // Logoff from Oracle...
                oci_free_statement($s);
                oci_close($db);
            }
        }
    }
}

Я получаю приведенную ниже ошибку после выполнения приведенного выше фрагмента кода.

"oci_execute (): ORA-06550: строка 1, столбец 7: PLS-00306: неправильный номер или типы аргументов при вызове «XXXXXXXXX» ORA-06550: строка 1, столбец 7: PL / SQL: оператор игнорируется в / opt /lampp / htdocs / usermanagemet / callOraProc.php в строке 79 Невозможно выполнить запрос "

Моя процедура:

CREATE OR REPLACE FUNCTION XXXXXXXXX(
    username IN VARCHAR2)
  RETURN VARCHAR2
AS
  v_query VARCHAR2( 100);
  v_out   VARCHAR2(20);
BEGIN
  v_query := 'ALTER USER '|| username ||
    ' ACCOUNT LOCK
    PROFILE GNVLOCK';

  --dbms_output.put_line(v_query);
  EXECUTE immediate v_query;
  RETURN 'true';
EXCEPTION
WHEN OTHERS THEN
  RETURN SQLCODE;
END SLT_GNVUSER_DISABLE;

Кто-нибудь знает, что мне здесь не хватает?

1 Ответ

0 голосов
/ 17 декабря 2018

Проблема с вашим кодом заключается в том, что вы рассматриваете свой объект Oracle как процедуру, а на самом деле это функция.

Вы использовали:

$s = oci_parse($db, 'begin XXXXXXXXX(:bind1, :bind2); end;');

Вам следуетвместо этого используйте:

$s = oci_parse($db, 'begin :bind2 := XXXXXXXXX(:bind1); end;');

Это выполнит XXXXXXXXX, и результат в итоге будет :bind2, как вы уже ожидали.

Первый использованный вами синтаксис подойдет для процедурыу которого был OUT параметр, к которому вы могли получить доступ через bind2.

Кстати, я не знаю, выбрали ли вы схему именования функций или унаследовали ее, но XXXXXXXXX выглядит очень неописуемоназвание для вашей функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...