2017-03-29 22 views
5

Tại sao SQL này truy vấn làm việc:Chức năng NEXT_DAY hoạt động khác trong SQL so với PL/SQL?

SELECT NEXT_DAY(SYSDATE, 7) 
FROM DUAL; 
NEXT_DAY(SYSDATE,7) 
------------------- 
01-APR-17   
1 row selected. 

... nhưng khối ẩn danh này của PL/SQL không hoạt động?

DECLARE 
    dteExpires DATE; 
BEGIN 
    dteExpires := NEXT_DAY(SYSDATE, 7); 
END; 
Error at line 1 
ORA-01846: not a valid day of the week 
ORA-06512: at line 4 

Tôi không muốn cứng mã tham số thứ hai với tên tiếng Anh của một ngày cũ. NEXT_DAY(SYSDATE, 'SATURDAY') hoặc NEXT_DAY(SYSDATE, 'SUNDAY') vv

Hiện tại, tôi sẽ sử dụng công việc sau đây, nhưng tôi thực sự muốn biết tại sao NEXT_DAY() hoạt động khác trong PL/SQL so với trong SQL.

DECLARE 
    dteExpires DATE; 
BEGIN 
    -- 2017-01-01 = SUNDAY 
    dteExpires := NEXT_DAY(SYSDATE, TO_CHAR(TO_DATE('2017-01-01', 'YYYY-MM-DD'), 'DAY')); 
END; 

Đây là môi trường DEV của tôi:

SELECT * 
FROM v$version; 
BANNER                 

-------------------------------------------------------------------------------- 
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 
PL/SQL Release 12.1.0.2.0 - Production     
CORE 12.1.0.2.0 Production            
TNS for 64-bit Windows: Version 12.1.0.2.0 - Production    
NLSRTL Version 12.1.0.2.0 - Production         

5 rows selected. 
+0

Hành vi tương tự trong 11g XE. – Aleksej

Trả lời

3

Nếu bạn kiểm tra tài liệu cho phiên bản SQL của NEXT_DAY, bạn sẽ thấy rằng đi qua trong một số đại diện cho một ngày trong tuần không có giấy tờ. Nó hoạt động, vì bất kỳ lý do gì, nhưng nếu bạn dựa vào nó làm việc, bạn đang mạo hiểm rằng trong tương lai Oracle sẽ thay đổi việc thực hiện để phù hợp với đặc điểm kỹ thuật đã nêu của hàm này. (Các rủi ro là nhỏ, vì Oracle là không điên.)

https://docs.oracle.com/database/121/SQLRF/functions118.htm#SQLRF00672

Việc thực hiện PL/SQL chỉ hoạt động với các đặc điểm kỹ thuật tài liệu - nó không chấp nhận một số đầu vào để đại diện cho một ngày trong tuần.

Tôi đoán đây là câu trả lời gián tiếp. Tôi tin rằng bạn đang đặt câu hỏi sai. Câu hỏi không nên là "tại sao nó không hoạt động trong PL/SQL"; thay vào đó, được cung cấp tài liệu, câu hỏi phải là "tại sao nó hoạt động trong Oracle SQL". Chỉ Oracle mới có thể trả lời điều đó.

Bạn có thể tìm thấy cuộc thảo luận này tại OTN hữu ích: https://community.oracle.com/thread/4023654

Và có lẽ đây quá: https://community.oracle.com/ideas/17257?tab=comment

+0

Vâng, tôi cho rằng tôi đã đặt câu hỏi ngược lại, hoặc thực sự, tôi nên hỏi: "tại sao không có cách nào để làm điều này đúng cách?!?" Tôi hy vọng một ngày nào đó Oracle sẽ thêm một tham số NLS_DATE_LANGUAGE tùy chọn. – wweicker

0

Tôi nghĩ rằng cách duy nhất để thực hiện chức năng NEXT_DAY độc lập từ phiên hiện tại NLS_DATE_LANGUAGE là để workaround với tuần ISO nơi đầu tiên ngày trong tuần luôn là Thứ Hai:

SELECT NEXT_DAY(SYSDATE, TO_CHAR(TRUNC(SYSDATE, 'IW')+5, 'Day')) 
from dual; 

TRUNC(SYSDATE, 'IW')+5 nghĩa "Next Saturday"

012.
Các vấn đề liên quan