我正在准备一个程序,它将从几个表中提取数据并输出一个.csv文件,但有一个无法克服的问题,以简化代码。下面是这个问题的一个例子。
这段代码很简单:
declare
cursor cur_company is
select company_name, no_employees
from company;
line_out varchar2(200);
begin
for rec in cur_company loop
line_out := '';
line_out := line_out || rec.company_name || ',';
line_out := line_out || rec.no_employees;
dbms_output.put_line(line_out);
end loop;
end;
/
PL/SQL procedure successfully completed.
USCABLES,250
KODAK,2500
KLM,5000
HAMBRO,2000
FORD,8000
CITYBANK,3000
DISNEY,2500
在本例中,每条记录只有两个字段。但是我正在处理的过程处理了几十个字段,比如说60个,因此相同的连接语句将重复60次:
for rec in cur_company loop
line_out := '';
line_out := line_out || rec.field1 || ',';
line_out := line_out || rec.field2 || ',';
...
line_out := line_out || rec.field60;
...
end loop;
因此,代码并不美观。我想嵌入另一个循环来遍历所有字段。以下是代码,它的代码行数比60少得多,但它引起了错误:
declare
cursor cur_company is
select company_name, no_employees
from company;
line_out varchar2(200);
headerset varcharlist := varcharlist('COMPANY_NAME', 'NO_EMPLOYEES');
begin
for rec in cur_company loop
line_out := '';
for ctr in 1..headerset.count loop
if ctr = headerset.count then
line_out := line_out || rec.headerset(ctr);
else
line_out := line_out || rec.headerset(ctr) || ', ';
end if;
end loop;
dbms_output.put_line(line_out);
end loop;
end;
/
...
ORA-06550: line 12, column 41:
PLS-00302: component 'HEADERSET' must be declared
...
HEADERSET数组会有问题吗?下面显示阵列正常:
declare
headerset varcharlist := varcharlist('COMPANY_NAME', 'NO_EMPLOYEES');
begin
for ctr in 1..headerset.count loop
dbms_output.put_line(headerset(ctr));
end loop;
end;
/
PL/SQL procedure successfully completed.
COMPANY_NAME
NO_EMPLOYEES
或者是因为直接使用数组来命名字段?在使用数组元素之前,我尝试将它放入varchar2变量中。但它也产生了同样的错误:
declare
cursor cur_company is
select company_name, no_employees
from company;
line_out varchar2(200);
headerset varcharlist := varcharlist('COMPANY_NAME', 'NO_EMPLOYEES');
col_name varchar2(20);
begin
for rec in cur_company loop
line_out := '';
for ctr in 1..headerset.count loop
col_name := headerset(ctr);
if ctr = headerset.count then
line_out := line_out || rec.col_name;
else
line_out := line_out || rec.col_name || ', ';
end if;
end loop;
dbms_output.put_line(line_out);
end loop;
end;
/
...
ORA-06550: line 14, column 41:
PLS-00302: component 'COL_NAME' must be declared
...
现在,在我看来,在遍历游标记录的字段时,PL/SQL只接受字面值作为字段名,而不能识别变量。这是真的吗?有没有办法绕过这个限制来减少代码的混乱?
发布于 2018-06-07 07:43:05
您不能引用这样的查询。您可以使用动态SQL,但这可能不是一个好主意。我建议只列出聚合中的列名。如果想要加快速度,可以从ALL_TAB_COLS
进行查询,以获得表中列的列表。
https://stackoverflow.com/questions/50723938
复制相似问题