oracle-學習筆記-5
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) 標記是否綁定跟蹤可用與否