select a.uiblockid,a.uilac_id,cast(a.subsum*1.0/b.totalsum as numeric (10, 2) ) BL from
(select sum(uinmsg_lac) subsum,uilac_id,uiblockid from
T_msg_lac group by uilac_id,uiblockid) a,
(select sum(uinmsg_block_all) totalsum,uiblockid from T_msg_lac
group by uiblockid) b
where a.uiblockid=b.uiblockid
清空回收站
PURGE recyclebin;
创建用户
CREATE USER "CEMDB" PROFILE "DEFAULT" IDENTIFIED BY "*******" DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK
GRANT "CONNECT" TO "CEMDB"
alter session set NLS_date_format='YYYY-MM-DD'; 修改数据查询时间格式
create sequence NumSeq increment by 1 start with 1 maxvalue 999; 创建序列
insert into table values(NumSeq.nextval); 表中插入序列
select NumSeq.currval from dual; 查询序列当前值;
drop sequence NumSeq ; 删除序列;
Create or replace type 类型名 as object
(
colum1 varchar(20),
colum2 varchar(30)
) 创建类型
Create table tableObject
(
Colum1 char(10),
Colum2 类型名
) 创建代类型的表
Insert into tableobject values('aaa',类型名('a','b')); 想自定义类型表中添加记录
select s.Colum1,s.Colum2.colum1,s.Colum2.Colum2 from tableObject s 查询自定义类型表记录
create or replace type person as object
(
personName varchar(10),
personSex varchar(2),
PessonBirth date
) not final; 创建可扩展的类型
create or replace Type studentType under person
(
StudentNo int,
StudentScore int
) 此类型继承了 Person类型. 也就是 studentType类型中已经有了 Person类型的三个属性.
create table student of StudentType; 创建具有StudentType的表
类型中不能保存数据.只有在创建此类型的表才可以存储数据.
insert into student values('a','b',to_date(1980-1-1','YYYY-MM-DD'),1001,89)); 向此关系类型的表中添加数据.
select * from student 对具有此类型的表进行查询.
update student a set a.personsex='女' where personname='a'; 更新此类型的表中的数据.
insert into student select studenttype('a','b',to_date(1980-1-1','YYYY-MM-DD'),1001,89)) from student where personName='a'; 创建抽象类型的面向对象表
updata student set studenttype('a','b',to_date(1980-1-1','YYYY-MM-DD'),1001,89)) where provid='10001'; 对表中的整个对象进行更新.
创建代方法的对象类型
create or replace type studenttype as object
(
stuid varchar(10),
stuName varchar(10),
HomAddress Address,
Member funcation getAddress Return Address,
Member procedure setAddress(newAddress Address)
);
create or replace type body studenttype as
Member function getAddress return Address is
begin
Return HomeAddress;
end;
Member procedure setAddress(newAddress Address) is
begin
HomeAddress:=newAddress;
end;
end;
一创建带有可变数组的表
A
---格式 create or replace type 基类型名 as object (字段清单)
--实例
create or replace type MingXiType as object
(
goodsid varchar(15),
InCount int,
ProviderID varchar(10)
)
B.建立嵌套项类型的可变数组
格式:Create or replace 可变数组类型名 as Varray(最大行数) of 可变数组的基类型;
实例: Create Or Replace Type arrMingXiType as varray(100) of MingXiType;
C.创建一个主表
Create table inStockOrder
(
OrderID varchar(15) Not Null Primary Key,
InDate Date,
OperatorId varchar(10),
Mingxi arrMingXiType
);
2.操作可变数组
A.插入数据
Insert into InStockorder
Values('20020807001',To_data(2002-08-07','YYYY-MM-DD'),'002',
aarrMingXiType(MingXiType('S001',100,'100009),
MingXiType('S001',100,'100009)))
b.查询数据
使用普通的select不能显示Varray中的数据.要使用带有游标的PL/SQL块来操纵Varray.
但可以使用Table()函数查询集合列
select * from Table(select t.Mingxt from instockorder t where t.orderid='20020807001')
c.修改数据
实例:把编号为20020807001的入库单的货物编号为S001的入库数量改为200
Update instockorder
set MingXi=arrMingXiType(MingXiType('S001',200,'10009'),MingXiType('T002',400,'10003')) where orderID='200208070001'
注意: 不能更新VArray中的单个元素,必须更新整个的Varray.
创建嵌套表
A 创建嵌套表基类型
格式: Create or replace type 嵌套表基类型名 as object
实例: Create or replace type MingXiType As Object
(
GoodsId varchar(15),
InCount int,
ProviderID varchar(10)
) not final;
B.创建嵌套表类型
格式: Create Type 嵌套表类型名 As Table of 类型名;
实例: Create Or Type nestMingXiType As Tabele of MingXiType;
C.创建主表,其中一个列是嵌套表的类型的
格式: Create Table 表名
(
字段1 类型及长度.....字段N 类型及长度,
嵌套类型字段 嵌套表类型名
)
Nested Table 嵌套类型字段名 Store As 真正存储的嵌套表;
实例:(创建入库表)
Create Table InStockTable
(
OrderID varchar(13) not null Primary Key,
InDate Date,
Operator varchar(12),
MingXi nestMingXiType
) Nested Table MingXi Store As MingxiTable;
2.操纵嵌套表
A.向嵌套中插入记录
格式: Insert Into 主表名[(字段列表)]
Values(主表字段1值,.....主表字段N的值,
嵌套表类型名(嵌套表类型的基类型名(属性1的值,....属性N的值)
)
);
实例: Insert Into InStockTable
Values('200208060001',To_Date('2002-08-06','YYYY-MM-DD'),'3001',
nestMingXitableType(MingXiType('J0001',200,'1001'),
MingXiType('S0001',1000,'1002'),
MingXiType('T0005',500,'1003')
)
)
B.更新嵌套表中的数据
Update Table(select t.mingxi from instocktable t where orderid='200208060001') mx
set mx.incount=500
where mx.goodsid='j0001';
c.删除嵌套中的数据
delete from
table (select t.mingxi from instocktable t where orderid='200208060001') t
where t.goodsid='10001'
创建对象表
Create Table ObjectTable1 of MingxiType;
插入对象记录
Insert into objectTable1 values('3002',3000,'s001');
查询对象表中的OID
select ref(a) from objecttable1 a;
1.Ref 函数使用
--创建科室类型
Create or replace Type officeType As Object
(
ID varchar(10),
TypeName varchar(10)
);
--创建对应的对象表-- 科室表
Create table office of officeType;
--向对象表中插入记录
Insert into office Values('0001','财务科');
Insert into office Values('0002','人士科');
Insert into office Values('0003','伙食科');
Insert into office Values('0004','后勤科');
--使用Ref函数查看行对象的OID值以及表中的科室编号,名次
格式:select Ref(表别名) From 对象表 对象表的别名;
实例:
select Ref(f) ,ID,TypeName from Office f; -- 将表的别名作为输入
结果: 对象的OID编号, 类型名
2.Ref类型
Ref类型的使用:通过REf和DEref运算符,可以将OID用于创建外键关系.
--创建具有外键的关系表--人事表
Create Table Worker
( WorkerID varchar(10) primary key,
WorkerName varchar(10),
Workeroffice ref officeType Scope Is Office, --引用officetype外键.关联的是OID值
phone varchar(16)
);
--向表中插入数据,此表将从上面创建的对象表中引用数据
Insert into worker select 'C001','张小明',Ref(0),'010-1234567' from office 0
where ID='001'
3.使用Deref查看OID指向的行中的数据
格式: select Deref(表别名.引用类型列名) from 表名 表的别名
实例: select workerID,workerName,DeRef(w.workerOffice),phone from worker w
where workerID='C001'
4.Value函数;
--使用value()返回表中的对象
select Value(0) from office 0;
5.对象试图
Create view officeview of officetype with object oid(id)
as select * from office;
6.创建对象试图
A.创建基于关系表父表的对象类型.
create or replace type depttype as object
(
deptno number(2),
dName varchar2(14),
loc varchar(13)
);
--创建基于关系表的视图(dept)
create view deptview of depttype with object oid(deptno) as select * from dept;
B.创建引用视图(类似于关系创建一个从表)
Create view emp_view as select make_ref(deptview,deptno) deptOid,empno,ename from emp;
--对象视图实际上是将关系包装成对象表,通过构造关系表每条记录OID来实现类似于关系表 --主外键约束.
三.动态游标
declare
type refEmpcur is ref cursor;
empcur refempcur
Emprow emp%rowtype;
flag int:=0;
begin
flage:=&flage;
if flag=0 then
Open Empcur for select * from emp where sal>500 and sal<1000;
elseif flag=1 then
open Empcur for select * from emp where sal>=1000;
else
open Empcur for select * from emp;
end if;
/* 由于For循环会自动的打开游标,所以REF游标不能使用
for Emprow int Empcur loop
DBMS_output.put_line('empno'||emprow.empno);
end loop; */
loop
Fetch empcur into emprow;
DBMS_output.put_line('empno'||emprow.empno);
wxit when empcur%notfound;
end loop;
end;
过程的使用
A.结构
--说明部分
Create or replace procedure 过程名
as
/* 声明部分*/
begin
/*声明部分*/
exception
/*异常处理部分*/
end [过程名];
//注:(过程是有名的程序块,as代替了Declare声明关键词)
B.格式
Create or replace procedure 过程名
[(参数1 in|out|in out 类型,参数2 in|out| int out 类型,.....参数N in|out|in out 类型)]
{is|as}
过程体
四.程序包
A.包说明及主体
格式:Create [or Replace] package 包名 IS|AS
变量声明|类型定义|异常声明|游标声明|函数说明|过程说明
Pragma restrict_references(函数名,WNDS[,WNPS][,RNDS][,RNDS])
end [包名];
B.格式:
Create [or replace] package body 包名 IS|AS
/*包体名一定要已经定义的包名同*/
变量声明|类型定义|异常声明|游标声明|函数定义|过程定义
end [包体名];
C.包调用
包名.类型名;
包名.函数名[参数表];
包名..过程名[参数表];
显示绑定到引用游标变量上的值----包调用
set Autoprint on
1.variable tempCursor;
2.exec Studentpackage.returnstudent(:tempCur);
D.数据字典
User Objects ,User_source
F.包的修改和删除
Drop Package [body] 包名;
Drop Package Body StudetPackage;
包的实例:
包的声明部分
Create or replace package Studentpackage
is
type curRefstudent is ref Cursor return student%rowtype;
Procedure selectstudent(findID in strudent.stuid%type)
Procedure Insertstudent(Newstudent in student%type);
Procedure Updatestudent(Newstrdeng in student%rowtype);
procedure deletestudent(DelID in student.stuid%Type);
Procedure Returnstudent(inOutstu in out Currefstudeng);
function ReturnRecordCount return Number;
end strudentpackage;
创建包的主体部分实例:
Create or replace Package body studentPackage as
procedure selectstudent(findID in student.stuid%type) as
Cursor findcur is select * from student where stuid=findid;
begin
for s in findcur loop
DBMS_output.put_line(s.stuid||' '||s.stuName||' '||s.sex);
end loop;
Exception
when No_date_found then
DBMS_output.put_Line('没有查到ID为'||findid||'的记录!');
when others then
DBMS_OutPut.put_Line('查询过程中发生意外情况');
end selectstudent;
Procedure Insertstudent(newstudent in student%RowType) AS
iRec Integer;
Not_Exits_student Exception;
begin
select count(*) into iRec from Student where stuid=newstudent.stuid;
if iRec>0 then
Raise not_exists_studeng;
else
Insert into Studeng valuew(newStudeng.stuid,newstudeng.stuName,newstudeng.sex);
commit;
end if;
Exception
when Not_Exists_Studeng Then
DBMS_Output.put_line('要插入的编号为:'||NewStudent.stuid||'的记录已经存在');\
when others then
DBMS_OUtput.put_Line('插入记录操纵过程中出现错误');
end InsertStudent;
............................... --中间其他存储过程的实现 省略
//引用游标的使用.
Procedure Returnstudent(inOutStu in out curRefStudent) as
begin
Open inOutStu For select * from student;
end Returnstudent;
end studentPackage ;
程序包的调用
1.调用Studentpackage中的InsertStudent过程
Declare
newStu Student%RowType;
begin
Newstu.stuid:='1001';
newstu.stuName:='马大哈';
Studentpackage.insertstudent(newstu);
end;
2.
Declare
newStu Student%RowType;
begin
newstu.stuid:='1001';
newstu.stuname:='李连杰';
newstu.sex:='男';
Studentpackage.Updatestudent(newstu);
Exception
when Dup_Val_On_Index then
DBMS_OUTPUT.put_Line('唯一约束被破坏');
when Others then
DBMS_OUTPUT.PUT_Line('更新过程出现错误');
end;
3.
begin
StudentPackage.DeleteStudent('888');
end;
4.
begin
DBMS_OUTPUT.PUT_line(StudentPackage.ReturnRecordCount);
end;
5.调用引用游标
set Autoprint on
Variable tempcur refcursor;
exec Studentpackage.returnstudent(:tempcur);
函数级别的使用
Create table test(a int);
Create or replace package Mypack
is
procedure UpdateTable(s Int);
Pragma restrict_references(Updatetable,Wnds);
end Mypack;
Create or replace package body Mypack
is
procedure Updatetable(s Int) is
begin
Update test set a=s;
end;
end;
触发器的使用:
1.触发器具有三个部分
(1)触发事件
(2)可选的触发器约束条件;
(3)触发器动作
2.可以创建对应如下语句所触发的触发器;
(1)DML语句(Insert Delete UPdate);
(2)DDL语句(create Alter Drop)
(3)数据库操纵(serverError logon logoff Startup Shutdown)
3.可创建触发器的对象
(1) 数据库表
(2)数据库视图
(3)用户模式
(4)数据库实例
4.触发器类型
(1) DML触发器
(2)系统触发器
(3)替代(Instead of) 触发器
5.执行DML语句的顺序
(1)执行Before语句级触发器(如果有);
(2)对于受语句影响的每一行,执行DML语句;
(3)执行After语句级触发器(如果有)
6.两个特殊值 :New 新值 :Old旧值
7.触发器谓词
(1) Inserting
(2) Updating
(3) Deleting
二,创建DML触发器
Create [or Replace] Trigger [模式.]触发器名
before | After Insert| Delete |Update Of 列名
on 表名
[For Each Row]
when
pl/sql 块
1.使用Before触发器(new)
Create or replace Trigger tg_student
before insert on Student
for each row
when (new.sex='f')
(一)PL/SQL索引表
一PL/SQL表
1.定义表类型
Type 表类型名 Is Table of 列类型 | 变量数据类型[非空] index By Binary_Integer;
注:
A 表类型名: 是表类型定义的名称(像记录类型一样)
B列类型:可以是char,Date,Number等任何标量的数据类型
C变量数据类型: 可以是%Type或%Rowtype,Record等类型
实例:
Type stuNametableType is Table of varchar(10) index By Binary_Integer;
Type StudentTableType is Table of Student%RowType Index By Binary_Integer;
2.声明PL/SQL变量
PL/SQL变量 PL/SQL类型
Stunametable stuNameTableType;
3.访问plsql变量/删除plsql变量元素
变量名(索引下标)
Declare
Type stuNametableType is TAble of varhcar(10) Index By Binary_Integer;
stuNametable stuNameTableType;
begin
stunametable(2):='10';
DBMS_Output.put_line('stunametable'||stunametable(2));
stunametable(6):='10';
DBMS_Output.put_line('stunametable'||stunametable(6));
stunametable.delete(6);
DBMS_Output.put_line('stunametable'||stunametable(6));
end;
二.记录类型
第一步声明记录类型
1.格式
Type 记录类型名 is Record
(字段1 类型| 变量%Type| 表. 字段名%Type|表%RowType [Not Null[:=表达式1],
字段n 类型| 变量%Type|表. 字段名%Type|表%RowType[Not null[:=表达式n]);
第二步 声明记录类型变量
变量 记录类型
赋值方法
变量名.列名
2.
Declare
Type stuRecordType is Record
( ID Student.StuID%Type,
Name Student.StuName%Type,
Sex Student.Sex%Type);
stuRec StuRecordType; --定义记录类型变量
Begin
Select StuID,StuName,Sex Into StuRec From Student
where StuID='1001';
DBMS_Output.put_line(stuRec.ID||''||stuRec.Name||''||stuRec.Sex);
Exception
when No_Data_Found then
DBMS_OutPut.put_Line('没有数据查询到!);
end;
三.嵌套表与可变数组(集合类型)
1.声明类型 Type Table_Type is table of Type
2.定义变量及初始化 Var_Table Table_Type:=Table_type(1,3,2);
3.实例
Declare
type myTabletype is table of int;
vartable mytabletype :=mytabletype(1,2,3,4.5,6,7,8,9);
begin
/*vartable(1):10;*/
for i in 1..9 loop
DBMS_Output.Put_line('ss'||vartable(i));
end loop;
end;
/
4.嵌套表与PL/sql表的区别
四.集合方法
五.批量绑定
当集合参与数据存取时,为提高效率而采用的方法
Bulk collect 子句
注 Bulk collect 可以用于select Into 子句中
也可以用于游标Fetch Bulk collect int 子句中
六,成员函数和方法
Accessof 和multator
注意member关键字的用法.
七.定义对象类型
1.定义对象类型的说明部分
Create or replace type Persontype as object
(
Id Int,
Name varchar(20),
Member function GetId Return int,
Member procedure setID(pid int),
Member function GetName return varchar,
Member procedure SetName(Pname vharchar)
) not final;
2.实现对象的主体部分
Crate or replace type body Persontype as
member function getid return int
is
begin
Return id;
end getid;
member procedure setid(pid int) as
begin
id:=Pid;
end setid;
member function getName return varchar as
begin
return Name;
end Getname;
member procedure setName(Pname varchar) is
begin
Name:=Pname;
end setName;
end;
3.对象的使用
Declare
p persontype;
begin
p:=Persontype(1001,'tom');
DBMS_output.put_line(p.id);
DBMS_output.put_line(p.getid);
DbMS_output.put_line(p.getName);
p.setID(2001);
p.setName('Mike');
end;
4.定义对象表
Create table persontable of persontype;
5.向对象表中插入数据
Insert into persontable values(2001,'Mike');
insert into persontable values(persontype(2002,'peter'));
6.查询对象表中的数据
select ref(o) from persontable o
select value(o) from persontable o;
select p.getid(),p.getname() from persontable p where p.id=2001