【发布时间】:2019-02-28 14:29:43
【问题描述】:
我正在尝试从 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'),@ 987654324@ 为真,但数据库没有任何变化。
如果我在 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。显然不是我的选择,不要问。
【问题讨论】:
-
确保您连接到正确的数据库
-
执行存储过程后似乎没有发生 COMMIT。
-
@asiby 谢谢。是的,正如我所说,
INSERT有效,我可以看到对基础的影响 -
将这个条件:
ERROR_CODE != NULL OR ERROR_MSG != NULL替换成这个条件:ERROR_CODE IS NOT NULL OR ERROR_MSG IS NOT NULL。 any != NULL 总是评估为 NULL (false),因此永远不会执行 IF 语句和 RAISE 语句。 -
回想起来,简单的问题可能看起来很愚蠢,但请相信我,你不是第一个解决此类问题的人,也不会是最后一个。如果某人的评论帮助您解决了错误,我会鼓励他们发布他们的评论作为答案,以便您可以将其标记为答案。这样,当另一个新进取的开发人员遇到类似问题时,他们可能会遇到您的问题,这对他们也有帮助。 :) 我们都是从某个地方开始的,如果您不相信我,请查看我的问题历史,哈哈!很高兴你明白了。
标签: php oracle stored-procedures plsql oracle-call-interface