我想在 Oracle 数据库版本 11.2.0.4 的 PL/SQL ETL 过程中将数据插入到一个带有时间戳列的表中
如果我在 Toad 中运行“Create INSERT from selectcted row”,我会得到以下 SQL 命令:
Insert into xxxx$1
(ID, ITEM, ITEMSIZE, QUALITY, MATERIAL,
COLOUR, IMAGEURL, CREATIONDATE, SAMPLEITEMNUMBER, ITEMNUMBER)
Values
(111, 339079775, '1', 'Microfaser PRIMABELLE®', 'TEXTILE',
'1 (=creme)', 'url', TO_TIMESTAMP('27.06.2016 15:49:35.000000','DD.MM.YYYY HH24:MI:SS.FF'), 'xxx', 'xxxx');
COMMIT;
在 PL/SQL 中,我生成了一个 VARCHAR2/String,看起来是一样的:
v_sql :=
'INSERT INTO xxxx'
|| p_importpostfix
|| ' VALUES ('
|| seq_xxxx.NEXTVAL
|| ','
|| v_rec.item_id
|| ', '''
|| v_size
|| ''','''
|| v_quality
|| ''','''
|| v_material
|| ''','''
|| v_colour
|| ''','''
|| NULL
|| ''',to_timestamp('''|| to_char( sysdate, 'DD.MM.YYYY HH24:MI:SS')||''',''DD.MM.YYYY HH24:MI:SS.FF''),'''
|| v_rec.vid
|| ''','''
|| v_rec.vid
|| ''')';
如果我在整个过程之外单独运行程序,它工作正常。 没有错误发生。
如果我运行由数据库 JOB 启动的完整进程,我将得到一个 ORACLE:
ORA-01843: not a valid month error.
我已经阅读了有关此问题的其他线程,但并未理解我的问题所在。
最佳答案
不确定这是否是问题所在,但按字面意义使用 SYSDATE 似乎更容易。
您似乎插入了字符串“NULL”。如果要插入 NULL 值,则不需要使用多个单引号,因为最终字符串不需要单引号来插入 NULL 值。
v_sql :=
'INSERT INTO xxxx'
|| p_importpostfix
|| ' VALUES ('
|| seq_xxxx.NEXTVAL
|| ','
|| v_rec.item_id
|| ', '''
|| v_size
|| ''','''
|| v_quality
|| ''','''
|| v_material
|| ''','''
|| v_colour
|| ''','
|| 'NULL,'
|| 'SYSDATE,'
|| ''''
|| v_rec.vid
|| ''','''
|| v_rec.vid
|| ''')';
编辑
与其尝试构建这样的查询,不如使用参数化查询。
v_sql := 'INSERT INTO xxxx' || p_importpostfix || ' VALUES(:1,:2,:3,:4,:5,:7,:8,:9,:10)';
v_null := NULL;
EXECUTE IMMEDIATE v_sql USING IN seq_xxxx.NEXTVAL,
IN v_rec.item_id,
IN v_size,
IN v_quality,
IN v_material,
IN v_colour,
IN v_null,
IN SYSTIMESTAMP,
IN v_rec.vid,
IN v_rec.vid;
想象一下,如果您的某个值包含 '
...
更多信息 on EXECUTE IMMEDIATE on Oracle documentation .不过,我认为您需要一个 Oracle 帐户。
关于database - PL/SQL-甲骨文 : ORA-01843: not a valid month,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38204350/