Oracle&&Mysql存储过程实例

功能:将数据库中所有的用户表和视图的表名和表注释读取后插入到fbs_dataObject表,(若已存在则更新)并读取这些用户表的所有字段及字段注释后插入到fbs_dataobject_field_label表。(若已存在则更新)

一、Oracle版

create or replace procedure add_table_view_to_dataObject
IS
  --查询数据库中所有的系统
  CURSOR sysCur IS select sys_id from FBS_SYSTEM;
  --查询数据库中所有的用户表名
  CURSOR tabCur IS select TABLE_NAME from user_tables;
  --查询数据库中所有的用户视图名
  CURSOR viewCur IS select VIEW_NAME from user_views;
  dataObjNum INTEGER;
  note VARCHAR(100);
  dataObjectId VARCHAR(100);
  dataObjectIds VARCHAR(10000);
BEGIN
  -- 删除fbs_dataObject/fbs_dataobject_field_label中实际不存在的表/视图
  SELECT t1.ids || ',' || t2.ids INTO dataObjectIds
  FROM (SELECT wm_concat(''''||id||'''') ids FROM fbs_dataObject WHERE type = '1' AND object_name NOT IN (SELECT TABLE_NAME from user_tables)) t1,
       (SELECT wm_concat(''''||id||'''') ids FROM fbs_dataObject WHERE type = '2' AND object_name NOT IN (select VIEW_NAME from user_views)) t2;
  
  IF dataObjectIds != ',' THEN
    EXECUTE IMMEDIATE 'BEGIN 
                          DELETE FROM fbs_dataobject_field_label WHERE dataobject_id IN ('||dataObjectIds||');
                          DELETE FROM fbs_dataObject WHERE id IN ('||dataObjectIds||'); 
                       END;';
  END IF;
  
  --遍历所有的系统
  FOR sysId in sysCur LOOP
    --遍历所有的用户表
    FOR tabName in tabCur LOOP
        -- 判断该表是否已在fbs_dataObject中
        select COUNT(1) INTO dataObjNum from fbs_dataObject where sys_id=sysId.Sys_Id and type='1' and object_name = tabName.Table_Name;
        -- 获取表注释
        SELECT c.comments INTO note from user_tab_comments c WHERE c.table_type = 'TABLE' AND c.table_name = tabName.Table_Name;
        -- 若不存在则新增          
        IF dataObjNum = 0 THEN
          SELECT sys_guid() INTO dataObjectId FROM dual;


          -- 插入主表
          insert into fbs_dataObject(id,sys_id,object_name,type,fbs_sql,note,created_time)
            select dataObjectId,sysId.Sys_Id,tabName.Table_Name,'1','select * from '|| tabName.Table_Name, note, sysdate
            from dual;
          
          -- 插入子表
          INSERT INTO fbs_dataobject_field_label(id,sys_id,dataobject_id,property_name,display_title,created_time) 
             SELECT sys_guid(),sysId.Sys_Id,dataObjectId, t.column_name, t.comments,SYSDATE 
             FROM (select t.column_name,t.comments from user_col_comments t WHERE t.table_name = tabName.Table_Name) t;
        -- 若已存在则更新
        ELSE
            SELECT id INTO dataObjectId FROM fbs_dataObject WHERE sys_id=sysId.Sys_Id and type='1' and object_name = tabName.Table_Name;
            --更新主表
            UPDATE fbs_dataObject SET note=note, updated_time=sysdate WHERE id = dataObjectId;
            -- 更新子表
            DELETE FROM fbs_dataobject_field_label WHERE dataobject_id = dataObjectId;
            INSERT INTO fbs_dataobject_field_label(id,sys_id,dataobject_id,property_name,display_title,created_time) 
                SELECT sys_guid(),sysId.Sys_Id,dataObjectId, t.column_name, t.comments,SYSDATE 
                FROM (select t.column_name,t.comments from user_col_comments t WHERE t.table_name = tabName.Table_Name) t;
        END IF;
    END LOOP;


    --遍历所有的用户视图
    FOR viewName in viewCur LOOP
        -- 判断该视图是否已在fbs_dataObject中
        select COUNT(1) INTO dataObjNum from fbs_dataObject where sys_id=sysId.Sys_Id and type='2' and object_name = viewName.View_Name;
        -- 获取视图注释
        SELECT c.comments INTO note from user_tab_comments c WHERE c.table_type = 'VIEW' AND c.table_name = viewName.View_Name;
        -- 若不存在则新增         
        IF dataObjNum = 0 THEN
          SELECT sys_guid() INTO dataObjectId FROM dual;
          -- 插入主表
          insert into fbs_dataObject(id,sys_id,object_name,type,fbs_sql,note,created_time)
            SELECT dataObjectId,sysId.Sys_Id,viewName.View_Name,'2','select * from '|| viewName.View_Name,note,sysdate
            from dual;
          -- 插入子表
          INSERT INTO fbs_dataobject_field_label(id,sys_id,dataobject_id,property_name,display_title,created_time) 
             SELECT sys_guid(),sysId.Sys_Id,dataObjectId, t.column_name, t.comments,SYSDATE 
             FROM (select t.column_name,t.comments from user_col_comments t WHERE t.table_name = viewName.View_Name) t;
        -- 若已存在则更新
        ELSE
            SELECT id INTO dataObjectId FROM fbs_dataObject WHERE sys_id=sysId.Sys_Id and type='2' and object_name = viewName.View_Name;
            --更新主表
            UPDATE fbs_dataObject SET note=note, updated_time=sysdate WHERE id = dataObjectId;
            -- 更新子表
            DELETE FROM fbs_dataobject_field_label WHERE dataobject_id = dataObjectId;
            INSERT INTO fbs_dataobject_field_label(id,sys_id,dataobject_id,property_name,display_title,created_time) 
                SELECT sys_guid(),sysId.Sys_Id,dataObjectId, t.column_name, t.comments,SYSDATE 
                FROM (select t.column_name,t.comments from user_col_comments t WHERE t.table_name = viewName.View_Name) t;
        END IF;
    END LOOP;
  END LOOP;
  COMMIT;
END;

二、Mysql版

DELIMITER $$

USE `fbsys`$$

DROP PROCEDURE IF EXISTS `add_table_view_to_dataObject`$$

CREATE DEFINER=`fbsys`@`%` PROCEDURE `add_table_view_to_dataObject`()
BEGIN
  DECLARE sysId VARCHAR(100);
  DECLARE tabName VARCHAR(100);
  DECLARE tabComment VARCHAR(100);
  DECLARE tabType VARCHAR(10);
  DECLARE dataObjNum INT;
  DECLARE dataObjectId VARCHAR(100);
  DECLARE dataObjectIds VARCHAR(10000);
  DECLARE done INT;
  
  -- 查询数据库中所有的系统
  DECLARE sysCur CURSOR FOR SELECT sys_id FROM FBS_SYSTEM;
  -- 查询数据库中所有的用户表/视图的名称、注释及表类型
  DECLARE tabCur CURSOR FOR SELECT TABLE_NAME,table_comment,table_type FROM information_schema.tables WHERE TABLE_SCHEMA='fbsys';
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
  
  -- 删除fbs_dataObject/fbs_dataobject_field_label中实际不存在的表/视图
  SELECT group_concat(ID) INTO dataObjectIds
  FROM fbs_dataObject
  WHERE TYPE IN ('1','2') 
		AND id NOT IN(SELECT o.id
					  FROM fbs_dataObject o,(SELECT TABLE_NAME, CASE table_type WHEN 'BASE TABLE' THEN '1' WHEN 'VIEW' THEN '2' ELSE table_type END tableType FROM information_schema.tables WHERE TABLE_SCHEMA='fbsys') t
					  WHERE o.OBJECT_NAME =  t.TABLE_NAME AND o.TYPE = t.tableType);
	
  DELETE FROM fbs_dataobject_field_label WHERE find_in_set(dataobject_id, dataObjectIds);
  DELETE FROM fbs_dataObject WHERE find_in_set(id, dataObjectIds);

   --  遍历所有的系统
   OPEN sysCur;
   sysLoop:LOOP
	FETCH sysCur INTO sysId;   
	IF done=1 THEN
	    LEAVE sysLoop;
	END IF;
         
    OPEN tabCur;
	tabLoop:LOOP
		FETCH tabCur INTO tabName,tabComment,tabType;
		IF done=1 THEN
		  SET done = 0;
		  LEAVE tabLoop;
		END IF;
			
	    SET tabType = CASE tabType WHEN 'BASE TABLE' THEN '1' WHEN 'VIEW' THEN '2' ELSE tabType END;
	
	    -- 判断该表是否已在fbs_dataObject中
	    SELECT count(1) INTO dataObjNum FROM fbs_dataObject WHERE sys_id=sysId AND TYPE = tabType AND object_name = tabName;
	    -- 若不存在则新增
	    IF dataObjNum = 0 THEN
		  
		  SELECT replace(uuid(),'-','') INTO dataObjectId;
		  -- 插入主表
		  INSERT INTO fbs_dataObject(id,sys_id,object_name,TYPE,fbs_sql,note,created_time)
			VALUES(dataObjectId,sysId,tabName,tabType,concat('select * from ', tabName), tabComment, now());
		  
		  -- 插入从表
		  INSERT INTO fbs_dataobject_field_label(id,sys_id,dataobject_id,property_name,display_title,created_time) 
			 SELECT replace(uuid(),'-',''),sysId,dataObjectId, t.column_name, t.column_comment,now() 
			 FROM (SELECT column_name, column_comment FROM information_schema.columns WHERE table_name = tabName) t;
		-- 若已存在则更新
		ELSE
			SELECT id INTO dataObjectId FROM fbs_dataObject WHERE sys_id=sysId AND TYPE=tabType AND object_name = tabName;
            -- 更新主表
            UPDATE fbs_dataObject SET note=tabComment, updated_time=now() WHERE id = dataObjectId;
            -- 更新子表
            DELETE FROM fbs_dataobject_field_label WHERE dataobject_id = dataObjectId;
            INSERT INTO fbs_dataobject_field_label(id,sys_id,dataobject_id,property_name,display_title,created_time) 
			 SELECT replace(uuid(),'-',''),sysId,dataObjectId, t.column_name, t.column_comment,now() 
			 FROM (SELECT column_name, column_comment FROM information_schema.columns WHERE table_name = tabName) t;
	    END IF;
	END LOOP tabLoop;
	CLOSE tabCur;	
   END LOOP sysLoop;
   CLOSE sysCur;
END$$

DELIMITER ;
Oracle动态sql可参考链接: http://my.oschina.net/u/1458120/blog/225922 或 http://blog.csdn.net/li_guang/article/details/3995794

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值