我正在尝试从php页面调用存储过程,但没有得到想要的结果。
我将oci与php一起使用,查询执行如下:
function executeQuery($c, $query){
$stid = oci_parse($c, $query);
if (!$stid) {
$e = oci_error($c);
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$response['success'] = oci_execute($stid);
if (!$response['success']) {
$e = oci_error($stid);
$response['error'] = $e;
return $response;
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
//oci_commit($c); //auto commit is by default with oci_execute but I've tried this too.
oci_free_statement($stid);
}
如果我的 $query
是插入,则可以正常工作并提交插入,但是当它是CALL MY_PROC('VAR1
,'VAR2',VAR3时'),$response['success']
是正确的,但数据库上没有任何更改。
如果我在TOAD编辑器中执行CALL MY_PROC('VAR1', 'VAR2', VAR3')
并提交,它可以按预期工作,那么我可以在数据库中看到结果。但是当我从php调用我的过程时不会。
我尝试使用EXECUTE
代替CALL
,在查询末尾添加COMMIT;
,并且oci_commit($c)
仍然不会影响数据库。
存储过程调用了一个我自己没有写并且具有 out参数的程序包,这可能就是为什么我没有收到错误消息吗? (同样,当我以相同的值在Toad中运行它时,它也可以正常工作,并且没有出现特别的错误)。
我的程序如下:
CREATE OR REPLACE MY_PROC(
VAR1 IN VARCHAR2,
VAR2 IN VARCHAR2,
VAR3 IN VARCHAR2
)
IS
BEGIN
ERROR_CODE := NULL; --//inherited from the packages, don't really know what do do with them
ERROR_MSG := NULL;
IF VAR2 = NULL THEN
VAR2 := 'DEFAULT';
END IF;
PKG_USER.CREATE_USER(VAR1, VAR2, VAR3, ERROR_CODE, ERROR_MSG);
IF (ERROR_CODE != NULL OR ERROR_MSG != NULL) THEN
DBMS_OUTPUT.PUT_LINE('ERROR_CODE : ' || ERROR_CODE);
DBMS_OUTPUT.PUT_LINE('ERROR_MSG: ' || ERROR_MSG);
RAISE PROGRAM_ERROR; --//tried doing this to catch the errors but doesn't work
END IF;
END;
/
我猜问题的一部分在于那些错误输出参数,但是当我在TOAD中运行该参数时,它仍然可以正常工作而没有错误。
编辑:我只是意识到,如果我尝试调用不存在的过程,例如CALL MYY_PROC()
,它仍然不存在返回错误,并返回“成功”。
要注意的另一件事是,我正在不同的数据库上调用数字过程。在除此以外的所有其他基础上,我通常会出错并调用不正确存在的proc会返回:
ORA-06576: not a valid function or procedure name
因此IMO可能是两件事:复制粘贴错误(我现在正在检查)或提到的某些数据库设置(如@cdb_dba)。
顺便说一句,我正在使用php4开发该平台。显然,这不是我的选择,不要问。
答案 0 :(得分:0)
我感到很愚蠢,但事实证明,如果您的$query
变量为null
,oci_execute
将始终返回成功。
我的变量没有被称为$query
:我已经设置(并回显以确认)$queryProcFTTx
,但是我执行了$queryProcFttx
。 VSCode欺骗了我,当我双击变量时忽略了大小写,突出显示了两者。