2016-08-29 79 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語句的函數的返回類型。 –