oracle-學習筆記-5

quguiliang 13年前發布 | 4K 次閱讀 Hotmail CGIProxy

16.Oracle 小問題

Oracle Package有哪些作用呢?

簡化應用設計、提高應用性能、實現信息隱藏、子程序重載。
 
ORACLE中的function   、package、package   bodies、procedure的有什么區別和相同的地方?

function有返回值,有參數;procedure無返回值,有參數;package、package   body是同時存在的,就像.h和.cpp文件,如果要外部調用的,就在package里聲明一下,包內調用的,只要在body里寫就行了。package可包括function,procedure


問題一:以前在sqlserver中,我直接寫個存儲過程就可以調用。但是在oracle中,我看好多資料上說要想調用存儲過程必須把存儲過程放進包中才能調用?是否是這樣? 
  
  不是,過程也可以單獨寫,單獨調用 
  
  問題二:packages   與package   bodies有什么區別? 
  
  packages中只有各個方法的定義,bodies中涉及具體的實現 
  
  問題三:我在存儲過程就是procedures中寫了個存儲過程,再寫個包名包含進去嗎?還是可以直接在包中寫包名:再把想寫的存儲過程直接寫進包中就行啦呢? 
  
  不用 
  
  問題四:寫進包,要寫進哪個?packages   ?還是package   bodies 
  
  這兩個是一體的,必須同時存在 
 
package   body和package都需要手工去寫。 
  需要先創建package(也就是包的定義),再創建body。增加包中的過程或者修改包中過程的輸入參數個數等也是要先改package再改body。


17.Oracle程序包 簡單使用

程序包是對相關過程、函數、變量、游標和異常等對象的封裝
程序包由規范和主體兩部分組成
(1)    包規范 (package):
包規范部分聲明包內變量,常量,游標,子程序和異常錯誤處理等元素,這些元素為包的公有元素。語法如下:
CREATE [OR REPLACE]
PACKAGE
package_name IS|AS
[Public item declarations]
[Subprogram specification]
END [package_name];
       

(2)    包主體(package body):

包主體是包規范部分的具體實現,它定義了包定義部分所有聲明的游標和子程序等,在包主體中還可以聲明包的私有元素。它的語法形式如下:
CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS
[Private item declarations]
[Subprogram bodies]
[BEGIN
Initialization]
END [package_name];

創建包
例1(包含過程和函數):
包規范:
create or replace package find_emp
as
procedure find_emp_proc(mes varchar2);
function find_emp_fun(mes varchar2)return varchar2;
end find_emp;
    

      包主體:

       
create or replace package body find_emp
as
procedure find_emp_proc(mes varchar2)
as
begin
dbms_output.put_line(mes);
end find_emp_proc;

function find_emp_fun(mes varchar2)return varchar2
as
begin
  return '你好:'||mes;
end find_emp_fun;
end find_emp;

      在SQL:>提示符下調用包中的過程和函數。
(1)    調用過程
        execute find_emp.find_emp_proc('fuxiange');
(2)    調用函數
   select find_emp.find_emp_fun('fuxiange') from dual;
 
 


17.查看當前用戶下指定表大小

col segment_name format a10

select ts.* from
(select segment_name,sum(bytes)/1024/1024 as "SIZE(M)"
from user_extents group by segment_name) ts
where ts.segment_name = '&TABLE_NAME';


18. Oracle系統視圖

---dba視圖

  select * from dba_data_files   --指定表空間的數據文件及所在的路徑
  select * from dba_free_space   --指定表空間的剩余空間
  select * from dba_users        --找出當前數據庫實例中的所有用戶
  select * from dba_segments     --找出當前數據庫實例中的所有對象的物理信息,如:所占空間、pctincrease等
  select * from dba_tab_columns  --指定所有表對應的列名
  select * from dba_col_comments --指定所有列的注釋信息
  select * from dba_tablespaces  --列出所有的表空間及相關信息
  select * from dba_tab_partitions --所有表分區的信息
  select * from dba_ind_columns  --顯示所有的被索引的列
  select * from dba_indexes      --顯示所有的索引信息
  select * from dba_jobs        --顯示所有的job信息
  select * from dba_jobs_running --顯示正在運行的job信息

---v$視圖

  select * from v$session        --顯示當前所有的session信息
  
    v$lock視圖
  反映內容:該視圖展示當前保持的鎖信息;
  名稱                                                類型                                      說明部分
  -----------------------------------------  ----------------------------    ********************************
  ADDR                                               RAW(4)                      //鎖狀態對象地址
  KADDR                                              RAW(4)                      //鎖地址
  SID                                                NUMBER                      //保持鎖的會話的會話標識符
  TYPE                                               VARCHAR2(2)                 //鎖類型 TM:dml排隊TX:事務排隊UL:用戶提供
  ID1                                                NUMBER                      //鎖標示1
  ID2                                                NUMBER                      //鎖標示2
  LMODE                                              NUMBER                      //會話保持的鎖的模式 0,1,2,3,4,5,6
  REQUEST                                            NUMBER                      //進程請求鎖定時所處的模式
  CTIME                                              NUMBER                      //當前的鎖模式所消耗的時間
  BLOCK                                              NUMBER                      //阻塞其他鎖

  0,1,2,3,4,5,6解釋:0代表無,1代表空(null),2代表行(ss),3代表行(sx),4共享S,5S/行X(SSX),6獨占;
  通過這個視圖你能初步了解鎖的模式,從而判斷鎖會出現的地方;

  2. v$PROCESS視圖
  放映內容:包含有關當前活動進程的信息;
  SQL> desc v$process
  名稱                                               類型                                     說明部分
  -----------------------------------------  ----------------------------      ********************************
  ADDR                                               RAW(4)                       //進程對象狀態地址
  PID                                                NUMBER                       //oracle進程標識符,類似于序號
  SPID                                               VARCHAR2(12)                 //操作系統進程標識符,可以用來和操作系統進程聯系
  USERNAME                                           VARCHAR2(15)                 //操作系統進程用戶名
  SERIAL#                                            NUMBER                       //進程序列號
  TERMINAL                                           VARCHAR2(16)                 //操作系統終端標示符
  PROGRAM                                            VARCHAR2(64)                 //進程中的程序
  TRACEID                                            VARCHAR2(255)                //跟蹤文件標識符
  BACKGROUND                                         VARCHAR2(1)                  //1表示后臺進程,null表示其它
  LATCHWAIT                                          VARCHAR2(8)                  //進程正在等待鎖的地址;如果該值為n/a,則鎖地址為null
  LATCHSPIN                                          VARCHAR2(8)                  //進程正在輪循的鎖的地址,如果該職位n/a,則為地址nill
  PGA_USED_MEM                                       NUMBER                       //當前正在使用的pga內存
  PGA_ALLOC_MEM                                      NUMBER                       //當前已經分配的pga內存
  PGA_FREEABLE_MEM                                   NUMBER                       //可以釋放的已分配的pga內存
  PGA_MAX_MEM                                        NUMBER                       //曾經需要的最大的最大pga內存

  這個視圖分很有用,可以和操做系統聯系,這樣用來診斷跟蹤頂級系統資源使用很有益處。這里就可以有個案例,經常用到的,通過消耗資源做大的系統進程號的到執行的sql語句,需要結合v$session視圖一起來完成;

  3.v$session
  反映內容:列出連接到實例的會話,這個視圖有非常多的信息字段也比較多。
  SQL> desc v$session
  名稱                                               類型
  ----------------------------------------- ------------
  SADDR                                          RAW(4)                    session地址
  SID                                            NUMBER                    session標識符
  SERIAL#                                        NUMBER                    session會話序列號
  AUDSID                                         NUMBER                    審計的會話id
  PADDR                                          RAW(4)                    擁有該會話的oracle進程號和v$process聯系
  USER#                                          NUMBER                    oracle用戶
  USERNAME                                       VARCHAR2(30)              oracle用戶名
  COMMAND                                        NUMBER                    執行的命令
  OWNERID                                        NUMBER                    會話的所有者
  TADDR                                          VARCHAR2(8)               事務地址
  LOCKWAIT                                       VARCHAR2(8)               鎖等待地址,null if none
  STATUS                                         VARCHAR2(8)               會話的狀態:active,inactive,killed,cached,sniped
  SERVER                                         VARCHAR2(9)               服務的類型,共享還是專用服務器
  SCHEMA#                                        NUMBER                    用戶標示模式
  SCHEMANAME                                     VARCHAR2(30)              用戶模式名稱
  OSUSER                                         VARCHAR2(30)              客戶端操作系統名稱
  PROCESS                                        VARCHAR2(12)              操作系統客戶端進程號
  MACHINE                                        VARCHAR2(64)              操作系統機器名稱
  TERMINAL                                       VARCHAR2(16)              操作系統終端名
  PROGRAM                                        VARCHAR2(64)              操作系統程序名
  TYPE                                           VARCHAR2(10)              session種類
  SQL_ADDRESS                                    RAW(4)                    當前回話識別目前執行的sql語句的表示地址
  SQL_HASH_VALUE                                 NUMBER                    和sql_address一起唯一標示一條執行的sql語句
  SQL_ID                                         VARCHAR2(13)              目前被執行的sql語句的標識符
  SQL_CHILD_NUMBER                               NUMBER                    目前被執行的sql語句的子句數量
  PREV_SQL_ADDR                                  RAW(4)                    與sql_hash_value一起標示上一條被執行的sql語句
  PREV_HASH_VALUE                                NUMBER                    與PREV_SQL_ADDR 一起表示上一條被執行的sql語句
  PREV_SQL_ID                                    VARCHAR2(13)              前一條被執行的sql語句
  PREV_CHILD_NUMBER                              NUMBER                    上一條被執行的sql的子句數量
  MODULE                                         VARCHAR2(48)              這個沒太懂,oracle文檔上面的解釋比較清楚
  MODULE_HASH                                    NUMBER                    這是針對上面一個字段的hash value
  ACTION                                         VARCHAR2(32)              當前 正在執行被DBMS_APPLICATION_INFO.SET_ACTION procedure調用名稱
  ACTION_HASH                                    NUMBER                    針對上一字段name的hash value
  CLIENT_INFO                                    VARCHAR2(64)              由APPLICATION_INFO.SET_ACTION procedure設定的過程名
  FIXED_TABLE_SEQUENCE                           NUMBER                    oracle文檔有著詳細的解釋session活動增長記錄,最好再去看oracle文檔
  ROW_WAIT_OBJ#                                  NUMBER                    對象id,對象是table包含行源數據在OW_WAIT_ROW#中的id標識符
  ROW_WAIT_FILE#                                 NUMBER                    標示數據文件,等待在OW_WAIT_ROW#中的row,這些行包含在這些數據文件中
  ROW_WAIT_BLOCK#                                NUMBER                    表示數據塊,這些數據塊中行源等待在OW_WAIT_ROW#中
  ROW_WAIT_ROW#                                  NUMBER                    目前被鎖定的行
  LOGON_TIME                                     DATE                      time of logon
  LAST_CALL_ET                                   NUMBER      當前session為active時 記錄的是session是session編程active狀態來的運行時間,相反則為inactive的時間
  PDML_ENABLED                                   VARCHAR2(3)               已經被PDML_STATUS字段所取代
  FAILOVER_TYPE                                  VARCHAR2(13)

   這是oracle文檔對以上這個字段的解釋:
  Indicates whether and to what extent transparent application failover
  (TAF) is enabled for the session:
  ■ NONE - Failover is disabled for this session
  ■ SESSION - Client is able to fail over its session following a disconnect
  ■ SELECT - Client is able to fail over queries in progress as well
  See Also:
  ■ Oracle Database Concepts for more information on TAF
  ■ Oracle Database Net Services Administrator's Guide for information on
  configuring TAF
  FAILOVER_METHOD                 VARCHAR2(10)
  oracle文檔的解釋:
  Indicates the transparent application failover method for the session:
  ■ NONE - Failover is disabled for this session
  ■ BASIC - Client itself reconnects following a disconnect
  ■ PRECONNECT - Backup instance can support all connections from
  every instance for which it is backed up
  FAILED_OVER                          VARCHAR2(3)         //判定是否session已經處于失敗狀態,yes或者no
  RESOURCE_CONSUMER_GROUP                   VARCHAR2(32)          當前session用戶的源數據組
  PDML_STATUS                        VARCHAR2(8)
  oracle的文檔解釋:
  If ENABLED, the session is in a PARALLEL DML enabled mode. If
  DISABLED, PARALLEL DML enabled mode is not supported for the
  session. If FORCED, the session has been altered to force PARALLEL DML.
  PDDL_STATUS                        VARCHAR2(8)
  oracle文檔解釋:
  If ENABLED, the session is in a PARALLEL DDL enabled mode. If
  DISABLED, PARALLEL DDL enabled mode is not supported for the
  session. If FORCED, the session has been altered to force PARALLEL DDL
  PQ_STATUS                       VARCHAR2(8)
  oracle文檔解釋:
  If ENABLED, the session is in a PARALLEL QUERY enabled mode. If
  DISABLED, PARALLEL QUERY enabled mode is not supported for the
  session. If FORCED, the session has been altered to force PARALLEL
  QUERY.
  CURRENT_QUEUE_DURATION              NUMBER         if 1則session已經在隊列中,if 0 則還未形成排隊
  CLIENT_IDENTIFIER                  VARCHAR2(64)       客戶端session標識符
  BLOCKING_SESSION_STATUS               VARCHAR2(11)
  oracle文檔資料注解:
  Blocking session status:
  ■ VALID
  ■ NO HOLDER
  ■ GLOBAL
  ■ NOT IN WAIT
  ■ UNKNOWN
  BLOCKING_INSTANCE                NUMBER          模塊化的實例標識符
  BLOCKING_SESSION                 NUMBER          模塊化的session標識符
  SEQ#                             NUMBER          不唯一的標示每個等待的序列號
  EVENT#                           NUMBER          事件數量
  EVENT                            VARCHAR2(64)    oracle的session正在等待的數據或者事件
  P1TEXT                           VARCHAR2(64)    首個附加參數的描述
  P1                               NUMBER          首個附加參數
  P1RAW                            RAW(4)          首個附加參數和前一個區別我還不是很懂
  P2TEXT                           VARCHAR2(64)    第二個附加參數的描述
  P2                               NUMBER          第二個附加參數
  P2RAW                            RAW(4)          第二個附加參數
  P3TEXT                           VARCHAR2(64)    第三個附加參數的描述
  P3                               NUMBER          第三個附加參數
  P3RAW                            RAW(4)          第三個附加參數
  WAIT_CLASS_ID                    NUMBER          標記等待事件種類
  WAIT_CLASS#                      NUMBER          等待事件的種類
  WAIT_CLASS                       VARCHAR2(64)    等待事件的名稱
  WAIT_TIME                        NUMBER          非0代表上一次session上次等待時間,0代表session當前正在等待
  SECONDS_IN_WAIT                  NUMBER

oracle文檔的資料:
  If WAIT_TIME = 0, then SECONDS_IN_WAIT is the seconds spent in the
  current wait condition. If WAIT_TIME > 0, then SECONDS_IN_WAIT is the
  seconds since the start of the last wait, and SECONDS_IN_WAIT - WAIT_
  TIME / 100 is the active seconds since the last wait ended.
 STATE                VARCHAR2(19)
  oracle資料文檔:
  Wait state:
  ■ 0 - WAITING (the session is currently waiting)
  ■ -2 - WAITED UNKNOWN TIME (duration of last wait is unknown)
  ■ -1 - WAITED SHORT TIME (last wait <1/100th of a second)
  ■ >0 - WAITED KNOWN TIME (WAIT_TIME = duration of last wait)
  SERVICE_NAME                   VARCHAR2(64)        session的服務名稱
  SQL_TRACE                      VARCHAR2(8)         標示sql是否能被跟蹤
  SQL_TRACE_WAITS                VARCHAR2(5)         標記是否等待事件被跟蹤
  SQL_TRACE_BINDS                VARCHAR2(5)         標記是否綁定跟蹤可用與否

 本文由用戶 quguiliang 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!