Oracle: получить схемы, содержащие x, используя собственный динамический SQL - PullRequest
0 голосов
/ 30 ноября 2018

Существует сервер БД Oracle, который содержит множество схем.

Некоторые из них содержат таблицу «КОНТРОЛЛЕРЫ» со столбцом «IPADDRESS».

Я получаю доступ к таблица dba_tab_cols , которая также содержит столбец «ВЛАДЕЛЕЦ».Видимо, "ВЛАДЕЛЕЦ" может быть ключевым словом.Это может вызвать проблемы.

Однако, когда я запускаю

SELECT owner from dba_tab_cols where column_name = 'IPADDRESS' and table_name = 'CONTROLLERS';

, я получаю желаемый вывод с именами схем. Но пытаюсь заставить его работатьвнутри некоторого динамического SQL внутри цикла не дали результатов, на которые я надеялся.

DECLARE
ownername varchar(100);
BEGIN
FOR schema_rec IN (
        SELECT 'owner' into ownername from dba_tab_cols where column_name = 'IPADDRESS' and table_name = 'CONTROLLERS')
LOOP
        DBMS_OUTPUT.put_line('ownername');
        EXECUTE IMMEDIATE 'SELECT NAME, IPADDRESS from ' || ownername || '.CONTROLLERS where IPADDRESS=''X.X.X.X'';';
END LOOP;
END;

Это выдает мне следующее сообщение об ошибке: «неверное имя таблицы» в строке 8 иЯ не могу понять, что я сделал не так.Надеюсь, это просто проблема с синтаксисом.

Я уже пробовал разные вещи.Помещение владельца в одинарные и двойные кавычки и доступ к переменной цикла вместо «владельца» среди других.

РЕДАКТИРОВАТЬ: Это то, что я получил после возни немного:

SET SERVEROUTPUT ON
DECLARE
ownername varchar(100);
BEGIN
FOR schema_rec IN (
        SELECT owner into ownername from dba_tab_cols where column_name = 'IPADDRESS' and table_name = 'CONTROLLERS')
LOOP
        EXECUTE IMMEDIATE 'SELECT * from ' || schema_rec.owner || '.CONTROLLERS where IPADDRESS like ''1%''';
END LOOP;
END;

Он больше не выводит никаких ошибок, но и не выводит желаемый список.

Я не новичок в SQL, но в Oracle и благодарен за любые предложения / помощь.Спасибо

1 Ответ

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

Я получил его на работу.Проблема заключалась в том, что EXECUTE IMMEDIATE требует, чтобы запрос возвращал одну строку.

Я справился с этим следующим образом:

SET SERVEROUTPUT ON
DECLARE
ownername varchar(100);
ipcounter number;
ipaddress varchar(20):='X.X.X.X';
BEGIN
dbms_output.put_line(ipaddress);
FOR schema_rec IN (
        SELECT owner into ownername from dba_tab_cols where column_name = 'IPADDRESS' and table_name = 'CONTROLLERS')
LOOP
        EXECUTE IMMEDIATE ('SELECT COUNT(*) from ' || schema_rec.owner || '.CONTROLLERS where IPADDRESS like ''X.X.X.X''') into ipcounter;
        IF ipcounter > 0 THEN
            dbms_output.put_line('Schema '||schema_rec.owner ||': Table "CONTROLLERS" contains IP '||ipcounter||' times.');
        END IF;
END LOOP;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...