分享
 
 
 

Oracle管理存储过程

王朝oracle·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

Oracle的存储过程被存放在数据库中,在这种情况下,使用传统工具管理它们就变得很困难。但是,如果你知道在哪找到它们那么就可以容易的管理它们。

在管理存储进程中,最重要的DBA视图是:

?DBA_OBJECTS

?DBA_SOURCE

?DBA_ERRORS

在这篇文章中,我们将着重介绍DBA_OBJECTS视图。它存储了关于PACKGE,PACKGE BODY,PROCEDURE, FUNCTION, TRIGGER, JAVA CLASS, JAVA RESOURCE, 和 JAVA DATA以及其他的信息。DBA_OBJECTS中的STATUS指出了对象在上次编译的时候是否出现了错误。它将被设置成‘VALID’或者‘INVALID’。

在数据库中使用这个代码列出所有有错误或者由于被修改需要再编译的对象。

select owner,object_name,object_type from dba_objects where status = 'INVALID';

一个包可能会变得无效,因为它的引用有可能被再编译。你可以利用SQL DDL语句在没有源代码的情况下重新编译一个包:

alter function FOO compile;

alter java source FOO compile;

alter java class FOO compile;

alter procedure FOO compile;

alter package FOO compile;

alter package FOO compile body;

alter trigger FOO compile body;

和每个对象相关的有三个时间戳。CREATED的时间戳是对象首次被创建的时候。时间戳这一栏是在对象上次被说明的时候制定的。LAST_DDL_TIME是DDL语句上次被执行的时间。

你可以写SQL*Plus脚本,它可以帮组你扫描非法的脚本并尝试重新编译它们:

set feedback off

set heading off

set linesize 1000

set pagesize 0

set pause off

set trimspool on

set verify off

spool tmp.sql;

select 'alter '||object_type||' '||owner||'.'||object_name||' compile;'

from dba_objects

where status = 'INVALID'

and object_type in ('FUNCTION','JAVA SOURCE','JAVA CLASS','PROCEDURE','PACKAGE','TRIGGER');

select 'alter package '||owner||'.'||object_name||' compile body;'

from dba_objects

where status = 'INVALID'

and object_type = 'PACKAGE BODY';

spool off;

@tmp

当你运行的时候,这个脚本将会创建第二个脚本,这个脚本叫做Tmp.sql。它发布所有的ALTER命令然后运行这个脚本。

在开发环境里使用“make”或者“ant”,它对比较数据库中的源文件和被修改的列表文件起了很大的作用,然后,将它们再装到数据库中。下面这个简单的脚本将演示如何使用Perl来完成这个过程:

#!/usr/local/bin/perl

# generate a list of file dependencies

# assume the following extensions:

#

fnc - function

#

pkh - package

#

pkb - package body

#

prc - procedure

#

trg - trigger

use DBI;

$dbh = DBI-connect('dbi:Oracle:','scott','tiger') || die $DBI::errstr;

$sth = $dbh-prepare(<<DEPEND);

select timestamp from user_objects

where object_name = ?

and object_type = ?

and timestamp < ?

DEPEND

opendir(DIR,'.') || die $!;

@depends = ();

while ($filename = readdir(DIR))

{

if ($filename =~ /(.*)\.fnc$/)

{

$object_name = uc($1);

$object_type = 'FUNCTION';

}

elsif ($filename =~ /(.*)\.pkh$/)

{

$object_name = uc($1);

$object_type = 'PACKAGE';

}

elsif ($filename =~ /(.*)\.pkb$/)

{

$object_name = uc($1);

$object_type = 'PACKAGE BODY';

}

elsif ($filename =~ /(.*)\.prc$/)

{

$object_name = uc($1);

$object_type = 'PROCEDURE';

}

elsif ($filename =~ /(.*)\.trg$/)

{

$object_name = uc($1);

$object_type = 'TRIGGER';

}

else

{

next;

}

my @stat = stat($filename);

my @time = localtime($stat[9]);

my $timestamp = sprintf '%04d-%02d-%02d:%02d:%02d:%02d',

$time[5]+1900,$time[4]+1,$time[3],$time[2],$time[1],$time[0];

$sth-execute($object_name,$object_type,$timestamp);

while ($row = $sth-fetchrow_hashref)

{

push(@depends,$filename);

}

}

closedir(DIR);

$sth-finish;

$dbh-disconnect;

print join(' ',@depends),"\n";

我们可以注意到这个脚本使用TIMESTAMP来代替LAST_DDL_TIME来分析依存关系。如果脚本试图改变源代码,那么TIMESTAMP将被改变。同时,我们可以注意到TIMESTAMP不是一个DATE栏,但是VARCHAR2(19)栏包含了YYYY-DD-MM:HH24:MI:SS 格式的时间戳。

如果存储过程被创建但是没有错误,那么对象,它的源代码和错误将被存储在数据库中。你可以提出询问来检查错误和一个单独视图中的源代码:

create or replace procedure foo

as

begin

for I in 1..10 loop

null;

end;

/

Warning: Procedure altered with compilation errors.

create or replace view my_user_source_errors as

select name,type,line,0 sequence,text from user_source

union

select name,type,line,sequence,'****'||text from user_errors;

select text from my_user_source_errors

where name = 'FOO' and type = 'PROCEDURE'

order by line,sequence;

TEXT

----------------------------------------------------------------------

procedure foo

as

begin

for i in 1 .. 2 loop

null;

end;

****PLS-00103: Encountered the symbol ";" when expecting one of the following: loop

7 rows selected.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有