调用过程 returns "success" 但 base 中没有任何变化
Calling a procedure returns "success" but nothing has changed in base
我正在尝试从 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)
它仍然不会影响数据库。
- 我做错了什么?这可能是一个提交问题吗?
- 我该怎么做才能得到错误而不是 "success"?
- 过程调用的行为可能与插入和选择不同吗?
存储过程调用的包不是我自己编写的,并且有 out 参数,这就是我没有收到错误的原因吗? (再次当我 运行 它在蟾蜍中具有相同的值时它工作正常,并且没有特别显示错误)。
我的程序是这样的:
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()
它仍然没有 return 错误,并且 return "success"。
另一件需要注意的事情是,我在 不同的数据库 上调用了一些过程。在除此之外的所有其他基础上,我通常会出错并调用一个不正确存在的过程 returns:
ORA-06576: not a valid function or procedure name
所以 IMO 它可能是两件事:复制粘贴错误(我现在正在检查)或一些数据库设置,如提到的@cdb_dba。
顺便说一句,我开发这个平台的用途是 php4。显然不是我的选择,不要问。
好吧,我觉得自己很愚蠢,但事实证明,如果您的 $query
变量是 null
,oci_execute
将始终 return 成功。
我的变量没有被调用 $query
:我已经设置(并回显确认)$queryProcFTTx
,但我执行了 $queryProcFttx
。我被 VSCode 欺骗了,当我双击变量时忽略大小写。
我正在尝试从 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)
它仍然不会影响数据库。
- 我做错了什么?这可能是一个提交问题吗?
- 我该怎么做才能得到错误而不是 "success"?
- 过程调用的行为可能与插入和选择不同吗?
存储过程调用的包不是我自己编写的,并且有 out 参数,这就是我没有收到错误的原因吗? (再次当我 运行 它在蟾蜍中具有相同的值时它工作正常,并且没有特别显示错误)。
我的程序是这样的:
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()
它仍然没有 return 错误,并且 return "success"。
另一件需要注意的事情是,我在 不同的数据库 上调用了一些过程。在除此之外的所有其他基础上,我通常会出错并调用一个不正确存在的过程 returns:
ORA-06576: not a valid function or procedure name
所以 IMO 它可能是两件事:复制粘贴错误(我现在正在检查)或一些数据库设置,如提到的@cdb_dba。
顺便说一句,我开发这个平台的用途是 php4。显然不是我的选择,不要问。
好吧,我觉得自己很愚蠢,但事实证明,如果您的 $query
变量是 null
,oci_execute
将始终 return 成功。
我的变量没有被调用 $query
:我已经设置(并回显确认)$queryProcFTTx
,但我执行了 $queryProcFttx
。我被 VSCode 欺骗了,当我双击变量时忽略大小写。