打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Oracle管理存储过程
userphoto

2006.12.17

关注

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.


本文作者:Scott Stephens 为 Oracle工作了13年,他致力于技术支持,电子商务市场和软件开发的工作。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
听说过代码洁癖,Bug洁癖怎么解?
oracle flashback闪回功能之--恢复存储过程篇
linux下的source命令
Linux┊一个好用的AUR工具yaourt | 简单.生活
HOWTO Specify the Header File Include Path for use with MinGW Compilers | MinGW
Joint Compilation of Scala and Java Sources
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服