调用一个过程返回“成功”但基础没有任何变化

问题描述 投票:0回答:1

我试图从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。显然不是我的选择,不要问。

php oracle stored-procedures plsql oci
1个回答
0
投票

好吧我觉得愚蠢,但事实证明,如果你的$query变量是nulloci_execute将永远返回成功。

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

© www.soinside.com 2019 - 2024. All rights reserved.