我尝试在一个返回数字的包中调用存储的函数:
function LOGIN(USERNAME in varchar2 default null
, PASSWORD in varchar2 default null)
return number;
它为失败返回0或负整数,为成功返回正整数。 这是我的PHP代码调用函数:
$sql = ":v_res := PACK.LOGIN(:p_user, :p_pass)";
$bindings = [ ':p_user' => 'test', ':p_pass' => '1234', ':v_res' => & $result];
$statement oci_parse($connection, $sql);
foreach ($bindings as $k => & $v) {
oci_bind_by_name($statement, $k, $v, customSizeOf($v), determineSqlType($v));
}
oci_execute($statement);
当我使用如图所示的结果(在使用绑定之前未定义)时,它返回"未定义的变量"警告。如果我禁止警告并继续前进,则绑定为null,大小为-1和类型1(SQLT_CHR);如果我定义类似$result = -1;
的结果,则它绑定为-1,大小为PHP_INT_SIZE,类型为3(SQLT_INT)。
无论哪种方式,在执行时,都会产生此错误
ORA-01036: illegal variable name/number
答案 0 :(得分:1)
这不起作用,因为您必须将调用包装在PL / SQL块或SQL查询中:
$sql = "BEGIN :v_res := PACK.LOGIN(:p_user, :p_pass); END";
或者
$sql = "SELECT caller(:p_user, :p_pass) v_res FROM DUAL"
答案 1 :(得分:0)
这很有效,我已经不知道为什么了,但它确实有效:
$result = -1;
$sql = <<<"SQL"
begin
:V_RETURN := PACK.LOGIN(
USERNAME => :USERNAME,
PASSWORD => :PASSWORD
);
end;
SQL;
$bindings = [
':USERNAME' => $username,
':PASSWORD' => $password,
':V_RETURN' => & $result,
];
$statement oci_parse($connection, $sql);
foreach ($bindings as $k => & $v) {
oci_bind_by_name($statement, $k, $v, customSizeOf($v), determineSqlType($v));
}
oci_execute($statement);
它应该通过引用传递给数组,但仍然不知道为什么它工作而另一个抛出绑定错误;如果有的话,它应该绑定一个内存,它不会是$result
。
更新:最好使用SQLT_LNG
类型而不是SQLT_INT
,因为它可能无法在Unix系统上正常运行并且为int(-4294967295)
提供一切(溢出)。与公众相信,Windows适用于SQLT_INT
和SQLT_LNG
,因此我建议使用SQLT_LNG
兼容性问题。
答案 2 :(得分:-1)
@Cunning:请尝试以下选项。
尝试更改装订顺序
$ bindings = [&#39;:v_res&#39; =&GT; &安培; $ result,&#39;:p_user&#39; =&GT; &#39; test&#39;,&#39;:p_pass&#39; =&GT; &#39; 1234&#39;];