0

嗨,我有以下存储过程...

CREATE OR REPLACE PROCEDURE DB.INSERTGOOD
(
--CapRefCursor OUT Cap_Cur_Pkg.CapCur,
p_APPLIANT_TLT IN GOODRIGHT_MANUAL.APPLICANT_TLT%TYPE,
p_APPLIANT_NME IN GOODRIGHT_MANUAL.APPLICANT_NME%TYPE,
p_APPLICANT_SURNME IN GOODRIGHT_MANUAL.APPLICANT_SURNME%TYPE,
p_COMPANY_NME IN GOODRIGHT_MANUAL.COMPANY_NME%TYPE,
p_ID_CDE IN GOODRIGHT_MANUAL.ID_CDE%TYPE,
p_ADD1 IN GOODRIGHT_MANUAL.ADD1%TYPE,
p_OCCUPATION1 IN GOODRIGHT_MANUAL.OCCUPATION1%TYPE,
p_REMARK1 IN GOODRIGHT_MANUAL.REMARK1%TYPE,
p_SOURCE IN GOODRIGHT_MANUAL.SOURCE%TYPE
) 
IS
BEGIN


INSERT
INTO GOODRIGHT_MANUAL
(
SEQ_ID,
APPLICANT_TLT,      
APPLICANT_NME,
APPLICANT_SURNME,
COMPANY_NME,   
ID_CDE,
ADD1,            
OCCUPATION1,            
REMARK1,            
GOODRIGHT_MANUAL.SOURCE            
)
VALUES
(
goodright_seq.nextval, 
p_APPLIANT_TLT,
p_APPLIANT_NME,
p_APPLICANT_SURNME,
p_COMPANY_NME,
lower(p_ID_CDE),
p_ADD1,
p_OCCUPATION1,
p_REMARK1,
p_SOURCE
);
COMMIT;
-- OPEN CapRefCursor FOR
--select 'True';
EXCEPTION
WHEN DUP_VAL_ON_INDEX
THEN ROLLBACK;
--  select 'False';
END DB.INSERTGOOD;
/

在这里,如果事务提交成功,我想返回一个字符串 TRUE,如果事务回滚,则返回 FALSE。
定义了一个输出变量 CapRefCursor,但我不知道如何将 true false 分配给该变量并返回它。提前致谢。

4

1 回答 1

1

您已经定义了一个没有OUT参数的过程,因此它不能返回任何内容。

您有几个选项可以返回成功信息:

  1. 定义一个函数而不是一个过程。一个函数总是返回一些东西,您可以定义一个要返回的字符串VARCHAR2,例如在您的情况下。
  2. 为过程添加OUT参数。OUT参数在逻辑上等价于函数返回值。您可以拥有多个这样的参数。
  3. 修改您的逻辑,以便该过程在工作时不返回任何内容,并在失败时引发异常。

我会选择解决方案(3),因为:

  • 解决方案 (1) 和 (2) 容易出错:您可能很容易忘记检查返回码,在这种情况下,您的程序将继续执行,就好像在失败的情况下没有发生错误一样。忽略错误是将良性错误转变为怪物的最可靠方法,因为它可能导致广泛的数据损坏。您的程序可能会持续数月,而您却没有意识到它会间歇性地失败!
  • 异常逻辑就是为了克服这个问题而设计的,让代码更干净、更清晰。在每个过程调用之后不再有丑陋的 if-then-else。仅出于这个原因,解决方案 (1) 和 (2) 在广泛用于返回成功/错误状态时被视为代码异味(反模式)。
  • 涉及的代码更少,只需删除EXCEPTION块并让错误传播
  • 如果您让异常传播(并且不发出中间提交),失败的过程将撤消它们的工作而不回滚整个事务。

最后,一般来说,您不应控制子过程中的事务逻辑。执行单个插入的过程可能是较大事务的一部分。您不应让此过程提交或回滚。您的调用代码,无论是 PL/SQL、GUI 还是脚本,都应该决定事务是应该前进并完成还是回滚。

于 2013-04-24T09:47:10.867 回答