2011-03-02 42 views
0

我正在使用pl/sql過程。我有一個初始化變量myvar,我想檢查它的值:如果它不包含'Z',我希望它包含'P'。SQL - 比解碼更簡單的功能

我目前做這種方式:

myvar := decode(myvar,'Z','Z','P'); 

我只是想知道是否有一個simplier辦法做到這一點。我的意思是,解碼已經很簡單了,但我覺得指定變量的內容已經在裏面了,這很奇怪!

如果這樣的功能就存在,它應該是這樣的:

Function myfunction(a In Varchar2, b In Varchar2, c In Varchar2) 
Return Varchar2 
Is    
Begin 
     if a <> b 
     then 
      return c; 
     end if; 
     return a; 
End myfunction; 

任何幫助,將不勝感激!

+1

DECODE是一個SQL趣味ction,而不是PL/SQL函數。所以你的「myvar:=解碼...」將不起作用。 – 2011-03-02 12:30:22

+0

@Rob。據我所知,沒有什麼能夠阻止在PL/SQL程序中使用SQL函數。無論如何,解碼在我的程序中工作正常。 – Hal 2011-03-02 15:02:40

+2

不與解碼。 SQL> declare 2 myvar varchar2(1); 3 begin 4 myvar:=解碼(myvar,'Z','Z','P'); 5 end; 6/ myvar:=解碼(myvar,'Z','Z','P');* 錯誤在第4行: ORA-06550:第4行,第12列: PLS-00204:函數或僞列'DECODE'可能僅在SQL語句中使用 ORA-06550:第4行第3列: PL/SQL:語句被忽略 – 2011-03-02 15:05:48

回答

2

把你的函數放到程序的聲明部分並使用它!

+0

我沒有想過,也許這太明顯了!它比case方法稍重,但它使我的代碼更簡單一些,因爲我在我的過程中多次使用它。 – Hal 2011-03-04 08:22:53

10

沒有內置函數完全符合您的需求。

你可以使用CASE,而不是DECODE:

CASE myvar WHEN 'Z' THEN 'Z' ELSE 'P' END 

它不會使雖然它的任何短!

+0

在我看來,這是最乾淨的方式,但正如你所說的那樣,它不會更短! – Hal 2011-03-04 08:18:30

1

我同意最好的選擇是使用CASE表達:

CASE myvar WHEN 'Z' THEN 'Z' ELSE 'P' END 

,如果你用DECODE感到幸福的另一種方法是運行此查詢:

SELECT decode(myvar,'Z','Z','P') 
    INTO myvar 
    FROM DUAL; 
+0

您的CASE選項是首選;當您強制執行SQL上下文切換時,您會獲得性能開銷。 – 2011-03-03 02:55:16

0

要回答你原來是否問題有一個更簡單的方法,也有這樣的:

if myvar <> 'Z' then 
    myvar := 'P' 
end if;