oracle-学习笔记-5

14年前

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)         标记是否绑定跟踪可用与否