从 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 返回隐式字符串的主要内容,如果未能解决你的问题,请参考以下文章
网站后端_Python+Flask.0008.FLASK响应相关之隐式显式与自定义响应?
Oracle 是不是提供从已解析的字符串/clob 行返回多个子字符串的方法?