Запрос ниже - это упрощенная версия 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?