数据库
首页 > 数据库> > Oracle全库查询字段内容存储过程

Oracle全库查询字段内容存储过程

作者:互联网

 Oracle全库查询字段内容存储过程,可输入关键字查询该关键字在表中出现在哪个字段,出现在某张表内有几条记录。

步骤:

一、先创建存储过程:PRODUCE_QUERY_KEY_WORD_RECORD

二、执行存储过程:call PRODUCE_QUERY_KEY_WORD_RECORD(' 关键词')

三、执行查询:select * from tmp_keyword_info 获取全库查找结果

create PROCEDURE PRODUCE_QUERY_KEY_WORD_RECORD  (
  V_KEY_WORD IN VARCHAR2
) Authid Current_User  --加上该句是为解决存储过程中新建的表,进行访问时提示权限不足的问题,lyz++全库搜索关键字
AS 
  V_SQL     VARCHAR2(4000);							
  V_TB_COL  VARCHAR2(512);
	
	--记录每个匹配列中含有关键字记录总数
  V_CNT     NUMBER(18,0);	
	
	--记录每个有匹配表的总匹配记录数
	V_COUNT_OF_TABLE NUMBER(18,0) DEFAULT 0;		
	
	--记录总的匹配记录条数
	V_TOTAL   NUMBER(18, 0);
	
	--记录上次查询字段所属表
	V_LASTTABLE VARCHAR2(150) DEFAULT 'null'; 
	
	--记录当前查询字段所属表
	V_CURTABLE  VARCHAR2(150) DEFAULT 'null';  
	
	--创建表语句
	V_SQL_CREATE_TMP_TABLE VARCHAR2(500);
	
	--临时表旧数据删除语句
	V_SQL_TRUNCATE_TMP_TABLE VARCHAR2(100);
	
	--单个表匹配数据总量
	V_TEP_TABLE_COUNT VARCHAR2(100);
 
  
  --使用游标,将所有表的每个字段的每行数据值与关键字匹配的查询拼接为sql
  CURSOR CUR_SQLS IS 
    SELECT 'SELECT ''' || X.TABLE_NAME || '.' || X.COLUMN_NAME || ''' AS COL_NAME, NVL(COUNT(' || X.COLUMN_NAME || '),0) AS CNT FROM ' || X.TABLE_NAME 
           || ' A WHERE A.' || X.COLUMN_NAME || ' LIKE ''%' || V_KEY_WORD || '%''' AS SQL_STR 
    FROM COLS X JOIN USER_OBJECTS Y ON X.TABLE_NAME = Y.OBJECT_NAME
    WHERE Y.TEMPORARY <> 'Y' AND OBJECT_TYPE = 'TABLE' 
          AND X.DATA_TYPE IN ('CHAR','VARCHAR2','VARCHAR') 
    ORDER BY X.TABLE_NAME,COLUMN_ID;
 
 
BEGIN
 
	select count(*)
    into V_TEP_TABLE_COUNT
    from user_tables
   where table_name = UPPER('tmp_keyword_info');
 
	-- 创建表tmp用于存放查询结果
	V_SQL_CREATE_TMP_TABLE := 'create table tmp_keyword_info (
															table_and_col VARCHAR(64),
															count_sql varchar(200)
													)';
	 
	V_SQL_TRUNCATE_TMP_TABLE := 'TRUNCATE TABLE tmp_keyword_info';
	
	IF V_TEP_TABLE_COUNT < 1 THEN 
		BEGIN
			EXECUTE IMMEDIATE V_SQL_CREATE_TMP_TABLE;	
		END;
	END IF;
	
	EXECUTE IMMEDIATE V_SQL_TRUNCATE_TMP_TABLE;
  FOR CV_SQL IN CUR_SQLS LOOP
    V_SQL := CV_SQL.SQL_STR; 
    BEGIN
      EXECUTE IMMEDIATE V_SQL INTO V_TB_COL, V_CNT;
			--获取当前查询表名
			V_CURTABLE := SUBSTR(V_TB_COL,1,INSTR(V_TB_COL,'.',1,1) - 1);
      IF V_CNT > 0 THEN
				
				CASE WHEN V_LASTTABLE != 'null' AND V_LASTTABLE != V_CURTABLE THEN
					--如果当前查询表与上次查询表非同一张表,则
					--插入上张匹配表的总匹配记录数
					EXECUTE IMMEDIATE 'INSERT INTO tmp_keyword_info VALUES(''表【'||V_LASTTABLE||'】总匹配记录数'',' || V_COUNT_OF_TABLE|| ')';
					--改变最后一次查询匹配表的表名
					V_LASTTABLE := SUBSTR(V_TB_COL,1,INSTR(V_TB_COL,'.',1,1) - 1);
					--归零表总匹配记录数
					V_COUNT_OF_TABLE := V_CNT;
				ELSE
					IF V_LASTTABLE = 'null' THEN
						--若当前为第一次查询匹配记录,则更新最后一次查询表名
						V_LASTTABLE := V_CURTABLE;
						V_COUNT_OF_TABLE := 0;
						DBMS_OUTPUT.PUT_LINE('V_COUNT_OF_TABLE 初始化:' || V_COUNT_OF_TABLE);
					END IF;	
					--更新表总匹配记录数
					V_COUNT_OF_TABLE := V_COUNT_OF_TABLE+V_CNT;
					DBMS_OUTPUT.PUT_LINE('V_TB_COL:' || V_TB_COL || ', V_CNT' || V_CNT);
					DBMS_OUTPUT.PUT_LINE('V_COUNT_OF_TABLE:' || V_COUNT_OF_TABLE);
				END CASE;	
				
				--统计总的匹配记录数
				V_TOTAL := V_TOTAL+V_CNT;
				--插入新的匹配记录
				EXECUTE IMMEDIATE 'INSERT INTO tmp_keyword_info VALUES('''|| V_TB_COL || ''',replace(''' || replace(V_SQL, chr(39), chr(34)) || ''',chr(34), chr(39)))';
				
      END IF;
    EXCEPTION WHEN OTHERS THEN
			DBMS_OUTPUT.PUT_LINE('sqlcode='||sqlcode);
			DBMS_OUTPUT.PUT_LINE('sqlerrm='||sqlerrm);
    END;
  END LOOP;
	
	--插入最后一张表的匹配记录
	EXECUTE IMMEDIATE 'INSERT INTO tmp_keyword_info VALUES(''表【'||V_LASTTABLE||'】总匹配记录数'',' || V_COUNT_OF_TABLE|| ')';
END PRODUCE_QUERY_KEY_WORD_RECORD;
/

 

标签:COUNT,存储,匹配,记录,全库,SQL,Oracle,TABLE,COL
来源: https://blog.csdn.net/yujiang0/article/details/96999018