日期:2014-05-16 浏览次数:20546 次
《PL/SQL编程》 /*procedural language/sql*/ --1、过程、函数、触发器是pl/sql编写的 --2、过程、函数、触发器是在oracle中的 --3、pl/sql是非常强大的数据库过程语言 --4、过程、函数可以在java程序中调用 --提高效率:优化sql语句或写存储过程 --pl/sql移植性不好 --IDE(Integration Develop Environment)集成开发环境 --命令规则: --变量(variable) v_ --常量(constant) c_ --指针、游标(cursor) _cursor --例外、异常(exception) e_ --可定义的变量和常量: --标量类型:scalar --复合类型:composite --存放记录、表、嵌套表、varray --参照类型:reference --lob(large object) 《PL/SQL 基本语法》 --例:创建存储过程 create or replace procedure pro_add is begin insert into mytest values('韩xx','123'); end; exec pro_add; --调用 --查看错误信息 show error; --调用过程 exec 过程(c1,c2,...); call 过程(c1,c2,...); --打开/关闭输出选项 set serveroutput on/off --输入 & --块结构示意图 declare --定义部分,定义常量、变量、游标、例外、复杂数据类型 begin --执行部分,执行pl/sql语句和sql语句 exception --例外处理部分,处理运行的各种错误 end; --结束 --《实例演示》 declare v_ival number(4) :=100; --声明并初始化变量 --v_dtm date; v_dtm syslogs.dtm%type; --取表字段类型 v_content varchar(512); begin v_ival := v_ival * 90; --赋值运算 insert into syslogs values(seq_syslogs.nextval,10,sysdate,'v_ival='||v_ival,user);--数据库存储 dbms_output.put_line('v_ival'||v_ival); select count(*) into v_ival from syslogs;--使用select查询赋值 --select ename,sal into v_name,v_sal from emp where empno=&aa; insert into syslogs values (seq_syslogs.nextval,10,sysdate,'日志条数='||v_ival,user); dbms_output.put_line('日志条数'||v_ival); --获取日志序号==11的日志时间和日志内容 select dtm , content into v_dtm,v_content from syslogs where logid=14; insert into syslogs values (seq_syslogs.nextval,'10',sysdate,'v_dtm='||v_dtm||'v_content='||v_content,user); dbms_output.put_line('v_dtm='||v_dtm||'v_content='||v_content); --修改日志序号=11的日志记录人 update syslogs set whois='PL/SQL.'||v_ival where logid = 14; --delete syslogs where logid=15; --分支流程控制 if v_ival>50 then dbms_output.put_line('日志需要清理了~'); else dbms_output.put_line('日志空间正常!'); end if; --Loop循环 v_ival :=0; loop exit when v_ival>3; --循环体 v_ival := v_ival+1; dbms_output.put_line('loop循环:'||v_ival); end loop; --While循环 v_ival := 0; while v_ival < 4 loop --循环体 v_ival := v_ival+1; dbms_output.put_line('while循环:'||v_ival); end loop; --For循环 for v_count in reverse 0..4 loop --reverse递减 dbms_output.put_line('for循环:'||v_count); end loop; commit;--提交事物 end; select * from syslogs; 《PL/SQL 异常处理》 --PL/SQL异常处理:oracle内置异常,oracle用户自定义异常 declare v_title logtypes.tid%type; v_ival number(9,2); --自定义的异常 ex_lesszero exception ; begin --select title into v_title --from logtypes --; too_many_rows --where tid = 30 ; --NO_DATA_FOUND 异常 v_ival := 12/-3; if v_ival < 0 then --直接抛出异常 --raise ex_lesszero ; --使用系统存储过程抛出异常 raise_application_error(/*错误代码,-20000~-20999*/-20003,/*异常描述*/'参数不能小于0!'); end if; commit; exception --异常处理代码块 when no_data_found then dbms_output.put_line('发生系统异常:未找到有效的数据!'); when too_many_rows then dbms_output.put_line('发生系统异常:查询结果超出预期的一行!'); when ex_lesszero then dbms_output.put_line('发生用户异常:数值不能为负!'||sqlcode||'异常描述:'||sqlerrm); when others then --other例如Exception rollback; dbms_output.put_line('发生异常!'||sqlcode||'异常的描述:'||sqlerrm); end; 《PL/SQL 游标的使用》 declare --游标的声明 cursor myCur is select tid,title from logtypes ; --定义接收游标中的数据变量 v_tid logtypes.tid%type; v_title logtypes.title%type; --通过记录来接受数据 v_typercd myCur%rowtype ; begin --打开游标 open myCur ; --取游标中的数据 loop --遍历游标中的下一行数据 fetch myCur into v_tid,v_title ; --检测是否已经达到最后一行 exit when myCur%notfound ; --输出游标中的数据 dbms_output.put_line('读取tid='||v_tid||' title='||v_title); end loop; --关闭游标 close myCur; --打开游标 open myCur ; loop fetch myCur into v_typercd ; exi