【发布时间】:2013-09-05 10:31:27
【问题描述】:
我是 plsql 新手,正在努力编写代码。我想使用 plsql 函数比较两个表(除了记录之外,两个表完全相同)。输入参数将是 (table1, table2) - 它应该比较 table1 和 table2 并返回三个输出。
- 表之间的任何不匹配记录
- table1 中存在但 table2 中不存在的任何行。
- table2 中存在但 table1 中不存在的任何行。
我用 SQL 编写了查询,它可以工作,但我在这里硬编码了一个特定的表名。 请告知如何转换为函数。
SET TERMOUT OFF CONCAT OFF VERIFY OFF
SET FEEDBACK OFF
SET MARKUP HTML ON SPOOL ON
SPOOL ACTION.HTML
set pages 1000 lines 125
----
PROMPT SHOWING THE DIFFERENCE WITH THE MATCHING RECORDS FOR TABLE ACTION
BREAK ON ACTIONID duplicates skip page
column tblname format a10
select ACTIONID,tblname "tblname",ACTIONDESC,ACTIONNAME
from ((SELECT 'OLD VALUES' tblname,ACTIONID,ACTIONDESC,ACTIONNAME
FROM 'DEPL_ACTION
MINUS
SELECT 'NEW VALUES' tblname,ACTIONID,ACTIONDESC,ACTIONNAME
FROM ACTION )
UNION ALL
( SELECT 'NEW VALUES' tblname,ACTIONID,ACTIONDESC,ACTIONNAME
FROM ACTION
MINUS
SELECT 'OLD VALUES' tblname,ACTIONID,ACTIONDESC,ACTIONNAME
FROM 'DEPL_ACTION )) aa where (ACTIONID) in ( select ACTIONID from (
(SELECT ACTIONID,ACTIONDESC,ACTIONNAME
FROM 'DEPL_ACTION
MINUS
SELECT ACTIONID,ACTIONDESC,ACTIONNAME
FROM ACTION )
UNION ALL
( SELECT ACTIONID,ACTIONDESC,ACTIONNAME
FROM ACTION
MINUS
SELECT ACTIONID,ACTIONDESC,ACTIONNAME
FROM 'DEPL_ACTION ) ) group by ACTIONID having count(*) > 1 ) order by ACTIONID;
CLEAR BREAKS
PROMPT SHOWING THE EXTRA RECORDS IN OLD VALUES FOR TABLE ACTION
select ACTIONID,tblname "tblname",ACTIONDESC,ACTIONNAME
from ((SELECT 'OLD VALUES' tblname,ACTIONID,ACTIONDESC,ACTIONNAME
FROM 'DEPL_ACTION
MINUS
SELECT 'NEW VALUES' tblname,ACTIONID,ACTIONDESC,ACTIONNAME
FROM ACTION )
UNION ALL
( SELECT 'NEW VALUES' tblname,ACTIONID,ACTIONDESC,ACTIONNAME
FROM ACTION
MINUS
SELECT 'OLD VALUES' tblname,ACTIONID,ACTIONDESC,ACTIONNAME
FROM 'DEPL_ACTION )) aa where (ACTIONID) in ( select ACTIONID from (
(SELECT ACTIONID,ACTIONDESC,ACTIONNAME
FROM 'DEPL_ACTION
MINUS
SELECT ACTIONID,ACTIONDESC,ACTIONNAME
FROM ACTION )
UNION ALL
( SELECT ACTIONID,ACTIONDESC,ACTIONNAME
FROM ACTION
MINUS
SELECT ACTIONID,ACTIONDESC,ACTIONNAME
FROM 'DEPL_ACTION ) ) group by ACTIONID having count(*) = 1 ) order by ACTIONID;
PROMPT SHOWING THE EXTRA RECORDS IN NEW VALUES FOR TABLE ACTION
select ACTIONID,tblname "tblname",ACTIONDESC,ACTIONNAME
from ((SELECT 'OLD VALUES' tblname,ACTIONID,ACTIONDESC,ACTIONNAME
FROM 'DEPL_ACTION
MINUS
SELECT 'NEW VALUES' tblname,ACTIONID,ACTIONDESC,ACTIONNAME
FROM ACTION )
UNION ALL
( SELECT 'NEW VALUES' tblname,ACTIONID,ACTIONDESC,ACTIONNAME
FROM ACTION
MINUS
SELECT 'OLD VALUES' tblname,ACTIONID,ACTIONDESC,ACTIONNAME
FROM 'DEPL_ACTION )) aa where (ACTIONID) in ( select ACTIONID from (
(SELECT ACTIONID,ACTIONDESC,ACTIONNAME
FROM 'DEPL_ACTION
MINUS
SELECT ACTIONID,ACTIONDESC,ACTIONNAME
FROM ACTION )
UNION ALL
( SELECT ACTIONID,ACTIONDESC,ACTIONNAME
FROM ACTION
MINUS
SELECT ACTIONID,ACTIONDESC,ACTIONNAME
FROM 'DEPL_ACTION ) ) group by ACTIONID having count(*) = 1 ) order by ACTIONID;
SET MARKUP HTML OFF
SPOOL OFF
EXIT
【问题讨论】:
-
您在为哪一部分苦苦挣扎?接受函数中的表名,或从函数中投影行,还是其他?
-
如果我想执行上述操作,我应该使用哪种返回类型??@DavidAldridge
-
首先我想问你为什么要用函数来做这件事——结果直接来自 SQL,所以为了方便你可以将逻辑嵌入到视图中,但使用函数确实似乎不是一个好的选择
-
我必须把它嵌入到一个套件中。所以我不能使用 sqlplus 。所以我们将以加密方式获得数据库连接,所以我们想使用一个函数@DavidAldridge
-
这个环境不能只对数据库运行查询吗?