--创建包声明
create or replace package testPiple
is
procedure hire_emp(p_empno number, p_name varchar2);
end;
--创建包体
create or replace package body testPiple
is
procedure hire_emp(p_empno number, p_name varchar2)
is
begin
select * from dule;
end;
end;
--创建存储过程
create or replace procedure P1
is
v_cnt number;
begin
select count(*) into v_cnt from test;
--调用存储过程
p2;
end;
--创建函数
create or replace function consumer return sys_refcursor
is
src_rows sys_refcursor;
begin
null;
end;
--创建object类型
create or replace type emprec is object
( empno number(10),
ename varchar2(20),
hiredate date
sal number(10,2));
--隐式赋值
emp emprec := emprec(1,'lwl','9783');
--创建数组类型
type emp_list is table of emp%rowtype;
create or replace type emplist as table of emprec;
--管道函数
function manipulator(src_rows sys_refcursor) return emplist pipelined
is
r emprec;
e emp%rowtype;
begin
loop
--fetch src_rows bulk collect into elist limit 100;
fetch src_rows into e;
exit when src_rows%notfound;
pipe row (emprec(1,'lwl','9783'));
end loop;
close src_rows;
return;
end;
--管道化表函数
insert into emp2 select * from table(cast(manipulator(rc) as emplist));
--两个动态类型属性
%type, %rowtype
--表字段类型引用
v_salary emp.sal%type;
--变量类型引用,引用包my_pkg的变量glob_var的类型
var1 my_pkg.glob_var%type;
--表类型引用
emprc emp%rowtype;
select * into emprc from emp where rownum = 1;
insert into emp values emprc;
update emp set row = emprc where rownum = 1;
--查询对象的依赖关系
select name,type,referenced_name,referenced_type
from user_dependencies
where name = 'TESTPIPLE';
--查询对象的状态
select object_name, status
from user_objects
where object_name in ('P1','P2','P3','P4');
--创建一个查看当前会话的性能统计视图,方便查看 重要
create or replace view V$MYSTATS
as
select s.name, m.value
from v$mystat m, v$statname s
where s.STATISTIC# = m.STATISTIC# and name like '%memory%';
grant select on v$mystats to public;
select * from v$mystats where name like '%session%';
AUTOTRACE是一项 SQL*Plus 功能,自动跟踪为 SQL 语句生成一个执行计划并且提供与该语句的处理有关的统计。
SQL*Plus AUTOTRACE 可以用来替代 SQL Trace 使用,AUTOTRACE 的好处是您不必设置跟踪文件的格式,并且它将自动为 SQL 语句显示执行计划。然而,AUTOTRACE 分析和执行语句;而EXPLAIN PLAN仅分析语句。
使用AUTOTRACE不会产生跟踪文件。
一、启用Autotrace功能。
任何以SQL*PLUS连接的session都可以用Autotrace,不过还是要做一些设置的,否则可能报错。
1、报错示例:
SQL :> set autotrace on;
SP2-0613: Unable to verify PLAN_TABLE format or existence
SP2-0611: Error enabling EXPLAIN report
SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled
SP2-0611: Error enabling STATISTICS report
*******************************************************************************
SQL> set autotrace on;
SP2-0613: 无法验证 PLAN_TABLE 格式或实体
SP2-0611: 启用EXPLAIN报告时出现错误
SP2-0618: 无法找到会话标识符。启用检查 PLUSTRACE 角色
SP2-0611: 启用STATISTICS报告时出现错误
该错误的的主要原因是由于当前用户下没有PLAN_TABLE这张表及相应的PLUSTRACE角色权限。
2、解决方法:
A.以SYS用户登录:
oracle>sqlplus ‘/ as sysdba‘;
B.运行utlxplan.sql(rdbms/admin下) 脚本创建 PLAN_TABLE;
SQL>@ D:oracleora81RDBMSADMINutlxplan.sql
C.通过执行 plustrce.sql(ORACLE_HOME/sqlplus/admin/plustrce.sql)脚本创建 plustrace 角色,这将V$ 视图上的选择权限授予该角色,也将 plustrace 角色授予 DBA 角 色,脚本部份内容如下:
drop role plustrace;
create role plustrace;
grant select on v_$sesstat to plustrace;
grant select on v_$statname to plustrace;
grant select on v_$session to plustrace;
grant plustrace to dba with admin option;
D.将 plustrace 角色授予当前用户(无 DBA 角色的用户)。
二、设置Autotrace的命令。
序号 | 命令 | 解释 |
1 | SET AUTOTRACE OFF | 此为默认值,即关闭Autotrace |
2 | SET AUTOTRACE ON | 产生结果集和解释计划并列出统计 |
3 | SET AUTOTRACE ON EXPLAIN | 显示结果集和解释计划不显示统计 |
4 | SETAUTOTRACE TRACEONLY | 显示解释计划和统计,尽管执行该语句但您将看不到结果集 |
5 | SET AUTOTRACE TRACEONLY STATISTICS | 只显示统计 |
Eg:SET AUTOTRACE ON, set timing on, alter session set time_statistics=true;
三、Autotrace执行计划的各列的涵义
序号 | 列名 | 解释 |
1 | ID_PLUS_EXP | 每一步骤的行号 |
2 | PARENT_ID_PLUS_EXP | 每一步的Parent的级别号 |
3 | PLAN_PLUS_EXP | 实际的每步 |
4 | OBJECT_NODE_PLUS_EXP | Dblink或并行查询时才会用到 |
四、AUTOTRACE Statistics常用列解释
序号 | 列名 | 解释 |
1 | db block gets | 从buffer cache中读取的block的数量 |
2 | consistent gets | 从buffer cache中读取的undo数据的block的数量 |
3 | physical reads | 从磁盘读取的block的数量 |
4 | redo size | DML生成的redo的大小 |
5 | sorts (memory) | 在内存执行的排序量 |
7 | sorts (disk) | 在磁盘上执行的排序量 |
sql_trace和tkprof
alter session set sql_trace=true;
alter session set sql_trace=false;
//
create or replace procedure createseesync
is
i number;
cidbase number;
SID number;
EFFECTIVETIME VARCHAR(20);
EXPIRYTIME VARCHAR(20);
NOTIFYADDRESS VARCHAR(1024);
PRODUCTID VARCHAR(30);
RENTSUCCESS VARCHAR(1);
SERVICEID VARCHAR(70);
SERVICELIST VARCHAR(1024);
SPID VARCHAR(30);
SYNCDEVCODE VARCHAR(10);
TRY VARCHAR(1);
UPDATEDESC VARCHAR(300);
UPDATETIME VARCHAR(20);
UPDATETYPE VARCHAR(10);
USERID VARCHAR(50);
USERTYPE VARCHAR(10);
servid VARCHAR(70);
uid VARCHAR(70);
type t_synship_tabletype is table of syncorderrelationship%rowtype
index by binary_integer;
shiptable t_synship_tabletype;
begin
SID := 1;
EFFECTIVETIME := '20100101121212';
EXPIRYTIME := '20131020112233';
NOTIFYADDRESS := '';
PRODUCTID := 'p001';
RENTSUCCESS := '0';
SERVICEID := '2001';
SPID := '200';
SYNCDEVCODE := '555';
TRY := '0';
UPDATEDESC := '1';
UPDATETIME := '20100818000000';
UPDATETYPE := '1';
USERID := '15000000000';
cidbase := 0;
-- for i in 1..3000000
-- loop
-- SID := SID+1;
-- USERID := USERID+1;
-- end loop;
for cidbase in 1..3000 loop
i := 0;
-- SERVICEID := SERVICEID+1;
for i in 1..1000 loop
servid := TO_CHAR(SERVICEID);
uid := TO_CHAR(USERID);
shiptable(i).sid:=sid;
shiptable(i).EFFECTIVETIME:=EFFECTIVETIME;
shiptable(i).EXPIRYTIME:=EXPIRYTIME;
shiptable(i).NOTIFYADDRESS:=NOTIFYADDRESS;
shiptable(i).PRODUCTID:=PRODUCTID;
shiptable(i).RENTSUCCESS:=RENTSUCCESS;
shiptable(i).SERVICEID:=servid;
shiptable(i).SERVICELIST:=SERVICELIST;
shiptable(i).SPID:=SPID;
shiptable(i).SYNCDEVCODE:=SYNCDEVCODE;
shiptable(i).TRY:=TRY;
shiptable(i).UPDATEDESC:=UPDATEDESC;
shiptable(i).UPDATETIME:=UPDATETIME;
shiptable(i).UPDATETYPE:=UPDATETYPE;
shiptable(i).USERID:=uid;
shiptable(i).USERTYPE:=USERTYPE;
-- eiid := TO_CHAR(EIID);
SID := SID+1;
USERID := USERID+1;
end loop;
forall i in 1..shiptable.count
insert into syncorderrelationship(SID,EFFECTIVETIME,EXPIRYTIME,NOTIFYADDRESS,PRODUCTID,RENTSUCCESS,SERVICEID,SERVICELIST,SPID,SYNCDEVCODE,TRY,UPDATEDESC,UPDATETIME,UPDATETYPE,USERID,USERTYPE)
values(shiptable(i).SID,shiptable(i).EFFECTIVETIME,shiptable(i).EXPIRYTIME,shiptable(i).NOTIFYADDRESS,shiptable(i).PRODUCTID,shiptable(i).RENTSUCCESS,shiptable(i).SERVICEID,shiptable(i).SERVICELIST,shiptable(i).SPID,shiptable(i).SYNCDEVCODE,shiptable(i).TRY,shiptable(i).UPDATEDESC,shiptable(i).UPDATETIME,shiptable(i).UPDATETYPE,shiptable(i).USERID,shiptable(i).USERTYPE);
forall i in 1..shiptable.count
insert into extensioninfo(EIID,SID,key,value)values(shiptable(i).SID,shiptable(i).SID,'locationCode','11');
commit;
end loop;
commit;
return;
exception
when others then
rollback;
return;
end createseesync;