Выбор имени столбца с аналогичным шаблоном в цикле

#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:

Это ужасная идея на очень многих уровнях.

Прежде всего, оно не нормализовано.

Во-вторых, вы умрете скрытой смертью. Производительность будет ужасной.

Это не способ сохранить нажатия клавиш. Я бы реорганизовал схему и код.