Отсутствует ключевое слово в инструкции EXECUTE IMMEDIATE SELECT INTO - Oracle PL / SQL - PullRequest
0 голосов
/ 02 февраля 2019

Запрос ниже - это упрощенная версия PL / SQL, которую я пытаюсь запустить, которая просто показывает общую структуру.Короче говоря, я пытаюсь извлечь информацию из SPECIAL_TABLE в переменные c, d.

DECLARE
  c NUMBER;
  d NUMBER;
BEGIN
  FOR all_tab IN
  (SELECT * FROM all_tables)
  LOOP
    BEGIN
      EXECUTE IMMEDIATE 'SELECT a, d INTO c, d
      FROM ' || :name || '.SPECIAL_TABLE WHERE name = '''
      :name || ''' AND table_name = ''' || all_tab.table_name || ''';

    ...

    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('ERROR OCCURRED');
    END;
END;

. Приведенный выше запрос не работает (под вышеприведенным запросом я имею в виду EXECUTE IMMEDIATE), и состояния Oracle905 missing keyword.За потоком здесь следует , насколько я могу судить.Обратите внимание, что ''' таков, что я могу избежать одного ' для оператора SELECT, а затем завершить всю строку целиком.Что странно, так это то, что я могу следовать приведенному ниже коду и не сталкиваться с ошибками:

DECLARE
  c NUMBER;
  d NUMBER;
BEGIN
  FOR all_tab IN
  (SELECT * FROM all_tables)
  LOOP
    BEGIN
      EXECUTE IMMEDIATE 'SELECT COUNT(*)
      FROM ' || :name || '.SPECIAL_TABLE WHERE name = '''
      :name || ''' AND table_name = ''' || all_tab.table_name || ''' INTO c;

    ...

    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('ERROR OCCURRED');
    END;
END;

Единственное, что меняется, это то, что я использую MAX(...) и, по-видимому, больше не следую указанному синтаксису ввышеуказанная гиперссылка.Я не уверен насчет синтаксической части и почему именно это работает, и MAX(...) обеспечит возврат только одной строки.Кажется, что это может быть источником проблемы, но когда я выполняю запрос SELECT, он возвращает только одну строку с двумя указанными столбцами.Первичный ключ для таблицы - PRIMARY KEY (a, b), поэтому она не должна возвращать более одной строки независимо от того.

Что мне здесь не хватает и как я могу заставить мой первоначальный оператор работать, чтобы назначить результат запросана несколько переменных в Oracle 11g?

1 Ответ

0 голосов
/ 02 февраля 2019

Ссылка, указанная вами, предназначена для выписки SELECT INTO.При выборе переменных с использованием EXECUTE IMMEDIATE вы должны играть по правилам EXECUTE IMMEDIATE.

Поэтому вместо этого:

EXECUTE IMMEDIATE 'SELECT x FROM myTable INTO y';
                                         ^ Incorrect: INTO is inside the string

Вы должны сделать это:

EXECUTE IMMEDIATE 'SELECT x FROM myTable' INTO y;
                                          ^ Correct: INTO is an EXECUTE IMMEDIATE keyword

Ваш запрос будет выглядеть примерно так:

EXECUTE IMMEDIATE 'SELECT a, d '
  || 'FROM ' || :name || '.SPECIAL_TABLE '
  || 'WHERE name = ''' || :name || ''' AND table_name = ''' || all_tab.table_name || ''''
INTO c, d;
...