Oracle基本语法

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.uiblockidsql

清空回收站数据库

PURGE recyclebin;数组

建立用户
 
CREATE USER "CEMDB" PROFILE "DEFAULT" IDENTIFIED BY "*******" DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK
GRANT "CONNECT" TO "CEMDB"session

alter session set NLS_date_format='YYYY-MM-DD';   修改数据查询时间格式ide

create sequence NumSeq increment by 1 start with 1 maxvalue 999;  建立序列 函数

insert into table values(NumSeq.nextval);   表中插入序列oop

select NumSeq.currval from dual;  查询序列当前值;ui

drop sequence NumSeq  ; 删除序列;rest

Create or replace type 类型名 as object
(
    colum1 varchar(20),
    colum2 varchar(30)
)  建立类型orm

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  

相关文章
相关标签/搜索