#oracle #multiple-columns
#Oracle #несколько столбцов
Вопрос:
У меня есть таблица базы данных oracle со столбцами field_name_1, field_name_2, …, field_name_200. Я хочу выбрать и обновить каждый столбец в цикле для каждой строки данных, пожалуйста, помогите.
DECLARE
l_udf_vals tablea%ROWTYPE;
field_val_temp varchar2(150);
field_val field_val_temp%TYPE;
BEGIN
FOR yu IN (SELECT a.* FROM tablea a, tableb b, tablec c
WHERE a.function_id=b.function_id AND b.col = c.col AND )
LOOP
FOR i IN 1..200
LOOP
field_val_temp := 'field_val_'||i;
SELECT field_val_temp INTO field_val FROM tableb
WHERE function_id='STDCUSAC' AND rec_key = yu.rec_key;
IF field_val IS NOT NULL THEN
UPDATE tablec SET 'field_val_'||i = field_val;
END LOOP;
COMMIT;
END LOOP;
COMMIT;
END;
Комментарии:
1. Пожалуйста, не кричите, когда публикуете свои вопросы здесь. Это затрудняет их чтение, не даст вам ответов быстрее, и это довольно раздражает. С обеих сторон клавиатуры есть клавиши Shift, чтобы упростить их использование. Пожалуйста, сделайте это. Спасибо.
Ответ №1:
EXECUTE IMMEDIATE 'SELECT '||field_val_temp ||' FROM tableb
WHERE function_id = :func_val AND rec_key = :rec_key' INTO field_val
USING 'STDCUSAC' , yu.rec_key;
И,
EXECUTE IMMEDIATE 'UPDATE tablec SET field_val_'||i||' = :field_val'
USING field_val;
Вы должны использовать динамический SQL. Но, как говорит @duffymo, переосмыслите, чтобы нормализовать таблицу. Кроме того, если вы обновляете одну и ту же таблицу, попробуйте создать ее в виде одной строки запроса для нескольких столбцов после цикла.
Комментарии:
1. Большое спасибо OracleUser за эту идею. Чего я намерен добиться, так это обновить tablea (имеющую эти 200 столбцов field_val_ * ) данными из другой таблицы (tableb, имеющей ту же структуру, что и tablea), где когда-либо соответствующие данные столбца в tableb не равны нулю. Код, который я опубликовал, возможно, не очень хорошо выразил мое намерение. Пожалуйста, помогите. Просто подходит к PL / SQL. Еще раз спасибо.
2. Еще раз большое спасибо. Инструкции Execute Immediate работали нормально!
Ответ №2:
Это ужасная идея на очень многих уровнях.
Прежде всего, оно не нормализовано.
Во-вторых, вы умрете скрытой смертью. Производительность будет ужасной.
Это не способ сохранить нажатия клавиш. Я бы реорганизовал схему и код.