Select 在 Oracle 中使用 DATABASE LINK 具有相同模式的两个表中的数据?
Select data from two tables having same schema using DATABASE LINK in Oracle?
我有两个具有相同架构的数据库,
我需要在 Oracle 中使用 DATABASE LINK 从具有相同架构(相同名称、相同列)的两个表中获取 select 数据?
SQL> select * from TEST1;
ID NAME
---------- ----------
2 Two
4 Foor
SQL> select * from TEST1@link22;
ID NAME
---------- ----------
1 One
3 Three
SQL> select * from TEST1, TEST1@link22;
select * from TEST1, TEST1@link22
*
ERROR at line 1:
ORA-00918: column ambiguously defined
我想获得以下结果:
ID NAME
---------- ----------
2 Two
4 Foor
1 One
3 Three
此致,
使用UNION ALL
运算符
select * from TEST1
UNION ALL
select * from TEST1@link22;
编辑:
新增功能草稿:
CREATE OR REPLACE TYPE site IS OBJECT (id NUMBER, name VARCHAR2(255));
/
CREATE OR REPLACE TYPE site_collection IS TABLE OF site;
/
CREATE OR REPLACE FUNCTION merge_sites (sites SYS.ODCIVARCHAR2LIST) RETURN site_collection PIPELINED
IS
commandText VARCHAR2(4000);
c SYS_REFCURSOR;
sid test.id%type;
sname test.name%type;
BEGIN
FOR i IN 1..sites.COUNT LOOP
commandText := 'SELECT id, name FROM ' || sites(i);
OPEN c FOR commandText;
LOOP
FETCH c INTO sid, sname;
EXIT WHEN c%NOTFOUND;
PIPE ROW (site(sid, sname));
END LOOP;
END LOOP;
END;
/
SELECT * FROM TABLE(merge_sites(sys.ODCIVARCHAR2LIST('test1', 'TEST1@link22')));
您需要确保类型和表之间的数据类型匹配。
我有两个具有相同架构的数据库, 我需要在 Oracle 中使用 DATABASE LINK 从具有相同架构(相同名称、相同列)的两个表中获取 select 数据?
SQL> select * from TEST1;
ID NAME
---------- ----------
2 Two
4 Foor
SQL> select * from TEST1@link22;
ID NAME
---------- ----------
1 One
3 Three
SQL> select * from TEST1, TEST1@link22;
select * from TEST1, TEST1@link22
*
ERROR at line 1:
ORA-00918: column ambiguously defined
我想获得以下结果:
ID NAME
---------- ----------
2 Two
4 Foor
1 One
3 Three
此致,
使用UNION ALL
运算符
select * from TEST1
UNION ALL
select * from TEST1@link22;
编辑:
新增功能草稿:
CREATE OR REPLACE TYPE site IS OBJECT (id NUMBER, name VARCHAR2(255));
/
CREATE OR REPLACE TYPE site_collection IS TABLE OF site;
/
CREATE OR REPLACE FUNCTION merge_sites (sites SYS.ODCIVARCHAR2LIST) RETURN site_collection PIPELINED
IS
commandText VARCHAR2(4000);
c SYS_REFCURSOR;
sid test.id%type;
sname test.name%type;
BEGIN
FOR i IN 1..sites.COUNT LOOP
commandText := 'SELECT id, name FROM ' || sites(i);
OPEN c FOR commandText;
LOOP
FETCH c INTO sid, sname;
EXIT WHEN c%NOTFOUND;
PIPE ROW (site(sid, sname));
END LOOP;
END LOOP;
END;
/
SELECT * FROM TABLE(merge_sites(sys.ODCIVARCHAR2LIST('test1', 'TEST1@link22')));
您需要确保类型和表之间的数据类型匹配。