在PL / SQL中管理日期时遇到问题。
我想创建一个以日期作为输入的语句。
这是我的PL / SQL代码的关键部分:
stmt := 'INSERT INTO TMPWASMOVING (LOCATIONCODE, ITEMCODE, DATEBACK, TYPE)
SELECT CODE, "bpart_id",
TO_DATE(SUBSTR("receive_dt",0,10),''yyyy-mm-dd'')
- TO_DATE('||dst||',''yyyy-mm-dd''), ''Healthy'''
....
EXECUTE IMMEDIATE stmt;
使用以下格式“2015-09-01”输入的dst VARCHAR2。在这种情况下,我得到一个“输入值不够长的日期格式”错误。
如果我将代码更改为:
stmt := 'INSERT INTO TMPWASMOVING (LOCATIONCODE, ITEMCODE, DATEBACK, TYPE)
SELECT CODE, "bpart_id",
TO_DATE(SUBSTR("receive_dt",0,10),''yyyy-mm-dd'')
- TO_DATE(''2015_09-01'',''yyyy-mm-dd''), ''Healthy'''
....
EXECUTE IMMEDIATE stmt;
然后它工作得非常好。
任何建议/想法?
答案 0 :(得分:3)
您在代码中省略了dst
值周围的引号 - 以下内容应该有效:
stmt := ' INSERT INTO TMPWASMOVING (LOCATIONCODE, ITEMCODE, DATEBACK, TYPE)
SELECT CODE,"bpart_id",TO_DATE(SUBSTR("receive_dt",0,10),''yyyy-mm-dd'')- TO_DATE('''||dst||''',''yyyy-mm-dd''),''Healthy''
...
答案 1 :(得分:3)
我不明白你为什么要使用动态SQL这样做,因为似乎没有任何“动态”的东西。您可以使用静态INSERT语句完成相同的操作:
INSERT INTO TMPWASMOVING (LOCATIONCODE, ITEMCODE, DATEBACK, TYPE)
SELECT CODE,
"bpart_id",
TO_DATE(SUBSTR("receive_dt", 0, 10), 'yyyy-mm-dd')
- TO_DATE(dst, 'yyyy-mm-dd'),
'Healthy');
祝你好运。
答案 2 :(得分:2)
您还可以使用USING子句传递日期。
DECLARE
l_date DATE := to_date(dst, 'yyyy-mm-dd');
BEGIN
stmt := ' INSERT INTO TMPWASMOVING (LOCATIONCODE, ITEMCODE, DATEBACK, TYPE)
SELECT CODE,"bpart_id", TO_DATE(SUBSTR("receive_dt",0,10),''yyyy-mm-dd'') - :1,''Healthy''';
EXECUTE IMMEDIATE stmt USING l_date;
END;
PS。在你盲目引用之前,尝试使用引用文字。 (这里突出显示很差,所以在任何Oracle客户端中尝试)
DECLARE
s VARCHAR2(1024);
BEGIN
s := q'[Can't breathe 'cause it's beautiful.]';
DBMS_OUTPUT.PUT_LINE(s);
END;