Oracle:使用本机动态获取包含 x 的方案 SQL

Oracle: Get schemes containing x using native dynamic SQL

有一个Oracle DB Server,里面有很多方案。

其中一些包含 table "CONTROLLERS" 和 "IPADDRESS".

我正在访问 dba_tab_cols table,其中还包含一个 "OWNER" 列。显然,"OWNER" 可能是一个关键字。那可能会造成麻烦。

然而,当我 运行

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 行 "invalid table name",我不知道我做错了什么。希望这只是一些简单的语法问题。

我已经尝试了各种东西。将所有者放在单引号和双引号中并访问循环变量而不是 "ownername" 等。

编辑:这是我摆弄了一下后得到的:

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 的新手,感谢任何 suggestions/help。谢谢

我让它工作了。问题是 EXECUTE IMMEDIATE 需要查询 return 一行。

我通过如下方式解决了这个问题:

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;