如何使用sysdate更新日期列,包括动态sql中的时间戳

时间:2015-02-04 05:49:18

标签: sql oracle plsql oracle11g

    CREATE OR REPLACE PROCEDURE TESTPROC
IS
   l_update_str   VARCHAR2 (4000);
BEGIN
   l_update_str :=
      'UPDATE XX_TABLE 
             last_update_date = ''' || SYSDATE || ''',
       WHERE     1=1';

   EXECUTE IMMEDIATE l_update_str;
END;
/

我上面已经尝试但是它没有用。我也尝试使用to_date(to_char(sysdate))但缺少时间戳

2 个答案:

答案 0 :(得分:8)

  

我已经尝试使用to_date(to_char(sysate))但缺少时间戳

这样做是没有意义的。

为什么PL / SQL会执行这么简单的任务。在纯SQL中执行此操作。 UPDATE 语句的简单语法是 -

UPDATE table_name SET column_name = SYSDATE WHERE <conditions>

要显示日期列,只需使用 TO_CHAR 以及正确的 FORMAT MODEL

SELECT TO_CHAR(column_name, 'MM/DD/YYYY HH24:MI:SS') FROM table_name;

例如,

SQL> create table t(a date);

Table created.

SQL> insert into t values(sysdate - 10);

1 row created.

SQL> select * from t;

A
---------
25-JAN-15

SQL> update t set a = sysdate;

1 row updated.

SQL> select to_char(a, 'mm/dd/yyyy hh24:mi:ss') dt from t;

DT
-------------------
02/04/2015 11:29:21

SQL>

更新关于动态SQL。

  

&#39;更新XX_TABLE                last_update_date =&#39;&#39;&#39; || SYSDATE || &#39;&#39;&#39 ;,          在哪里1 = 1&#39 ;;

  • 首先,更新语法是错误的。 SET 关键字缺失。
  • 其次,您不能在动态SQL中使用SYSDATE。

    由于您正在构建动态sql,sysdate值将附加到SQL。测试任何动态sql的最佳方法是使用 DBMS_OUTPUT ,看看动态SQL是否正确形成。

例如,

SQL> CREATE OR REPLACE
  2  PROCEDURE TESTPROC
  3  IS
  4    l_update_str VARCHAR2 (4000);
  5  BEGIN
  6    l_update_str := 'UPDATE t
  7  SET a = ' || SYSDATE;
  8    --EXECUTE IMMEDIATE l_update_str;
  9
 10    DBMS_OUTPUT.PUT_LINE(l_update_str);
 11  END;
 12  /

Procedure created.

SQL> exec testproc;
UPDATE t
SET a = 02/04/2015 11:46:53

PL/SQL procedure successfully completed.

SQL>

那么,你看到SQL形成了吗?附加了SYSDATE值,而不是实际使用关键字 SYSDATE

因此,您需要稍微更改动态sql。

SQL> CREATE OR REPLACE
  2  PROCEDURE TESTPROC
  3  IS
  4    l_update_str VARCHAR2 (4000);
  5  BEGIN
  6    l_update_str := 'UPDATE t
  7  SET a = SYSDATE';
  8    --EXECUTE IMMEDIATE l_update_str;
  9
 10    DBMS_OUTPUT.PUT_LINE(l_update_str);
 11  END;
 12  /

Procedure created.

SQL> exec testproc;
UPDATE t
SET a = SYSDATE

PL/SQL procedure successfully completed.

SQL>

现在上面的工作正常。

答案 1 :(得分:1)

只需输入systimestamp即可在列中设置时间戳。

CREATE OR REPLACE PROCEDURE TESTPROC
IS
   l_update_str   VARCHAR2 (4000);
BEGIN
   l_update_str :=
      'UPDATE test1
set name1 = SYSTIMESTAMP(6)
where 1=1';

   EXECUTE IMMEDIATE l_update_str;
END;