【发布时间】:2016-03-27 00:20:52
【问题描述】:
所以我有这张桌子--
create table orders (
ono number(5) not null primary key,
cno number(5) references customers,
eno number(4) references employees,
received date,
shipped date);
使用下面的脚本填充--
insert into orders values
(1020,1111,1000,'10-DEC-11','12-DEC-11');
insert into orders values
(1021,1111,1000,'12-JAN-12','15-JAN-12');
insert into orders values
(1022,2222,1001,'13-FEB-12','20-FEB-12');
insert into orders values
(1023,3333,1000,'12-MAR-12',null);
现在我正在尝试创建一个PL/SQL Procedure,它将输入作为一个月并显示该特定月份的订单。看来我只是无法正确获得EXTRACT()。这是我的代码块
CREATE OR REPLACE PROCEDURE TEST_REPORT
(MONTH_NUMBER IN NUMBER )
AS
V_MONTH VARCHAR2(10);
BEGIN
SELECT RECEIVED INTO V_MONTH
FROM ORDERS WHERE EXTRACT(MONTH FROM TO_DATE(
ORDERS.RECEIVED, 'DD-MON-RR'))=MONTH_NUMBER;
END TEST_REPORT;
我在这里做错了什么?作为记录,它编译并执行但不显示任何内容。
非常感谢
尝试 2
CREATE OR REPLACE PROCEDURE TEST_REPORT
(MONTH_NUMBER IN NUMBER )
DECLARE
CURSOR C1 IS SELECT RECEIVED INTO V_MONTH
FROM ORDERS
WHERE EXTRACT(MONTH FROM ORDERS.RECEIVED) = MONTH_NUMBER;
V_DATE ORDERS.RECEIVED%TYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO V_DATE;
IF C1%FOUND THEN -- fetch succeeded
DBMS_OUTPUT.PUT_LINE('DATE ' || V_DATE);
ELSE -- fetch failed, so exit loop
EXIT;
END IF;
END LOOP;
END TEST_REPORT;
【问题讨论】:
-
永远不要在 DATE 列上应用 TO_DATE。它强制 Oracle: 1. 首先将其转换为字符串 2. 然后根据特定于语言环境的 NLS 设置将其转换回日期。您需要 TO_DATE 将文字转换为日期。见stackoverflow.com/a/30332190/3989608
标签: oracle plsql oracle11g date-formatting date-arithmetic