网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.Oracle数据导入导出imp/exp.
.连接到oracle数据库(一).
.DBA必须熟悉的、最有用的DBA视图.
.Oracle Designer对Oracle的连接.
.Oracle并行服务器(OPS)12问.
.Oracle中屏蔽英文提示信息的两个.
.Oracle 数据库中常用操作的具体说.
.Oracle非法数据库对象引起的错误.
.Oracle Fast-Start Fault Recove.
.Oracle数据库的启动关闭的几种方.
.Oracle优化的五个方面.
.Oracle数据库与用户角色权限相关.
.Oracle:PL/SQL 中如何使用Array.
.Oracle常用技巧和脚本技术应用.
.在sqlplus环境中对自己的动作和结.
.Oracle10gR2安裝.
.详细讲解大型数据库的设计原则与.
.实例讲解Oracle的快速删除和快速.
.Oracle中null的使用详解.
.解析:用UNIX的kill命令终止Orac.

Oracle管理存储过程

发表日期:2008-2-9



  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.
上一篇:Oracle9i里指针共享的增强 人气:457
下一篇:一个自动备份数据文件脚本 人气:585
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐