从oracle SP返回隐式字符串

时间:2013-04-24 09:26:31

标签: database oracle stored-procedures cursor return-value

您好我有以下存储过程...

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并返回它。 提前致谢。

1 个答案:

答案 0 :(得分:1)

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

您可以通过多种方式返回成功信息:

  1. 定义函数而不是过程。函数总是返回一些东西,你可以定义一个字符串作为VARCHAR2返回,例如在你的情况下。
  2. 在过程中添加OUT参数。 OUT参数在逻辑上等效于函数返回值。您可以拥有多个此类参数。
  3. 修改你的逻辑,以便程序在工作时不返回任何内容,并在失败时抛出异常。
  4. 我会选择解决方案(3),因为:

    • 解决方案(1)和(2)容易出错:您可能很容易忘记检查返回代码,在这种情况下,您的程序将继续,好像在发生故障时没有发生错误。忽略错误是将良性错误转换为怪物的最可靠方法,因为它可能导致大量数据损坏。你的程序可能会持续数月,而你却没有意识到它会间歇性地失败!
    • 异常逻辑旨在克服此问题并使代码更清晰,更清晰。 在每次调用程序之后不再丑陋if-then-else 。仅仅由于这个原因,当广泛用于返回成功/错误状态时,解决方案(1)和(2)被认为是code-smell(反模式)。
    • 涉及的代码较少,只需删除EXCEPTION块,然后让错误传播
    • 如果让异常传播(并且不发出中间提交),则失败的过程将undo their work without rolling back the whole transaction

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