首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在游标循环中,record.FIELD中的字段名是否必须是文字?

在游标循环中,record.FIELD中的字段名是否必须是文字?
EN

Stack Overflow用户
提问于 2018-06-06 23:16:22
回答 1查看 80关注 0票数 0

我正在准备一个程序,它将从几个表中提取数据并输出一个.csv文件,但有一个无法克服的问题,以简化代码。下面是这个问题的一个例子。

这段代码很简单:

代码语言:javascript
复制
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次:

代码语言:javascript
复制
  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少得多,但它引起了错误:

代码语言:javascript
复制
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数组会有问题吗?下面显示阵列正常:

代码语言:javascript
复制
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变量中。但它也产生了同样的错误:

代码语言:javascript
复制
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只接受字面值作为字段名,而不能识别变量。这是真的吗?有没有办法绕过这个限制来减少代码的混乱?

EN

回答 1

Stack Overflow用户

发布于 2018-06-07 07:43:05

您不能引用这样的查询。您可以使用动态SQL,但这可能不是一个好主意。我建议只列出聚合中的列名。如果想要加快速度,可以从ALL_TAB_COLS进行查询,以获得表中列的列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50723938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档