【问题标题】:Return implicit string from oracle SP从 oracle SP 返回隐式字符串
【发布时间】:2013-04-24 09:26:30
【问题描述】:

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

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 分配给该变量并返回它。 提前致谢。

【问题讨论】:

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


    【解决方案1】:

    你定义了一个没有OUT参数的过程,因此它不能返回任何东西。

    您有多种返回成功信息的选项:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多