我有一张包含" 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
答案 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
可以在每次迭代时返回一行。或者,您可以将数据提取到集合中并拥有一组总和。