如何使用 sysdate 更新日期列,包括动态 sql 中的时间戳
How to update a date column with sysdate including timestamp in a dynamic sql
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(sysate)) 但时间戳丢失
I have aslo tried using to_date(to_char(sysate)) but the time stamp is missing
这样做没有意义。
为什么要 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。
'UPDATE XX_TABLE
last_update_date = ''' || SYSDATE || ''',
WHERE 1=1';
- 首先,更新语法是错误的。缺少 SET 关键字。
其次,你不能像在动态中那样使用 SYSDATE SQL。
由于您正在形成动态 sql,系统日期值附加到 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>
现在上面的方法可以正常工作了。
干脆把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;
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(sysate)) 但时间戳丢失
I have aslo tried using to_date(to_char(sysate)) but the time stamp is missing
这样做没有意义。
为什么要 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。
'UPDATE XX_TABLE last_update_date = ''' || SYSDATE || ''', WHERE 1=1';
- 首先,更新语法是错误的。缺少 SET 关键字。
其次,你不能像在动态中那样使用 SYSDATE SQL。
由于您正在形成动态 sql,系统日期值附加到 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>
现在上面的方法可以正常工作了。
干脆把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;