【问题标题】:Calling a procedure returns "success" but nothing has changed in base调用过程返回“成功”,但基础没有任何变化
【发布时间】: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


【解决方案1】:

好吧,我觉得自己很愚蠢,但事实证明,如果您的 $query 变量是 nulloci_execute 将始终返回成功。

我的变量没有被调用$query:我已经设置(并回显以确认)$queryProcFTTx,但我执行了$queryProcFttx。我被 VSCode 欺骗了,当我双击变量时,它会突出显示两者,忽略大小写。

【讨论】:

    猜你喜欢
    • 2016-07-28
    • 2017-05-26
    • 1970-01-01
    • 2016-04-28
    • 2011-02-14
    • 2021-08-12
    • 1970-01-01
    • 2017-10-08
    • 2016-03-20
    相关资源
    最近更新 更多