调用过程将返回“成功”,但基数没有任何变化

时间:2019-02-28 14:29:43

标签: php oracle stored-procedures plsql oci

我正在尝试从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开发该平台。显然,这不是我的选择,不要问。

1 个答案:

答案 0 :(得分:0)

我感到很愚蠢,但事实证明,如果您的$query变量为nulloci_execute将始终返回成功。

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