我已使用以下代码使用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;
有人知道我在这里想念什么吗?
答案 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
似乎是函数的非常不具描述性的名称。