qq_28536271
qq_28536271
2015-10-13 02:58
采纳率: 100%
浏览 2.8k

oracle存储过程日期变量插入报错问题

不是很明白,求大神解惑。
执行报错:
ORA-00923: 未找到要求的 FROM 关键字
ORA-06512: 在 "AICHNL.LD_JUNK_TEST1", line 10
ORA-06512: 在 line 2

过程如下:
create or replace procedure ld_junk_test1 is
v_sql varchar2(4000);
v_chkdate date;
v_recdate varchar2(8);
begin
v_chkdate := sysdate;
v_recdate := to_char(v_chkdate, 'yyyymmdd');
v_sql := 'insert into ldjunk_1013_01 select ' || v_chkdate || ',' ||
v_recdate || ' from dual';
execute immediate v_sql;
commit;
end ld_junk_test1;

v_sql 值:
insert into ldjunk_1013_01 select 13-10月-15,20151013 from dual

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • beyon2008
    beyon2008 2015-10-15 09:18
    已采纳

    v_sql := 'insert into ldjunk_1013_01 select ' || v_chkdate || ',' ||

    v_chkdate是日期类型,不能隐性转换成varchar2,因为v_sql是varchar2字符串,跟sql不同

    点赞 评论
  • qq_28536271
    qq_28536271 2015-10-13 03:05

    改成下面这样就可以了,不过不理解为什么,求解
    create or replace procedure ld_junk_test1 is
    v_sql varchar2(4000);
    v_chkdate date;
    v_recdate varchar2(8);
    begin
    v_chkdate := sysdate;
    v_recdate := to_char(v_chkdate, 'yyyymmdd');
    v_sql := 'insert into ldjunk_1013_01 select :chk_date,' || v_recdate ||
    ' from dual';
    execute immediate v_sql
    using v_chkdate;
    commit;
    end ld_junk_test1;

    点赞 评论
  • lzp_lrp
    WorldMobile 2015-10-14 01:05

    v_sql := 'insert into ldjunk_1013_01 select :chk_date,' || v_recdate ||
    ' from dual';

    改成这个可以了?估计结果也是不对的,试试以下这个
    v_sql := 'insert into ldjunk_1013_01 select sysdate,' ||
    v_recdate || ' from dual';
    execute immediate v_sql;

    点赞 评论
  • qq_28536271
    qq_28536271 2015-10-14 09:26

    @PB人生
    execute immediate v_sql using v_chkdate; 这样带入后,可以的。但不清楚什么原因。
    直接塞sysdate也是可以的,但是我的是想要的是塞个时间变量。

    点赞 评论
  • qq_28536271
    qq_28536271 2015-10-14 09:28

    顺便还有个问题:

    execute immediate v_sql using v_1,v_2 ... 多变量的话

    dbms_output.put_line(v_sql, ...) 这个变量赋值怎么个格式?

    点赞 评论

相关推荐