oci_execute():ORA-06550:PLS-00306:错误的参数数量或类型

时间:2018-12-17 12:47:25

标签: php oracle

我已使用以下代码使用php执行oracle存储过程。

$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 :(得分:1)

您的代码出现的问题似乎是您将Oracle对象视为一个过程,而它实际上是一个函数。

您使用过:

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

您应该使用:

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

这将执行XXXXXXXXX,结果将按您期望的那样在:bind2中结束。

您使用的第一种语法适用于具有OUT参数的过程,您可以通过bind2访问该参数。

顺便说一句,我不知道您是选择函数命名方案还是继承了它,但是XXXXXXXXX似乎是函数的非常不具描述性的名称。