PL / SQL中的日期

时间:2015-10-20 11:16:44

标签: oracle date plsql

在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;

然后它工作得非常好。

任何建议/想法?

3 个答案:

答案 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;