`
123003473
  • 浏览: 1040558 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ORACLE中如何查找特定对象中的文本内容~

 
阅读更多
[c-sharp] view plaincopy
SQL> select dbms_metadata.get_ddl('PROCEDURE','PRO2','SCOTT') text from dual; 
 
TEXT 
---------------------------------------- 
 
  CREATE OR REPLACE PROCEDURE "SCOTT"."P 
RO2" 
is 
begin 
dbms_output.put_line('wangpeng up'); 
end; 
 
 
 
SQL> select dbms_metadata.get_ddl('PROCEDURE','PRO1','SCOTT') text from dual; 
 
TEXT 
---------------------------------------- 
 
  CREATE OR REPLACE PROCEDURE "SCOTT"."P 
RO1" 
is 
begin 
dbms_output.put_line('wanghai up'); 
end; 
 
SQL> select * from( 
  2  SELECT NAME , LINE , 'Create or Replace ' || TEXT as text 
  3    FROM USER_SOURCE 
  4  WHERE TYPE = 'PROCEDURE' 
  5    AND LINE = 1 
  6  UNION 
  7  SELECT NAME, LINE, TEXT as text 
  8    FROM USER_SOURCE 
  9  WHERE TYPE = 'PROCEDURE' 
10    AND LINE > 1 
11  UNION 
12  SELECT NAME, 999999 , '/' as text 
13    FROM USER_SOURCE 
14  WHERE TYPE = 'PROCEDURE' 
15    AND LINE = 1 
16  ORDER BY 1, 2 
17  ) c 
18  where UPPER(c.text) like '%WANGHAI%'; 
 
NAME          LINE TEXT 
---------- ------- ---------------------------------------- 
PRO1             4 dbms_output.put_line('wanghai up'); 
 
SQL> select * from( 
  2  SELECT NAME , LINE , 'Create or Replace ' || TEXT as text 
  3    FROM USER_SOURCE 
  4  WHERE TYPE = 'PROCEDURE' 
  5    AND LINE = 1 
  6  UNION 
  7  SELECT NAME, LINE, TEXT as text 
  8    FROM USER_SOURCE 
  9  WHERE TYPE = 'PROCEDURE' 
10    AND LINE > 1 
11  UNION 
12  SELECT NAME, 999999 , '/' as text 
13    FROM USER_SOURCE 
14  WHERE TYPE = 'PROCEDURE' 
15    AND LINE = 1 
16  ORDER BY 1, 2 
17  ) c 
18  where UPPER(c.text) like '%WANGPENG%'; 
 
NAME          LINE TEXT 
---------- ------- ---------------------------------------- 
PRO2             4 dbms_output.put_line('wangpeng up'); 
 
SQL> select * from( 
  2  SELECT NAME , LINE , 'Create or Replace ' || TEXT as text 
  3    FROM USER_SOURCE 
  4  WHERE TYPE = 'PROCEDURE' 
  5    AND LINE = 1 
  6  UNION 
  7  SELECT NAME, LINE, TEXT as text 
  8    FROM USER_SOURCE 
  9  WHERE TYPE = 'PROCEDURE' 
10    AND LINE > 1 
11  UNION 
12  SELECT NAME, 999999 , '/' as text 
13    FROM USER_SOURCE 
14  WHERE TYPE = 'PROCEDURE' 
15    AND LINE = 1 
16  ORDER BY 1, 2 
17  ) c 
18  where c.text like '%dbms_output.put_line%'; 
 
NAME          LINE TEXT 
---------- ------- ---------------------------------------- 
PRO1             4 dbms_output.put_line('wanghai up'); 
PRO2             4 dbms_output.put_line('wangpeng up'); 

今天在论坛中一个帖子中的回帖里看到这个方法的,以前确实没想过还有这种方法,呵呵,真是各种牛人都有啊。
顺便学习了一下USER_SOURCE视图,以前确实没有用过这个
ALL_SOURCE
ALL_SOURCE describes the text source of the stored objects accessible to the current user.
Related Views
DBA_SOURCE describes the text source of all stored objects in the database.
USER_SOURCE describes the text source of the stored objects owned by the current user. This view does not display the OWNER column.
Column Datatype NULL Description
OWNER VARCHAR2(30) NOT NULL Owner of the object
NAME VARCHAR2(30) NOT NULL Name of the object
TYPE VARCHAR2(12) Type of object: FUNCTION, JAVA SOURCE, PACKAGE, PACKAGE BODY, PROCEDURE, TRIGGER, TYPE, TYPE BODY
LINE NUMBER NOT NULL Line number of this line of source
TEXT VARCHAR2(4000) Text source of the stored object
SQL> select distinct type from user_source;
TYPE
------------------------
PROCEDURE
PACKAGE
PACKAGE BODY
TYPE BODY
TRIGGER
FUNCTION
已选择6行。

可以看出来,如果像在上面这六种类型的对象中查找特定的字符串的话,前面的方法应该还是挺通用的。
SQL> select name,line,text from all_source where owner='SCOTT' and type='PROCEDU
RE';
NAME          LINE TEXT
---------- ------- ----------------------------------------
PRO1             1 procedure pro1
PRO1             2 is
PRO1             3 begin
PRO1             4 dbms_output.put_line('wanghai up');
PRO1             5 end;
PRO2             1 procedure pro2
PRO2             2 is
PRO2             3 begin
PRO2             4 dbms_output.put_line('wangpeng up');
PRO2             5 end;
已选择10行。
对比前面的查询语句中两个地方需要解释一下
select * from(
SELECT NAME , LINE, 'Create or Replace ' || TEXT as text
  FROM USER_SOURCE
WHERE TYPE = 'PROCEDURE'
  AND LINE = 1
UNION
SELECT NAME , LINE, TEXT as text
  FROM USER_SOURCE
WHERE TYPE = 'PROCEDURE'
  AND LINE > 1
UNION
SELECT NAME , 999999, '/' as text
  FROM USER_SOURCE
WHERE TYPE = 'PROCEDURE'
  AND LINE = 1
ORDER BY 1, 2
) c
where UPPER(c.text) like '%WANGHAI%';
可以看到,从USER_SOURCE中直接查询出的第一行只有procedure pro1而已,和我们创建过程的语句相差Create or Replace 。
而且我们一般创建过程的结尾会加一个/,这就是第二处标记红色部分的作用。我们取掉外层的SELECT,看看里面返回的结果就知道了。
[c-sharp] view plaincopy
SQL> SELECT NAME , LINE, 'Create or Replace ' || TEXT as text 
  2    FROM USER_SOURCE 
  3  WHERE TYPE = 'PROCEDURE' 
  4    AND LINE = 1 
  5  UNION 
  6  SELECT NAME , LINE, TEXT as text 
  7    FROM USER_SOURCE 
  8  WHERE TYPE = 'PROCEDURE' 
  9    AND LINE > 1 
10  UNION 
11  SELECT NAME , 999999, '/' as text 
12    FROM USER_SOURCE 
13  WHERE TYPE = 'PROCEDURE' 
14    AND LINE = 1 
15  ORDER BY 1, 2; 
 
NAME          LINE TEXT 
---------- ------- ---------------------------------------- 
PRO1             1 Create or Replace procedure pro1 
PRO1             2 is 
PRO1             3 begin 
PRO1             4 dbms_output.put_line('wanghai up'); 
PRO1             5 end; 
PRO1        999999 / 
PRO2             1 Create or Replace procedure pro2 
PRO2             2 is 
PRO2             3 begin 
PRO2             4 dbms_output.put_line('wangpeng up'); 
PRO2             5 end; 
 
NAME          LINE TEXT 
---------- ------- ---------------------------------------- 
PRO2        999999 / 
 
已选择12行。 

至于那个999999,你随便写什么都可以,只是个标记而已。

===============================================================================
一个朋友提供了种简便点的写法
[c-sharp] view plaincopy
SQL> select distinct name from user_source 
  2  where type='PROCEDURE' 
  3  and lower(text) like '%wanghai%' 
  4  ; 
 
NAME 
---------- 
PRO1 
 
SQL> select distinct name from user_source 
  2  where type='PROCEDURE' 
  3  and lower(text) like '%wangpeng%'; 
 
NAME 
---------- 
PRO2 


不过还有一个没有解决的问题,那就是如果需要查找的内容被分行输入的话,怎么办?
[c-sharp] view plaincopy
SQL> create procedure pro3 
  2  is 
  3  begin 
  4  dbms_output.put_line('wang 
  5  hai 
  6  up'); 
  7  end; 
  8  / 
 
过程已创建。 
 
SQL> select distinct name from user_source 
  2  where type='PROCEDURE' 
  3    and lower(text) like '%wang%hai%';  --这里在wang和hai之间加了%也不行 
 
NAME 
---------- 
PRO1 

【转载】http://blog.csdn.net/wh62592855/article/details/4866178
分享到:
评论

相关推荐

    toad for oracle 11

    用户甚至可以在执行过程中改变变量的内容。调试工作能够与正常的程序执行同步进行,应用的执行不受影响。用户也不必在代码中自行编写错误捕捉逻辑,以识别和修改错误。 DBA Module DBA 模块实现了日常数据库管理...

    oracle实验报告

    2、 定义一个为修改职工表(emp)中某职工工资的存储过程子程序,职工名作为形参,若该职工名在职工表中查找不到,就在屏幕上提示“查无此人”然后结束子程序的执行;否则若工种为MANAGER的,则工资加$1000;工种为...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    她是Oracle ACE,也是OakTable(Oracle社区中著名的“Oracle科学家”的非正式组织)的成员,经常在技术会议上演讲。她的著作还包括 Expert Oracle Practices和Beginning Oracle SQL,博客主页是karenmorton....

    最全的oracle常用命令大全.txt

    可以使用DEFINE命令设置系统变量EDITOR来改变文本编辑器的类型,在login.sql文件中定义如下一行 DEFINE_EDITOR=vi f、运行命令文件 SQL>START test SQL>@test 常用SQL*Plus语句 a、表的创建、修改、删除 创建表的...

    Oracle9i的init.ora参数中文说明

    值范围: Oracle8i National Language Support Guide 中指定的任何有效的10 字节字符串。 默认值: 从 NLS_TERRITORY 中获得 nls_date_language: 说明: 指定拼写日期名, 月名和日期缩写词 (AM, PM, AD, BC) 的语言。...

    oracle数据库经典题目

    14. 使用什么命令可以清除表中所有的内容? ( D ) A.INSERT B.UPDATE C. DELETE D.TRUNCATE 15.关于模式的描述下列哪一项不正确?( C ) A.表或索引等模式对象一定属于某一个模式 B.在Oracle数据库中,模式与...

    ORACLE 常用手册导入导出

    3. 复制 oracle目录中的oradata\oradb的子目录中的所有文件 到备份的目录中 冷恢复 1.将数据文件还原回所在位置 ,然后启动数据库 2.starup 进行热备份必须处于“归档日志模式下” 1.启动sqlplus ,并以...

    PL_sql8.0.1,软件加破解注册机,还有安装说明。

    使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览数据、在对象源中进行文本查找、拖放对象名到编辑器等。此外,该对象...

    PLSQL Developer 10.0.4.1708〖附中文补丁和注册机〗

    使用这些工具,您可以重新编译全部不合法对象、查找数据库源中文本、导入或导出表格、生成测试数据、导出文本文件、监控dbms_alert和dbms_pipe事件、浏览会话信息等。  授权——大多数开发环境中,您不希望所有...

    PLSQL Developer 7.1.5

    使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览数据、在对象源中进行文本查找、拖放对象名到编辑器等。  此外,该...

    PLSQL Developer 10.0.5.1710〖附中文补丁和注册机〗

    使用这些工具,您可以重新编译全部不合法对象、查找数据库源中文本、导入或导出表格、生成测试数据、导出文本文件、监控dbms_alert和dbms_pipe事件、浏览会话信息等。  授权——大多数开发环境中,您不希望所有...

    pl/sql developer 9 + 注册机

    使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览数据、在对象源中进行文本查找、拖放对象名到编辑器等。 此外,该对象...

    PLSQL Developer(免安装、汉化版,很好用的) 8.0.3.1510.rar

    使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览数据、在对象源中进行文本查找、拖放对象名到编辑器等。  此外,该...

    PL/SQL Developer

    使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览数据、在对象源中进行文本查找、拖放对象名到编辑器等。  此外,该...

    PL/SQL Developer v8.0.zip

    使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览数据、在对象源中进行文本查找、拖放对象名到编辑器等。 此外,该对象...

    Skyline_Terraexplorer_Pro5系统操作手册(中文)word版本

    – 支持交互式绘图工具,用于在3D 地形模型中创建 2D\3D对象,符号以及专题图层、用户自定义对象、建筑物、文本、位图和动画属性 – 在线或离线导入\输出标准GIS 数据图层 – 通过标准COM接口与外部的本地和WEB应用...

    Oraclet中的触发器

    它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。 触发器组成: 触发事件:即在何种情况下触发TRIGGER; 例如:INSERT, UPDATE, DELETE。 触发时间:即该TRIGGER 是在触发事件发生之前...

    PL/SQL Developer 6.05注册版-1

    使用这些工具,您可以重新编译全部不合法对象、查找数据库源中文本、导入或导出表格、生成测试数据、导出文本文件、监控dbms_alert和dbms_pipe事件、浏览会话信息等。 <br>授权——大多数开发环境中,您不希望...

    PL/SQL Developer 7.1.5 注册版

    使用这些工具,您可以重新编译全部不合法对象、查找数据库源中文本、导入或导出表格、生成测试数据、导出文本文件、监控dbms_alert和dbms_pipe事件、浏览会话信息等。 <br>授权——大多数开发环境中,您不希望...

Global site tag (gtag.js) - Google Analytics