我试图从php页面调用存储过程,但我没有得到我想要的结果。
我正在使用带有php的oci,查询执行如下所示:
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)
它仍然不会影响数据库。
存储过程调用一个我自己没有编写并且有参数的包,这可能就是我没有收到错误的原因吗? (再次当我用相同的值在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。显然不是我的选择,不要问。
好吧我觉得愚蠢,但事实证明,如果你的$query
变量是null
,oci_execute
将永远返回成功。
我的变量没有被称为$query
:我已经设置(并回应确认)$queryProcFTTx
,但我执行了$queryProcFttx
。我被VSCode欺骗了,当我双击变量时忽略了大小写。