execute immediate v_sql 的使用方法

建表语句:

create table T_CT_XSRW
(
  业务机构 VARCHAR2(255),
  a1   NUMBER,
  a2   NUMBER,
  a3   NUMBER,
  a4   NUMBER,
  a5   NUMBER,
  a6   NUMBER,
  a7   NUMBER,
  a8   NUMBER,
  a9   NUMBER,
  a10  NUMBER,
  a11  NUMBER,
  a12  NUMBER
);

代码如下:

--导入销售任务   
declare
  v_billno varchar2(40);
  v_x      number;
  v_j      varchar2(40);
  v_begin  varchar2(40);
  v_end    varchar2(40);
  v_sql    varchar2(4000);
  v_je    number;
begin
  --循环取临时表   
  for rec in (select *
              from   t_ct_xsrw) loop
    v_billno := f_get_serial('RSL', null);
    --开始插入
    insert into t_md_sale_task_resolve_h
      (resolveno, compid, busno, task_year, sale_amount, gross_amount, lastmodify, lasttime, status, execdate, checker1,
       checkbit1, createuser, createtime, checkdate1, notes, checkbit2, checkbit3, checkbit4, checkbit5)
      select v_billno, 1, rec.业务机构, 2021,
             rec.a1 + rec.a2 + rec.a3 + rec.a4 + rec.a5 + rec.a6 + rec.a7 + rec.a8 + rec.a9 + rec.a10 + rec.a11 +
              rec.a12, 0, 168, sysdate, 0, null, null, 0, 168, sysdate, sysdate, '导入', 0, 0, 0, 0
      from   dual;
    --12月份循环开始     
    v_x := 0;
    while v_x <= 11 loop
      v_x := v_x + 1;
      --存特殊格式变量
      select 'rec.a' || to_char(v_x)
      into   v_j
      from   dual;
      
      v_sql:='select ' ||v_j||'  from dual';
      dbms_output.put_line(v_sql); 
    
      execute immediate v_sql  into v_je ;
      
      --本月第一天   
      SELECT TO_CHAR(TRUNC(to_date('2021-' || to_char(v_x, '00') || '-15', 'YYYY-MM-DD'), 'MM'), 'YYYY-MM-DD')
      into   v_begin
      FROM   DUAL;
      --本月最后一天  SELECT TO_CHAR(LAST_DAY(SYSDATE),'YYYY-MM-DD') "本月最后一天" FROM DUAL;
      SELECT TO_CHAR(LAST_DAY(to_date('2021-' || to_char(v_x, '00') || '-15', 'YYYY-MM-DD')), 'YYYY-MM-DD')
      into   v_end
      FROM   DUAL;
      
      --插入明细表
      v_sql := 'insert into t_md_sale_task_resolve_d (resolveno, rowno, task_year, task_month, sale_amount, gross_amount, startdate, enddate)' ||
               ' select ''' || v_billno || ''', ' || v_x || ', 2021,' || v_x || ',round(' || v_je || ',2) ' ||
               ', 0, to_date(''' || v_begin || ''', ''yyyy-mm-dd''), to_date(''' || v_end ||
               ''', ''yyyy-mm-dd'')  from   dual';
      --输出变量v_sql
      dbms_output.put_line(rec.a1);
      dbms_output.put_line(v_sql);
      execute immediate v_sql ;
      commit;
    end loop;
  end loop;
end;
 

下划线位置均报错。ORA-00904: "REC"."A1": 标识符无效
ORA-06512: 在 line 35

 

请问是为什么啊?这种动态字段名的使用方法应如何使用?

select a1 from t_ct_xsrw ;不报错

SQL 语句太复杂,建议分成多个部分,每个部分单独测试。

单独测试的结果也是一样的。同样的报错