Oracle工作纪要3

创建存储过程 查询 出两个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个表的公共列并判断公共个数,然后查询公共列的差集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值