Oracle PL/SQL中的日期
我在PL/SQL中管理日期时遇到问题 我想创建一个以日期作为输入的语句 以下是我的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
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');