使用游标将pl / sql列名称作为变量

时间:2014-11-22 19:01:19

标签: oracle plsql cursor

我有一张包含" day_1"等列的表格。 ' day_2' ' day_3'等等 我想用这样的东西来碾压他们: 天='天_' || TO_CHAR(ⅰ); rec.day ....

我已经知道有一个很酷的东西叫做执行死因,但它对我不起作用,这里是代码

    set SERVEROUTPUT on

declare
cursor work_days is select distinct day_1, day_2,day_3........
from workDays;
str varchar2(256);
wday varchar2(10);

begin
for rec in work_days loop
for j in 1..2 loop
str:='SELECT ''day'||to_Char(j)||''' from dual';
execute immediate str into wday;
DBMS_OUTPUT.PUT_LINE(rec.wday);
end loop;
end loop;
end;

这就是错误

PLS-00302: component 'WDAY' must be declared

1 个答案:

答案 0 :(得分:0)

首先,您有一堆类似命名的列,并且您希望聚合这些列中的数据,这意味着您的数据模型不正确。如果您有30行数据而不是30行,那么您的数据库将更加合理地标准化,并且您的查询将更加容易。

假设您无法修复数据模型,那么您真的不想在这里使用动态SQL。你真的只是写一个将数据加在一起的查询

SELECT day_1 + day_2 + day_3 + ... + day_30 your_total
  FROM workDays

如果您真的需要保留数据模型并且您真的决心通过使用动态SQL来复杂化您的生活,那么您可以执行类似

的操作
DECLARE
  l_sql_stmt VARCHAR2(1000);
  l_sum      workDays.day_1%type := 0;
  l_element  workDays.day_1%type;
BEGIN
  FOR i IN 1..30
  LOOP
    l_sql_stmt := 'select day_' || i || ' from workDays';
    execute immediate l_sql_stmt into l_element;
    l_sum := l_sum + l_element;
  END LOOP;
END;

请注意,我假设workDays中只有一行。否则,您需要某种WHERE子句,以便EXECUTE IMMEDIATE可以在每次迭代时返回一行。或者,您可以将数据提取到集合中并拥有一组总和。