Имя столбца 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 может вернуть одну строку на каждой итерации. С другой стороны, вы можете получать данные в коллекции и иметь коллекцию сумм.

Другие вопросы по тегам