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;
有一个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;