/**//* --建表 create table student( recordid number(38), sid int not null , sname varchar2(50), sdate date, sage number(3) ); */ --删除表 --drop table student; --插入数据 /**//* set serveroutput on --允许服务器输出 declare maxrecords constant int:=100; i int:=1; begin for i in 1..maxrecords loop insert into student(sid,sdate)values(i,sysdate); end loop --dbms_output.put_line('成功录入数据!'); commit; end; */ --select * from student; --声明一个变量 /**//* declare pi constant number(9):=3.1415926; begin commit; end; */ --复合数据类型(常见的五种) --1 .使用 %type 定义变量 --为了让PL/SQL中变量的类型和数据表中的字段的数据类型一致,Oracle 9i提供了%type定义方法。 --这样当数据表的字段类型修改后,PL/SQL程序中相应变量的类型也自动修改. /**//* Declare mydate student.sdate%type; begin commit; end; */ --2. 定义记录类型变量 --将多个基本数据类型捆绑在一起的记录数据类型。 /**//* set serveroutput on declare type myrecord is record( sid int, sdate date); srecord myrecord; --声明一个自定义记录类型变量的实例 begin select sid,sdate into srecord from student where sid=68; dbms_output.put_line('ID: '|| srecord.sid ||'Date:'|| srecord.sdate); --'||': 它是字符串连接符. end; */ --3.使用 %rowtype 变量 --使用%type可以使变量获得字段的数据类型,使用%rowtype可以使变量获得整个记录的数据类型。 --比较两者定义的不同:变量名 数据表.列名%type,变量名 数据表%rowtype。 /**//* set serveroutput on Declare mytableRow student%rowtype; begin select * into mytableRow from student where sid=88; dbms_output.put_line(mytableRow.sid || mytableRow.sdate); end; */ --4.定义一维表类型变量 --表类型变量和数据表是有区别的,定义表类型变量的语法如下: -- ――――――――――――――――――――――――――――――――――――― -- type 表类型 is table of 类型 index by binary_integer; -- 表变量名 表类型; -- ――――――――――――――――――――――――――――――――――――― -- 类型可以是前面的类型定义,index by binary_integer子句代表以符号整数为索引, -- 这样访问表类型变量中的数据方法就是“表变量名(索引符号整数)”。 /**//* Declare type tabletype1 is table of varchar2(4) index by binary_integer; --定义一个字符型的一维数组 type tabletype2 is table of student.sid%type index by binary_integer;--定义了一个整数数型的数组 table1 tabletype1; --实例声明 table2 tabletype2; --实例声明 begin table1(1):='学生'; table1(2):='职员'; table2(1):=88; table2(2):=89; dbms_output.put_line(table1(1)||table2(1)); dbms_output.put_line(table1(2)||table2(2)); end; */ --5.定义多维类型表变量 --相当于定义多维数组. --注意在运行下面的语句前要在数据库中插入数据. Declare type tabletype1 istableof student%rowtype indexby binary_integer; table1 tabletype1; begin select*into table1(60) from student where sid=60; dbms_output.put_line(table1(60).sid ||table1(60).sdate); end;
--流程控制 --1. if..then..end if set serveroutput on declare i integer:=60; j integer:=30; begin if i>=j then dbms_output.put_line(j); endif; end; --2.if嵌套条件控制 if 条件1 then if 条件2 then 语句段1; else 语句段2; endif; else 语句段3; endif; --3.循环控制 --loopexitend loop set serveroutput on declare i integer:=10; j integer:=20; w integer:=10; begin loop i:=i+1; if(j=i)then begin dbms_output.put_line('我哥俩现在一样多了.'|| to_char(j)) ; exit; end; else w:=w-1; endif; end loop; dbms_output.put_line('w还剩多少: '|| to_char(w)) ; end; --4.whileloopend loop while 条件 loop 执行语句段; end loop; --5.forinloopend for 循环变量 in[reverse] 循环下界循环上界 loop 循环处理语句; end loop; set serveroutput on declare i int:=0; j int:=100; begin for j in1..6 loop i:=i+1; end loop; dbms_output.put_line('循环次数: '|| to_char(i)) ; end; --5.事务处理 --在pl/sql中,可以使用三个事务处理控制命令. --在PL/SQL程序打开自动提交功能。这样每次执行PL/SQL程序都会自动进行事务提交。 --语句: set auto on; --相应的,取消自动提交功能的PL/SQL程序为: --set auto off; --commit,rollback,savepoint --select * from student; --commit; --delete from student; --rollback; --回滚刚才的delete 操作. --select * from student; savepoint insertpoint; insertinto student(sid,sname) values(900,'mrfu'); --创建保存点 : savepoint 保存点名; select sid,sname from student where sid=900; rollbackto insertpoint; --回滚保存点: rollbacd to 保存点名; --dbms_output.put_line('回滚保存点') ; select sid,sname from student where sid=900;
--存储过程 /**//* --1.过程的语法结构 --参见:http://newland.cnblogs.com/archive/2006/04/05/367531.html --2.执行存储过程 begin 存储过程名; end; --创建好的存储过程可以被任何程序调用 */ --3.带参数的存储过程 /**//* 参数类型 在PL/SQL过程中,可以有3种类型的参数。 in参数:读入参数,主程序向过程传递参数值。 out参数:读出参数,过程向主程序传递参数值。 in out 参数:双向参数,过程与主程序双向交流数据。 */ --rownum --SELECT * FROM STUDENT WHERE sid=2 and ROWNUM<=1; / --SELECT * FROM STUDENT WHERE ROWNUM<=5; / CREATEORREPLACEPROCEDURE MRFUTESTPRO ( MYID student.sid%type) AS MYNAME student.sname%type; BEGIN EXECUTE IMMEDIATE 'SELECT SNAME FROM STUDENT WHERE SID=:1 and ROWNUM<2' USING MYID RETURNING INTO MYNAME; DBMS_OUTPUT.PUT_LINE('我的名字:'||MYNAME); exception when others then dbms_output.put_line('没有符合条件的数据'); end MRFUTESTPRO; / BEGIN MRFUTESTPRO(2); END; / --创建一个存储过程实现输入一个学生的sid编号,查询出拥有该sid号的第一个学生的名字. createorreplaceprocedure mrfuproc ( tempid in student.sid%type , tempName out student.sname%type ) as myName nvarchar2(50); begin select sname into tempName from student where sid=tempid and rownum<2; myName:='姓名'||tempName; end mrfuproc; / declare myid student.sid%type; myName student.sname%type; begin myid:=10; myName:=''; mrfuproc(myid,myName); dbms_output.put_line(myid); dbms_output.put_line(myName); end; / --创建队列示例 CREATE SEQUENCE idseqSample START WITH1-- 从1开始计数 INCREMENT BY1-- 每次加几个 NOMAXVALUE -- 不设置最大值 MINVALUE 1 CACHE 10--缓冲区大小 NOCYCLE -- 一直累加,不循环 --NOCACHE -- 不建缓冲区 / --创建索引 CREATEUNIQUEINDEX system.idindex ON system.student(recordid); / --创建队列 CREATE SEQUENCE system.idseq start with1 increment by1 maxvalue 987654321 minvalue 1 cache 10 ; / --创建触发器 ,实现插入student表中纪录时,自动插入recordid字段数据,并实现自动增量. CREATEORREPLACETRIGGER system.idtrigger BEFORE INSERTON system.student REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW BEGIN SELECT system.idseq.NEXTVAL INTO :NEW.recordid FROM DUAL; END; / --测试 ,首先删除表中的所有记录,然后插入30条纪录.最后检查效果. deletefrom system.student; / declare i int:=0; begin for i in1..30 loop insertinto system.student (sid,sname,sage)values(i,'frj'||to_char(i),'26'); end loop; end; / select*from system.student; /