博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ORACLE 检索某列包含特定字符串的数据表工具存储过程
阅读量:7016 次
发布时间:2019-06-28

本文共 5674 字,大约阅读时间需要 18 分钟。

使用示例

delete APPS.FIND_RESULT;

set serveroutput on

declare
    v_ret varchar(200);
begin 
   apps.sp_findstring('IP2000', 1, v_ret);
    DBMS_OUTPUT.PUT_LINE('OUT_RETURN = "' || v_ret || '"');
end;

select * from apps.find_result; 

create table apps.find_result(table_name varchar2(255), column_name varchar2(255), data_value varchar2(255), rowversion date);DELETE apps.find_result;select * from apps.find_result order by table_name;DECLARE  IN_DATA VARCHAR2(200);  IN_FLAG NUMBER;  OUT_RETURN VARCHAR2(200);BEGIN  IN_DATA := 'ip2000';  IN_FLAG := 0;  SP_FINDSTRING(    IN_DATA => IN_DATA,    IN_FLAG => IN_FLAG,    OUT_RETURN => OUT_RETURN  );  DBMS_OUTPUT.PUT_LINE('OUT_RETURN = ' || OUT_RETURN);END;

工具存储过程

create or replace PROCEDURE             "APPS"."SP_FINDSTRING" ( in_data IN VARCHAR2 --被检索的字符串  , in_flag IN  NUMBER DEFAULT 0 --0:数字;1:字符串  , out_return OUT VARCHAR2 )IS  errorException exception; --声明异常     errorCode number; --异常编码     errorMsg varchar2(1000); --异常信息     v_flag varchar2(10);  v_owner_name varchar2(128);  v_table_name varchar2(128);  v_cloumn_name varchar2(128);  v_count int;  v_data VARCHAR2(500);  v_sql varchar2(2000);  v_data_type varchar2(100);  v_rows_found int;  --按照如下条件取出游标,其中USERS是表空间,那个地方你可以改  cur_data SYS_REFCURSOR;begin--判断是数字  v_flag := 'true';  v_rows_found := 0;  if ( Lower(in_data) = Upper(in_data) AND in_flag = 0 ) then      v_sql :=' SELECT A.OWNER, A.TABLE_NAME, A.COLUMN_NAME, A.data_type from DBA_TAB_COLUMNS A, DBA_TABLES B WHERE A.TABLE_NAME = B.TABLE_NAME AND B.STATUS = ''VALID'''       || ' AND A.OWNER = B.OWNER AND A.OWNER NOT IN (''SYS'', ''SYSTEM'', ''SYSMAN'', ''APPQOSSYS'', ''APEX_030200'', ''CTXSYS'', ''MDSYS'''       || ' , ''OLAPSYS'', ''ORDSYS'', ''OWBSYS'', ''EXFSYS'', ''WMSYS'', ''DBSNMP'', ''OUTLN'', ''XDB'')'       || ' AND A.data_type = ''NUMBER'' ORDER BY A.OWNER, A.TABLE_NAME, A.COLUMN_NAME';       open cur_data for v_sql;--打开游标     loop        fetch cur_data into v_owner_name, v_table_name, v_cloumn_name, v_data_type;        exit when cur_data%notfound;        --取出游标里的各个变量,拼成动态sql语句        if v_data_type = 'NUMBER' then           v_sql := 'select count(*) from ' || v_owner_name || '.' || v_table_name || ' where ' || v_cloumn_name || ' = ' ||in_data;        end if;        execute immediate v_sql into v_count;        --如果查询出来的条数大于,则将查询中的表名,字段名和输入的内容插入到我建的那个表中        if v_count > 0 then           v_sql := 'insert into APPS.FIND_RESULT values (''' || v_owner_name || '.' || v_table_name ||                       ''',''' || v_cloumn_name || ''',''' || in_data || ''',sysdate)';           execute immediate v_sql;           commit;           v_rows_found := v_rows_found + 1;        end if;     end loop;     close cur_data;   else--不是数字     v_data := Upper(in_data);     v_sql :=' SELECT A.OWNER, A.TABLE_NAME, A.COLUMN_NAME, A.data_type from DBA_TAB_COLUMNS A, DBA_TABLES B WHERE A.TABLE_NAME = B.TABLE_NAME AND B.STATUS = ''VALID'''       || ' AND A.OWNER = B.OWNER AND A.OWNER NOT IN (''SYS'', ''SYSTEM'', ''SYSMAN'', ''APPQOSSYS'', ''APEX_030200'', ''CTXSYS'', ''MDSYS'''       || ' , ''OLAPSYS'', ''ORDSYS'', ''OWBSYS'', ''EXFSYS'', ''WMSYS'', ''DBSNMP'', ''OUTLN'', ''XDB'')'       || ' AND A.data_type = ''VARCHAR2'' ORDER BY A.OWNER, A.TABLE_NAME, A.COLUMN_NAME';       --dbms_output.put_line(v_sql);     open cur_data for v_sql;          loop        fetch cur_data into v_owner_name, v_table_name, v_cloumn_name, v_data_type;        exit when cur_data%notfound;        --取出游标里的各个变量,拼成动态sql语句,        if v_data_type = 'VARCHAR2' then           v_sql := 'select count(*) from ' || v_owner_name || '.' || v_table_name || ' where Upper("' || v_cloumn_name || '") LIKE ''%' || v_data || '%''';        else           v_sql := 'select count(*) from APPS.FIND_RESULT where 1=2';        end if;        --dbms_output.put_line(v_sql);        execute immediate v_sql into v_count;        --如果查询出来的条数大于,则将查询中的表名,字段名和输入的内容插入到我建的那个表中        if v_count > 0 then           v_sql := 'insert into APPS.FIND_RESULT values (''' || v_owner_name || '.' || v_table_name || ''',''' || v_cloumn_name || ''',''' || in_data || ''',sysdate)';           execute immediate v_sql;           commit;           v_rows_found := v_rows_found + 1;        end if;     end loop;     close cur_data;   end if;   out_return := 'found ' || v_rows_found || ' (rows).' ;      exception  --异常捕捉,不要把有需要的代码放在异常捕捉后面,有异常才会执行异常代码下所有代码,没有异常不会执行     when errorException then       errorCode := SQLCODE;       errorMsg := SUBSTR(SQLERRM, 1, 200);       v_flag := 'false';       out_return := 'flag=' || v_flag || ', errorCode=' || errorCode || ', errorMsg=' || errorMsg;     when others then       errorCode := SQLCODE;       errorMsg := SUBSTR(SQLERRM, 1, 200);       v_flag := 'false';       out_return := 'flag=' || v_flag || ', errorCode=' || errorCode || ', errorMsg=' || errorMsg;   --dbms_output.put_line(out_return);end sp_findstring;

 

分割字符串函数(以管道形式输出):

CREATE OR REPLACE TYPE SPLITSTRING_TYPE IS TABLE OF VARCHAR2 (4000); / CREATE OR REPLACE FUNCTION APPS.FN_SPLITSTRING(-- 使用上面的函数前需要先建立一个类型-- CREATE OR REPLACE TYPE SPLITSTRING_TYPE IS TABLE OF VARCHAR2 (4000);-- Usage: SELECT * FROM TABLE(APPS.FN_SPLITSTRING('1,2,3,4,5'));   p_value in varchar2, --待分割的字符串   p_split varchar2 := ',' --分割标志  )  return SPLITSTRING_TYPE  pipelined is  v_idx       integer;  v_str       varchar2(500);  v_strs_last varchar2(4000) := p_value;begin  loop    v_idx := instr(v_strs_last, p_split);    exit when v_idx = 0;    v_str := substr(v_strs_last, 1, v_idx - 1);    v_strs_last := substr(v_strs_last, v_idx + 1);    pipe row(v_str);  end loop;  pipe row(v_strs_last);  return;end FN_SPLITSTRING;

 

转载于:https://www.cnblogs.com/chriskwok/p/9732176.html

你可能感兴趣的文章
【IntellJ IDEA】idea上 实现了Serializable接口,要自动生成serialVersionUID的方法
查看>>
Dedecms判断当前栏目下是否有子栏目
查看>>
【PIC学习第2例】PIC16F877A LED闪烁
查看>>
SQL2005中时,Diagrams的问题
查看>>
[转]软件架构的一致性
查看>>
拨云见日,任重道远 ——第六届云计算大会感悟
查看>>
CentOS VMware 下SSH配置方法详解
查看>>
PHP错误级别 error_reporting() 函数详解
查看>>
为网卡配置多个IP地址(windows)
查看>>
WIndows 使用VS编译 Lua5
查看>>
转 VB ListView控件各种操作详解
查看>>
MinGW32和64位交叉编译环境的安装和使用
查看>>
什么是“单播”“组播”和“多播”
查看>>
flex---->图表控件
查看>>
分析函数调用关系图(call graph)的几种方法
查看>>
11.0592M晶振与12M晶振
查看>>
A380上11万一张的机票什么享受?来看看
查看>>
LeetCode: 103_Binary Tree Zigzag Level Order Traversal | 二叉树Zigzag层次遍历 | Medium
查看>>
JUnit单元测试中的setUpBeforeClass()、tearDownAfterClass()、setUp()、tearDown()方法小结
查看>>
ubuntu15.10下编译安装wine1.8 rc4
查看>>