PL / SQL: SELECT INTO с использованием переменной в предложении FROM - PullRequest
0 голосов
/ 19 ноября 2018

Код:

lc_tab1_col1 VARCHAR2(4000);
lc_tab1_col2 VARCHAR2(4000);
lc_tab2_col2 VARCHAR2(4000);
lc_tab2_col2 VARCHAR2(4000);
CURSOR my_cursor IS select col1, col2 from tab1;

[...]

    OPEN my_cursor;

       LOOP
       FETCH my_cursor INTO lc_tab1_col1, lc_tab1_col2;
       EXIT WHEN my_cursor%NOTFOUND;

           SELECT lc_tab1_col2.col1, lc_tab1_col2.col2 INTO lc_tab2_col2, lc_tab2_col2 FROM lc_tab1_col2 WHERE lc_tab1_col2.col3 = lc_tab1_col1;


           [...]

       END LOOP;

    CLOSE my_cursor;

Привет, ребята,

Я пытаюсь заставить приведенный выше код работать.У меня проблема в том, что оператор SELECT INTO, очевидно, не поддерживает использование переменной (в этом случае lc_tab1_col2) в качестве имени таблицы в предложении FROM оператора.

При компиляции пакета ORA-000942 выбрасывается (таблица или представление не существует), что говорит мне, что переменная интерпретируется напрямую, а не заменяется и интерпретируется во время выполнения.

Я не могу придумать обходной путь, любые идеио том, как это исправить?

Еще немного информации: lc_tab1_col2 содержит имя таблицы в базе данных, тогда как lc_tab1_col1 содержит идентификатор.

Этот идентификатор присутствует во всех таблицах, которые могут содержаться в lc_tab1_col2 (отсюда и предложение WHERE).

Помимо идентификатора есть еще два столбца (lc_tab1_col2.col1 и lc_tab1_col2.col2), которые присутствуют во всех этих таблицах, но отсутствуют в tab1.Мне нужно выбрать эти два значения для работы с ними внутри цикла.

Поскольку нужно учитывать много таблиц, мне нужно, чтобы этот оператор SELECT INTO был динамическим.Было бы невозможно проанализировать таблицы один за другим.Ждем всех, кто поделится умной идеей для преодоления этой проблемы :) Заранее спасибо!

1 Ответ

0 голосов
/ 19 ноября 2018

Я думаю, что ваше исключение действительно означает, что эта таблица не существует или у вас нет прав для ее выбора.

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

DECLARE 
  user_tables varchar2(30) := 'TBLCOMPANIES';
BEGIN
  SELECT table_name
    INTO user_tables 
    FROM user_tables
   WHERE user_tables.table_name = user_tables;

  dbms_output.put_line(user_tables) ;
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...