国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

Oracle管理存儲過程

2024-08-29 13:38:32
字體:
供稿:網(wǎng)友

  Oracle的存儲過程被存放在數(shù)據(jù)庫中,在這種情況下,使用傳統(tǒng)工具治理它們就變得很困難。但是,假如你知道在哪找到它們那么就可以輕易的治理它們。
  
  在治理存儲進(jìn)程中,最重要的DBA視圖是:
  
  ·DBA_OBJECTS
  
  ·DBA_SOURCE
  
  ·DBA_ERRORS
  
  在這篇文章中,我們將著重介紹DBA_OBJECTS視圖。它存儲了關(guān)于PACKGE,PACKGE BODY,PROCEDURE, FUNCTION, TRIGGER, java CLASS, JAVA RESOURCE, 和 JAVA DATA以及其他的信息。DBA_OBJECTS中的STATUS指出了對象在上次編譯的時候是否出現(xiàn)了錯誤。它將被設(shè)置成‘VALID’或者‘INVALID’。
  
  在數(shù)據(jù)庫中使用這個代碼列出所有有錯誤或者由于被修改需要再編譯的對象。
  
  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;
  
  和每個對象相關(guān)的有三個時間戳。CREATED的時間戳是對象首次被創(chuàng)建的時候。時間戳這一欄是在對象上次被說明的時候制定的。LAST_DDL_TIME是DDL語句上次被執(zhí)行的時間。
  
  你可以寫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
  
  當(dāng)你運行的時候,這個腳本將會創(chuàng)建第二個腳本,這個腳本叫做Tmp.sql。它發(fā)布所有的ALTER命令然后運行這個腳本。
  
  在開發(fā)環(huán)境里使用“make”或者“ant”,它對比較數(shù)據(jù)庫中的源文件和被修改的列表文件起了很大的作用,然后,將它們再裝到數(shù)據(jù)庫中。下面這個簡單的腳本將演示如何使用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來分析依存關(guān)系。
假如腳本試圖改變源代碼,那么TIMESTAMP將被改變。同時,我們可以注重到TIMESTAMP不是一個DATE欄,但是VARCHAR2(19)欄包含了YYYY-DD-MM:HH24:MI:SS 格式的時間戳。
  
  假如存儲過程被創(chuàng)建但是沒有錯誤,那么對象,它的源代碼和錯誤將被存儲在數(shù)據(jù)庫中。你可以提出詢問來檢查錯誤和一個單獨視圖中的源代碼:
  
  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.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 都匀市| 清徐县| 申扎县| 陇川县| 棋牌| 林周县| 马关县| 和平区| 微山县| 社会| 叙永县| 乐业县| 双峰县| 兰西县| 镶黄旗| 黔西县| 兴安县| 兖州市| 星子县| 山西省| 冷水江市| 连云港市| 科技| 天镇县| 盖州市| 甘德县| 板桥市| 陵水| 滦南县| 保德县| 普陀区| 津南区| 沾益县| 梁河县| 桃江县| 时尚| 安新县| 灯塔市| 庄河市| 台前县| 信宜市|