Oracle中通过某个值查询属于哪张表,哪个字段
通过输入某个值查询数据库中哪个表,哪个字段包含。 1.创建存储过程
CREATE OR REPLACE PROCEDURE PROC_FindValueInDB (str in VARCHAR,results out sys_refcursor)AUTHID CURRENT_USER
AS
--执行SQL语句
sqlStr VARCHAR(4000);
--判断表是否存在
tableExist number;
BEGIN
--查询表是否存在
select count(1) into tableExist from user_tables where table_name=upper(temp_Table);
if tableExist = 0 then
--创建表
sqlStr := CREATE TABLE temp_Table (
tablename VARCHAR(64),
columnname VARCHAR(64)
);
execute immediate sqlStr;
else
--清空表数据
sqlStr := delete temp_Table;
execute immediate sqlStr;
end if;
--定义游标
declare
CURSOR tables is
SELECT o.table_name, c.column_name
FROM user_tab_columns c
INNER JOIN user_tables o ON c.table_name = o.table_name
WHERE c.data_type in (NVARCHAR2,CHAR,VARCHAR2)
AND o.TABLESPACE_NAME in(ME2_DATA)
ORDER BY o.table_name, c.column_name;
--定义当前行
table_row tables%rowtype;
BEGIN
--打开游标
OPEN tables;
--遍历游标
LOOP
--当没有数据的时候就退出循环
EXIT WHEN tables%NOTFOUND;
--游标赋值给变量
FETCH tables INTO table_row;
sqlStr := insert ;
sqlStr := sqlStr || when (exists(SELECT NULL FROM || table_row.table_name || WHERE RTRIM(LTRIM("|| table_row.column_name ||")) LIKE % || str || %)) ;
sqlStr := sqlStr || then into temp_Table select || table_row.table_name || , || table_row.column_name || from dual ;
execute immediate sqlStr;
--结束循环
END LOOP;
--提交事务
commit;
--关闭游标
CLOSE tables;
END;
--返回结果集
open results for select * from temp_Table;
End PROC_FindValueInDB;
2.执行存储过程
3查看结果
