创建存储过程 查询 出两个oracle 指定用户下所指定 表的公共列的差集
包头部分:
create or replace package WS_Check_Comparisons is
--添加组织,
type PUBLICK_ATTRIBUTE_TABLES is REF CURSOR;
PROCEDURE TWOCOMPARISONS(
P_CUR OUT BASE_CONSTANT.T_CUR,
P_CUR2 OUT PUBLICK_ATTRIBUTE_TABLES,
TABLE_START_OUT OUT VARCHAR2,
TABLENAMECHECK_ONE VARCHAR2,
TABLENAMECHECK_TWO VARCHAR2,
TABLENAMECHECK_ONE_P VARCHAR2,
TABLENAMECHECK_TWO_P VARCHAR2,
P_QUERY_TYPE NUMBER DEFAULT 0);
end WS_Check_Comparisons;
包体:
CREATE OR REPLACE PACKAGE BODY WS_CHECK_COMPARISONS IS
---进行2表的
--type PUBLICK_ATTRIBUTE_TABLES is REF CURSOR;-- 两表的公共列
--先根据2表查询有无公共列,无,返回空集。有进行下一步分条件查询
/* P_CUR 返出的数据集
P_CUR2
TABLE_START_OUT
TABLENAMECHECK_ONE 传入的表名1
TABLENAMECHECK_TWO V传入的表名2
P_QUERY_TYPE 查询类型
,
SELECT_TYPE_LIBRARY NUMBER DEFAULT 0
TWO_COUNT NUMBER; 两表的公共列个数
ONE_COLUMN 要查询的列名集合
TABLE_ONE 组合分割后的表名1
TABLE_TWO 组合分割后的表名2*/
--1和2的情况 1.syscd为主 如果有数据需要插入base 表 2.
PROCEDURE TWOCOMPARISONS(P_CUR OUT BASE_CONSTANT.T_CUR,
P_CUR2 OUT PUBLICK_ATTRIBUTE_TABLES,
TABLE_START_OUT OUT VARCHAR2,
TABLENAMECHECK_ONE VARCHAR2,
TABLENAMECHECK_TWO VARCHAR2,
TABLENAMECHECK_ONE_P VARCHAR2,
TABLENAMECHECK_TWO_P VARCHAR2,
P_QUERY_TYPE NUMBER DEFAULT 0
) AS
TWO_COUNT NUMBER;
ONE_COLUMN VARCHAR2(3999);
SELECT_TYPE_ZERO VARCHAR2(3999);
SELECT_TYPE_ONE VARCHAR2(3999);
SELECT_TYPE_TWO VARCHAR2(3999);
BEGIN
--******************************--
--******************************--
---查询两表的公共列
SELECT COUNT(*) INTO TWO_COUNT FROM(
SELECT * FROM( SELECT COLUMN_NAME FROM ALL_TAB_COLS WHERE TABLE_NAME = TABLENAMECHECK_ONE) tb1
INTERSECT
SELECT * FROM( SELECT COLUMN_NAME FROM ALL_TAB_COLS WHERE TABLE_NAME = TABLENAMECHECK_TWO) tb2 );
---查询两表的公共列
IF TWO_COUNT <= 0 THEN
--标识没有相同的列直接不查询 返回空的结果集
P_CUR:= NULL;
ELSE
--标识有相同的直 分条件判断
--查询公共的列部分
SELECT WMSYS.WM_CONCAT(COLUMN_NAME) INTO ONE_COLUMN FROM (
SELECT * FROM( SELECT COLUMN_NAME FROM ALL_TAB_COLS WHERE TABLE_NAME = TABLENAMECHECK_ONE) tb1
INTERSECT
SELECT * FROM( SELECT COLUMN_NAME FROM ALL_TAB_COLS WHERE TABLE_NAME = TABLENAMECHECK_TWO) tb2
) ;
--查询公共的列部分
SELECT_TYPE_ONE := 'SELECT '|| ONE_COLUMN ||' FROM '||TABLENAMECHECK_ONE_P||'.'||TABLENAMECHECK_ONE||' MINUS SELECT '|| ONE_COLUMN ||' FROM '||TABLENAMECHECK_TWO_P||'.'||TABLENAMECHECK_TWO;
SELECT_TYPE_TWO := 'SELECT '|| ONE_COLUMN ||' FROM '||TABLENAMECHECK_TWO_P||'.'||TABLENAMECHECK_TWO||' MINUS SELECT '|| ONE_COLUMN ||' FROM '||TABLENAMECHECK_ONE_P||'.'||TABLENAMECHECK_ONE;
IF P_QUERY_TYPE = 0 THEN
OPEN P_CUR FOR
SELECT * FROM USER_TABLES;
ELSIF P_QUERY_TYPE = 1 THEN
-----1-----------
OPEN P_CUR FOR
SELECT_TYPE_ONE ;
TABLE_START_OUT:= '查询成功';
-----1-----------
ELSIF P_QUERY_TYPE = 2 THEN
OPEN P_CUR FOR
SELECT_TYPE_TWO ;
TABLE_START_OUT:= '查询成功';
ELSE
P_CUR :=NULL;
TABLE_START_OUT:= '查询失败';
END IF;
--标识有相同的直 分条件判断
END IF;
--******************************--
END TWOCOMPARISONS;
---存储过程结束
END WS_CHECK_COMPARISONS;
首先根据传入的表的名称和用户 查询出2个表的公共列并判断公共个数,然后查询公共列的差集