熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle 數據對象分析

2013-11-13 15:43:42  來源: Oracle 

  過程和函數
  
  過程和函數都以編譯後的形式存放在數據庫中函數可以沒有參數也可以有多個參數並有一個返回值過程有零個或多個參數沒有返回值函數和過程都可以通過參數列表接收或返回零個或多個值函數和過程的主要區別不在於返回值而在於他們的調用方式過程是作為一個獨立執行語句調用的
  
  pay_involume(invoice_nbrdue_date);
  
  函數以合法的表達式的方式調用
  
  order_volumn:=open_orders(SYSDATE);
  
  創建過程的語法如下
  
  CREATE [ OR REPLACE] PROCEDURE [schema]procedure_name
  [parameter_lister]
  {AS|IS}
  declaration_section
  BEGIN
  executable_section
  [EXCEPTION
  exception_section]
  END [procedure_name]
  
  每個參數的語法如下
  
  paramter_name mode datatype [(:=|DEFAULT) value]
  
  mode有三種形式INOUTINOUT
  
  IN表示在調用過程的時候實際參數的取值被傳遞給該過程形式參數被認為是只讀的當過程結束時控制會返回控制環境實際參數的值不會改變
  
  OUT在調用過程時實際參數的取值都將被忽略在過程內部形式參數只能是被賦值而不能從中讀取數據在過程結束後形式參數的內容將被賦予實際參數
  
  INOUT這種模式是IN和OUT的組合在過程內部實際參數的值會傳遞給形式參數形勢參數的值可讀也可寫過程結束後形勢參數的值將賦予實際參數
  
  創建函數的語法和過程的語法基本相同唯一的區別在於函數有RETUREN子句
  
  CREATE [ OR REPLACE] FINCTION [schema]function_name
  [parameter_list]
  RETURN returning_datatype
  {AS|IS}
  declaration_section
  BEGIN
  executable_section
  [EXCEPTION]
  exception_section
  END [procedure_name]
  
  在執行部分函數必須有喲個或多個return語句
  
  在創建函數中可以調用單行函數和組函數例如
  
  CREATE OR REPLACE FUNCTION my_sin(DegreesIn IN NUMBER)
  RETURN NUMBER
  IS
  pi NUMBER=ACOS();
  RadiansPerDegree NUMBER;
  
  BEGIN
  RadiansPerDegree=pi/;
  RETURN(SIN(DegreesIn*RadiansPerDegree));
  END
  包
  
  包是一種將過程函數和數據結構捆綁在一起的容器包由兩個部分組成外部可視包規范包括函數頭過程頭和外部可視數據結構另一部分是包主體(package body)包主體包含了所有被捆綁的過程和函數的聲明執行異常處理部分
  
  打包的PL/SQL程序和沒有打包的有很大的差異包數據在用戶的整個會話期間都一直存在當用戶獲得包的執行授權時就等於獲得包規范中的所有程序和數據結構的權限但不能只對包中的某一個函數或過程進行授權包可以重載過程和函數在包內可以用同一個名字聲明多個程序在運行時根據參數的數目和數據類型調用正確的程序
  
  創建包必須首先創建包規范創建包規范的語法如下
  
  CREATE [OR REPLACE] PACKAGE package_name
  {AS|IS}
  public_variable_declarations |
  public_type_declarations |
  public_exception_declarations |
  public_cursor_declarations |
  function_declarations |
  procedure_specifications
  END [package_name]
  
  創建包主體使用CREATE PACKAGE BODY語句
  
  CREATE [OR REPLACE] PACKAGE BODY package_name
  {AS|IS}
  private_variable_declarations |
  private_type_declarations |
  private_exception_declarations |
  private_cursor_declarations |
  function_declarations |
  procedure_specifications
  END [package_name]
  
  私有數據結構是那些在包主體內部對被調用程序而言是不可見的
  
  觸發器(Triggers)
  
  觸發器是一種自動執行響應數據庫變化的程序可以設置為在觸發器事件之前或之後觸發或執行能夠觸發觸發器事件的事件包括下面幾種
  
  DML事件
  DDL事件
  數據庫事件
  
  DML事件觸發器可以是語句或行級觸發器DML語句觸發器在觸發語句之前或之後觸發DML行級觸發器在語句影響的行變化之前或之後觸發用戶可以給單一事件和類型定義多個觸發器但沒有任何方法可以增強多觸發器觸發的命令下表列出了用戶可以利用的觸發器事件
  
  事件   觸發器描述
  INSERT  當向表或視圖插入一行時觸發觸發器
  UPDATE  更新表或視圖中的某一行時觸發觸發器
  DELETE  從表或視圖中刪除某一行時觸發觸發器
  CREATE  當使用CREATE語句為數據庫或項目增加一個對象時觸發觸發器
  ALTER  當使用ALTER語句為更改一個數據庫或項目的對象時觸發觸發器
  DROP   當使用DROP語句刪除一個數據庫或項目的對象時觸發觸發器
  START  打開數據庫時觸發觸發器在事件後觸發
  SHUTDOWN 關閉數據庫時觸發事件前觸發
  LOGON  當一個會話建立時觸發事件前觸發
  LOGOFF  當關閉會話時觸發事件前觸發
  SERVER  服務器錯誤發生時觸發觸發器事件後觸發
  
  創建觸發器的語法如下
  
  CREATE [OR REPLACE] TRIGGER trigger_name
  {before|after|instead of} event
  ON {table_or_view_name|DATABASE}
  [FOR EACH ROW[WHEN condition]]
  trigger_body
  
  只有DML觸發器(INSERTUPDATEDELETE)語句可以使用INSTEAD OF觸發器並且只有表的DML觸發器可以是BEFORE或AFTER觸發器
  
  象約束一樣觸發器可以被設置為禁用或啟用來關閉或打開他們的執行體(EXECUTE)將觸發器設置為禁用或啟用使用ALTER TRIGGER語句
  
  ALTER TRIGGER trigger_name ENABLE;
  ALTER TRIGGER trigger_name DISABLE;
  
  要禁用或啟用表的所有觸發器使用ALTER TABLE語句
  
  ALTER TRIGGER table_name DISABLE ALL TRIGGER;
  ALTER TRIGGER table_name ENABLE ALL TRIGGER;
  
  刪除觸發器使用DROP TRIGGER
  
  DROP TRIGGER trigger_name;
  
  數據字典
  
  Oracle數據字典包含了用戶數據庫的元數據帶下劃線的表名稱中帶OBJ$UET$SOURCE$這些表是在執行CREATE DATABASE語句期間由sqlbsq腳本創建的一般情況下用戶很少訪問這些表腳本catalogsql(通常位於$oracle_home/rdbms/admin)在CREATE DATABASE語句之後立即運行創建數據字典視圖
  
  數據字典視圖大致可以分為三類
  
  前綴為USER_的數據字典視圖包含了用戶擁有的對象的信息
  
  前綴為ALL_的數據字典視圖包含了用戶當前可以訪問的全部對象和權限的信息
  
  前綴為DBA_的數據字典視圖包含了數據庫擁有的所有對象和權限的信息
  
  在絕大多數數據字典視圖中都有象DBA_TABLESALL_TABLES和USER_TABLES這樣的視圖家族Oracle中有超過個視圖家族所以要全面介紹這些視圖家族是單調乏味的而且沒有多大的意義在下表中列出了最重要和最常用的視圖家族需要注意的是每個視圖家族都有一個DBA_一個ALL_一個USER_視圖
  
  視圖家族(View Family)  描述
  COL_PRIVS        包含了表的列權限包括授予者被授予者和權限
  EXTENTS         數據范圍信息比如數據文件數據段名(segment_name)和大小
  INDEXES         索引信息比如類型唯一性和被涉及的表
  IND_COLUMNS       索引列信息比如索引上的列的排序方式
  OBJECTS         對象信息比如狀態和DDL time
  ROLE_PRIVS       角色權限比如GRANT和ADMIN選項
  SEGMENTS        表和索引的數據段信息比如tablespace和storage
  SEQUECNCES       序列信息比如序列的cachecycle和ast_number
  SOURCE         除觸發器之外的所有內置過程函數包的源代碼
  SYNONYMS        別名信息比如引用的對象和數據庫鏈接db_link
  SYS_PRIVS        系統權限比如granteeprivilegeadmin選項
  TAB_COLUMNS       表和視圖的列信息包括列的數據類型
  TAB_PRIVS        表權限比如授予者被授予者和權限
  TABLES         表信息比如表空間(tablespace)存儲參數(storage parms)和數據行的數量
  TRIGGERS        觸發器信息比如類型事件觸發體(trigger body)
  USERS          用戶信息比如臨時的和缺省的表空間
  VIEWS          視圖信息包括視圖定義
  
  在Oracle中還有一些不常用的數據字典表但這些表不是真正的字典家族他們都是一些重要的單一的視圖
  
  VIEW NAME       描述
  USER_COL_PRIVS_MADE  用戶授予他人的列權限
  USER_COL_PRIVS_RECD  用戶獲得的列權限
  USER_TAB_PRIVS_MADE  用戶授予他人的表權限
  USER_TAB_PRIVS_RECD  用戶獲得的表權限
  
  其他的字典視圖中主要的是V$視圖之所以這樣叫是因為他們都是以V$或GV$開頭的V$視圖是基於X$虛擬視圖的V$視圖是SYS用戶所擁有的在缺省狀況下只有SYS用戶和擁有DBA系統權限的用戶可以看到所有的視圖沒有DBA權限的用戶可以看到USER_和ALL_視圖但不能看到DBA_視圖與DBA_ALL和USER_視圖中面向數據庫信息相反這些視圖可視的給出了面向實例的信息
  
  在大型系統上化幾周時間手工輸入每一條語句
  
  手工輸入帶用戶名變量的語句然後再輸入每一個用戶名這需要花好幾個小時的時間
  
  寫一條SQL語句生成需要的ALTER USER語句然後執行他這只需要幾分鐘時間
  
  很明顯我們將選擇生成SQL的方法
  
  例
  
  SELECT ALTER USER||username||
  TEMPORARY TABLESPACE temp;
  FROM DBA_USERS
  WHERE username<>SYS
  AND temporary_tablespace<>TEMP;
  
  這個查詢的結果將被脫機處理到一個文件中然後在執行
  
  ALTER USER SYSTEM TEMPORARY TABLESPACE temp;
  ALTER USER OUTLN TEMPORARY TABLESPACE temp;
  ALTER USER DBSNMP TEMPORARY TABLESPACE temp;
  ALTER USER SCOTT TEMPORARY TABLESPACE temp;
  ALTER USER DEMO TEMPORARY TABLESPACE temp;
From:http://tw.wingwit.com/Article/program/Oracle/201311/17206.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.