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

今天在论坛中一个帖子中的回帖里看到这个方法的,以前确实没想过还有这种方法,呵呵,真是各种牛人都有啊。

顺便学习了一下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.

ColumnDatatypeNULLDescription
OWNERVARCHAR2(30)NOT NULLOwner of the object
NAMEVARCHAR2(30)NOT NULLName of the object
TYPEVARCHAR2(12) Type of object: FUNCTION, JAVA SOURCE, PACKAGE, PACKAGE BODY, PROCEDURE, TRIGGER, TYPE, TYPE BODY
LINENUMBERNOT NULLLine number of this line of source
TEXTVARCHAR2(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,看看里面返回的结果就知道了。

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

 

===============================================================================

一个朋友提供了种简便点的写法

 

不过还有一个没有解决的问题,那就是如果需要查找的内容被分行输入的话,怎么办?

 

呵呵,大家可以回复讨论讨论~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值