Имя столбца pl/sql как переменная с использованием курсора
У меня есть таблица с такими столбцами, как "день_1", "день_2", "день_3" и т. Д. Я хочу запустить их, используя что-то вроде этого: день ='день_'||to_char(i); rec.day....
я уже узнал, что есть классная вещь, называемая execute emmediate, но она не работает для меня, вот код
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 ответ
Во-первых, тот факт, что у вас есть куча столбцов с одинаковыми именами и что вы хотите объединить данные в этих столбцах, явно означает, что ваша модель данных неверна. Если бы у вас было 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
может вернуть одну строку на каждой итерации. С другой стороны, вы можете получать данные в коллекции и иметь коллекцию сумм.