2016-08-29 77 views
0

我想评估一个CASE语句(这是从函数返回的值)的表达式,如果它不符合其中一个条件返回表达式值本身。Oracle CASE语句 - 返回表达式值?

例如:

CASE UPDATE_RECORDS_F(party_number) 
WHEN 'ONE_RECORD_UPDATED' THEN RETURN 'OK'; 
WHEN 'MULTIPLE_RECORDS_UPDATED' THEN RETURN 'OK_MULTIPLE'; 
ELSE RETURN (expression value); 
END CASE; 

的“其他”情况下,需要时会抛出异常的。我可以将返回的函数值赋给一个字符串并进行评估,但我不知道错误消息可能会持续多长时间。我宁愿动态处理字符串值,而不是创建一个可以超出的设置长度的变量。

有没有办法做到这一点?

+0

你的问题包含自己的答案。在PL/SQL中保留值的方法是将其分配给一个变量。你说你关心返回值的长度;但是你将从你自己的功能中返回它。什么是你的函数的返回类型?如果它是VARCHAR2,则使用VARCHAR2(32767)的最大长度作为本地变量。 –

+0

除了其他考虑事项 - 你写的代码可以简化如下:'RETURN CASE UPDATE_RECORDS(...)WHEN ... THEN ... ..... END;'(警告:在这种情况下它是'END ',而不是'END CASE',因为现在你正在使用CASE表达式)。最好有一个'RETURN'语句而不是三个。 – mathguy

回答

1

如果抛出异常,则返回值未定义,异常将通过代码传播,直到找到合适的异常处理程序或将其返回给客户端。

如果您想要迎合任何返回值,请查看该函数定义为返回值,可能是VARCHAR2。它的最大尺寸是32767,所以你可以肯定你的函数永远不会返回大于这个值的值。

0

我想到的第一件事是修改您的UPDATE_RECORDS_F函数,以便捕获任何异常并返回预定义的字符串,以便您可以在case语句中检测到它。您不需要分配实际的异常字符串。当你的函数下降到异常块时,只需返回一些你想到的东西。

0

我假设你所说的异常实际上是一个字符串。是对的吗?

无论如何,我相信你应该将函数的输出存储在一个类型为CLOB的变量中,该变量的长度可以超过200万个字符。这样你就不会像在varchar类型的情况下那样限制你的输出为4000个字符。

参见documentation on Oracle data types

+0

使用CLOB的潜在好主意。但取决于将包含CASE语句的函数的返回类型。 –