database - PL/SQL-甲骨文 : ORA-01843: not a valid month

标签 database oracle plsql oracle11g toad

我想在 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/

相关文章:

mysql - 如何获取 last 获取最后 7 个条目

ruby-on-rails - 在 Ruby on Rails 中编辑资源

perl - 在 shell/Perl 脚本中保存密码的最佳实践?

oracle - 坐标转换

mysql - 这可以在MYSQL中完成吗

ruby-on-rails - 使用 Active Record 删除冗余查询

sql - 一个检查约束还是多个检查约束?

oracle - Oracle APEX 的终端名称

sql - PLS-00201 : identifier 'CURSOR' must be declared

json - 我们可以在不使用循环的情况下获得oracle中列表属性的总和吗?