2013-04-11 19 views
0

函數假設以不同的格式返回日期,就這些了。看不到它有什麼問題!任何人都可以看到這個簡單的Oracle函數有什麼問題?

CREATE OR REPLACE 
FUNCTION get_cpd(a_date in varchar2)return varchar2 
IS 
cpd varchar2(4); 
BEGIN 
SELECT TO_CHAR(TO_DATE(a_date,'YY/MM/DD'),'YDDD') INTO cpd FROM DUAL; 
RETURN cpd; 
END get_CPD; 
+1

首先,你應該告訴我們爲什麼你認爲這是錯的。 – Pino 2013-04-11 10:00:33

+0

它似乎沒有錯,它編譯和運行。 'YDDD'看起來很奇怪,因爲它給出了一年的一位數; 'get_cpd('13/04/11')'給出'3101' ...所以你認爲什麼是錯的,爲什麼?問題可能在於你如何調用它(例如,傳遞'DATE'而不是'VARCHAR2'作爲參數)?使用'YY'有點危險,你不需要'cpd'變量,但這些不一定是錯誤。 – 2013-04-11 10:00:55

+0

您好坦克的回覆,我得到一個錯誤,當我稱它聲明選擇語句不完整。 這就是我所說的: select * from get_CPD('13/04/10'); 其實確切的錯誤是: ORA-00933:SQL命令未正確結束 – sergiopuy 2013-04-11 10:07:12

回答

1

這不是你如何調用一個函數。在Oracle中,您必須始終從某種東西中進行選擇。如果你沒有實際的表從選擇的數據,然後使用內置的單行表DUAL

select get_cpd('13/04/10') from dual; 

如果它是一個大的查詢的一部分,那麼你可以通過在列值:

select get_cpd(some_column) from some_table; 

如果你從另一個PL/SQL塊或其他客戶端調用它,那麼你不必有select,例如

declare 
    cpd varchar2(4); 
begin 
    cpd := get_cpd('13/04/10'); 
end; 
/

......但是假設你將會用值而不是僅顯示它。

順便說一句,您可以簡化功能採取的調用to_char利用這一方式:

create or replace function get_cpd(a_date in varchar2) 
return varchar2 is 
begin 
    return to_char(to_date(a_date,'YY/MM/DD'),'YDDD'); 
end get_cpd; 
/

select get_cpd('13/04/11') from dual; 

GET_CPD('13/04/11') 
-------------------------------------------------------------------------------- 
3101 

你或許應該還可以使用RR而不是YY了兩位數字的年份,但檢查文檔。

+0

非常感謝,工作得很好:)。 – sergiopuy 2013-04-11 10:15:17

+0

再次感謝,諾布的真正有用的提示。乾杯! – sergiopuy 2013-04-11 10:29:50

相關問題