建表语句:
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 语句太复杂,建议分成多个部分,每个部分单独测试。
单独测试的结果也是一样的。同样的报错