Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL中的日期_Oracle_Date_Plsql - Fatal编程技术网

Oracle PL/SQL中的日期

Oracle PL/SQL中的日期,oracle,date,plsql,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

我在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 a 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;
那么它就工作得非常好了


有什么建议/想法吗?

您在代码中省略了
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''
...

还可以使用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;
在你看不到引号之前,试着使用引号。 (此处突出显示效果不佳,请在任何Oracle客户端中尝试)


我不明白为什么要使用动态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');

祝你好运。

你有没有试过添加一对单引号:to|DATE(''''dst''yyyy-mm-dd')?看看你为什么要添加substr?@Moudiz这个问题应该向作者提出,但我认为他试图从varchar字段中删除一个日期。@diziag我的意思是在今天的第二天,他没有使用substr来代替to|DATE(''2015_09-01''是的,日期的格式不太清晰,必须删减。我同意你的观点。没有理由(ab)在这里使用EXECUTE IMMEDIATE。+1这只是我用于测试的代码的一部分,但表名也是一个参数
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');