从 oracle SP 返回隐式字符串

Posted

技术标签:

【中文标题】从 oracle SP 返回隐式字符串【英文标题】:Return implicit string from 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 分配给该变量并返回它。 提前致谢。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

以上是关于从 oracle SP 返回隐式字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Oracle 存储过程中获取两个返回值

网站后端_Python+Flask.0008.FLASK响应相关之隐式显式与自定义响应?

从 oracle 过程返回 Json 字符串

Oracle 是不是提供从已解析的字符串/clob 行返回多个子字符串的方法?

在 Oracle (> 11g) 中从逗号分隔列表创建表 - 输入字符串限制 4000 个字符

ORACLE SQL 查询从其他表中的行字符串匹配的行返回值