OraclePLSQL编程精简.pdf
《OraclePLSQL编程精简.pdf》由会员分享,可在线阅读,更多相关《OraclePLSQL编程精简.pdf(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、PL/SQL 编程-1-PL/SQLPL/SQLPL/SQLPL/SQL 编程编程pl/sql(procedural language/sql)是 Oracle 在标准的 sql 语言上的扩展。pl/sql 不仅允许嵌入式 sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误。这样使得他的功能变的更强大。缺点是移植性不好。编写一个存储过程,向表中添加数据。1.create table mytest(name varchar2(30),passwd varchar2(30);2.create or replace procedure xxc_pro1 isbeg
2、ininsert into mytest values(小红,m123);end;3.调用过程exec过程名(参数 1,参数 2)或 call 过程名参数 1,参数 2)1exec xxc_pro1;或者是2call xxc_pro1;pl/sql 可以做什么?块:包括过程、函数、触发器、包。编写规范:1.注释-:单行注释eg:select*from emp where empno=7788;-取得员工信息/*/多行注释2.表示符号(变量)的命名规范:1当定义变量时,建议用 v_作为前缀:v_ename2当定义常量时,建议用 c_作为前缀:c_rate3当定义游标时,建议用_cursor 作为
3、后缀:emp_cursor4当定义例外时,建议用 e_作为前缀:e_error块(block)是 pl/sql 的今本程序单元,编写 pl/sql 程序实际上就是在编写 pl/sql 块;pl/sql 块由三部分组成:定义部分,执行部分,例外处理部分。declare-可选部分/*定义部分:定义常量,变量,游标,例外,复杂数据类型*/begin-必选部分/*执行部分:要执行的 pl/sql 语句和 sql 语句*/exception-可选部分/*例外处理部分:处理运行的各种错误*/实例 1:只包含执行部分的 pl/sql 块SQL set serveroutput on-打开输出SQL begi
4、n2dbms_output.put_line(hello);3end;4/说明:dbms_output 是 oracle 提供的包,该包包含一些过程,put_line 就是其中之一。实例 2:包含定义部分和执行部分SQL declare2v_ename varchar2(5);3begin4select ename into v_ename from emp where empno=&no;PL/SQL 编程-2-5dbms_output.put_line(雇员名|v_ename);6end;7/说明:&:从控制台输入变量,会弹出一个对话框。实例 3.同时输出雇员名和工资SQL declare
5、2v_ename varchar2(20);3v_sal number(10,2);4begin5select ename,sal into v_ename,v_sal from emp where empno=&no;6dbms_output.put_line(雇员名:|v_ename|工资:|v_sal);7end;8/包含定义,执行,和例外处理的 pl/sql 块。实例 4.当输入的员工号不存在时SQL declare2v_ename varchar2(20);3v_sal number(10,2);4begin5select ename,sal into v_ename,v_sal f
6、rom emp where empno=&no;6dbms_output.put_line(雇员名:|v_ename|工资:|v_sal);7exception-异常处理部分8when no_data_found then9dbms_output.put_line(请输入正确的员工号!);10end;11/以上为块的基础,下面来介绍块的各个组成:过程,函数,触发器,包。过程过程过程用于执行特定的操作,当执行过程的时候,可以指定输入参数(in),也可以指定输出参数(out)。通过在过程中使用输入参数,可以讲数据输入到执行部分,通过使用输出参数,可以将执行部分的数据输出到应用环境,在pl/sql中
7、可以使用create procedure命令来创建过程。编写一个存储过程,可以输入雇员名和新工资来改变员工工资。-案例create or replace procedure xxc_pro3(newname in varchar2,newsal in number)isbeginupdate emp set sal=newsal where ename=newname;end;调用exec xxc_pro3(SCOTT,2900);-in表示是输入参数,可以不写,默认是in,但out必须写。在java程序中调用存储过程来修改工资;/演示java程序调用oracle中的存储过程packagepa
8、ckagepackagepackage TestOraPro;/根据不同的包,包名不同importimportimportimport java.sql.*;publicpublicpublicpublic classclassclassclass TestOraPro PL/SQL 编程-3-/*paramparamparamparam args*/publicpublicpublicpublic staticstaticstaticstatic voidvoidvoidvoid main(String args)/TODOTODOTODOTODO Auto-generated method
9、 stubtrytrytrytry/加载驱动Class.forName(oracle.jdbc.driver.OracleDriver);/得到连接1521为端口号Connection ct=DriverManager.getConnection(jdbc:oracle:thin:127.0.0.1:1521:CUIXIAO2,scott,xxc);/创建callablestatementCallableStatement cs=ct.prepareCall(call xxc_pro3(?,?);/给?赋值cs.setString(1,SMITH);cs.setInt(2,2600);/执行c
10、s.execute();catchcatchcatchcatch(Exception e)e.printStackTrace();finallyfinallyfinallyfinally/关闭资源cs.close();ct.close();以上为过程基础,后会详细讲。函数函数函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句,而在函数体内必须包含return语句来返回数据,可以使用create function来建立函数。案例1.返回工人年工资。-函数案例create or replace function xxc_fun1(newname varchar2)return
11、 number is yearSal number(10,2);beginselect sal*12+nvl(comm,0)*12 into yearSal from emp where ename=newname;return yearSal;end;在sqlplus中调用函数sqlvar income number;sqlcall xxc_fun1(SCOTT)into:income;PL/SQL 编程-4-sqlprint income;在java中调用函数select xxc_fun1(SCOTT)from dual;这样可以通过rs.setInt(1)得到返回结果。包包包用于在逻辑上
12、组合过程和函数,它由包规范和包体两部分组成。1.我们可以用create(or replace)package命令来建包;实例:create package xxc_package isProcedure update_sal(name varchar2,newsal number);Function annual_sal(name varchar2)return number;End;包规只包含过程和函数的说明,但是没有函数和过程的实现代码。包体用于实现包规范中的过程和函数。2.建立包体可以用create package body命令。create package body xxc_packa
13、ge isProcedure update_sal(name varchar2,newsal number)isbeginupdate emp set sal=newsal where ename=name;end;function annual_sal(name varchar2)return number isannual_salary number;beginselect sal*12+nvl(comm,0)*12 into annual_salary from empwhere ename=name;return;end;end;3.如何调用包中的过程和函数。在过程和函数前加上包名。e
14、xec xxc_package.update_sal(SCOTT,120);触发器触发器触发器是指隐含的存储过程,当定义触发器是,必须指定触发事件和触发的操作,常用的触发操作有insert、update和delete。触发器操作实际上是一个pl/sql块,可以使用create trigger命令来创建触发器。因为触发器内容很多,会在后面详细介绍,触发器是非常有用的,可以用来维护数据库的安全和一致性。在编写pl/sql块时可以定义的变量和常量;1.标量类型(scalar);2.复合类型(composite);3.参照类型(reference);4.lob(large ofject);标量类型标量
15、类型(scalar)(scalar)(scalar)(scalar)常用类型常用类型语法格式(即前边最常见的格式)变量名 constant datatype not null:=/default exprexpr:指定初始值的pl/sql表达式,可以是文本,其他变量,函数等。定义标量案例PL/SQL 编程-5-1定义一个变长字符串V_ename varchar2(10);2定义一个小数,范围在-9999.999999.99v_sal number(6,2);3定义一个小数并赋初值:=是pl/sql的赋值符号;v_sal number(6,2):=12.3;4定义一个日期类型数v_birthda
16、y date;5定义一个布尔类型变量,不能为空,默认是false;v_valid boolen not null default false;下面以输入员工号,显示员工姓名,工资,个人所得税(税率为0.03)为例,说明变量的使用。declarec_tax_rate number(3,2):=0.03;v_ename varchar2(5);v_sal number(10,2);v_tax_sal number(10,2);beginselect ename,sal into v_ename,v_sal from emp where empno=&no;v_tax_sal:=v_sal*c_ta
17、x_rate;dbms_output.put_line(员工名:|v_ename|工资:|v_sal|缴税:|v_tax_sal);end;对于上边的pl/sql块,有一个问题。如果员工的名字长于5个字符,就会出现错误,为了降低pl/sql的维护工作量,可以使用%type属性来定义变量,这样它会按照数据库列来确定你定义的变量的类型和长度。变量名表名.列名%type对于上例的改动v_ename emp.ename%type;v_sal emp.sal%type;复合类型(composite)-介绍用于存放多个值的变量,主要包括这几种:pl/sql记录;pl/sql表;嵌套表;varray;其中
18、用的多,用的少。1.pl/sql1.pl/sql1.pl/sql1.pl/sql的记录。的记录。类似于高级语言的结构体,当引用pl/sql记录成员的时候,必须要加记录变量作为前缀(记录变量.记录成员)。如:declaretype emp_record_type is record(name emp.ename%type,salary emp.sal%type,title emp.job%type);xxc_record emp_record_type;beginselect ename,sal,job into xxc_record from emp where empno=&no;dbms_
19、output.put_line(员工名:|xxc_record.name|工资:|xxc_record.salary);e e e end;nd;nd;nd;2.pl/sql2.pl/sql2.pl/sql2.pl/sql表表PL/SQL 编程-6-相当于高级语言中的数组,需要注意的是高级语言中的数组的下标不能为负,但表的下标没有限制,可以为负。例如:declare-binary_integer表示下标是整数type xxc_table_type is table of emp.ename%type index by binary_integer;xxc_table xxc_table_typ
20、e;begin-下标0可以是任何整数,-1,-2,23都可以,但输出的时候也要是同一个数,不然会出错。select ename into xxc_table(0)from emp where empno=7788;dbms_output.put_line(员工名:|xxc_table(0);end;在这个实例中,如果把where子句去掉,就会出错,因为你只请求了一个数据,而返回了多行数据。解决办法是使用参照变量。参照变量参照变量参照变量是指用于存放数据指针的变量,通过使用参照变量可以使得应用程序共享相同的对象,从而降低占用的空间。在编写pl/sql程序时,可以使用游标变量(ref cursor
21、)和对象类型变量(ref obj_type)这两种参照变量,用得多的是游标变量。游标变量游标变量定义游标是,不需要指定select语句,但当使用游标(open)时,需要指定select语句,这样一个游标就与一个游标就与一个select语句结合了。实例:编写一个pl/sql块,输入部门号,显示所有员工名和工资。declaretype xxc_emp_cursor is ref cursor;test_cursor xxc_emp_cursor;v_ename emp.ename%type;v_sal emp.sal%type;beginopen test_cursor for select en
22、ame,sal from emp where deptno=&no;loopfetch test_cursor into v_ename,v_sal;exit when test_cursor%notfound;dbms_output.put_line(名字:|v_ename|工资:|v_sal);end loop;close test_cursor;end;在 的基础上,如果员工的工资低于2000,加100declaretype xxc_emp_cursor is ref cursor;test_cursor xxc_emp_cursor;v_ename emp.ename%type;v_s
23、al emp.sal%type;beginopen test_cursor for select ename,sal from emp where deptno=&no;loopfetch test_cursor into v_ename,v_sal;exit when test_cursor%notfound;if v_sal2000 thenupdate emp set sal=sal+100 where ename=v_ename;v_sal=v_sal+100;PL/SQL 编程-7-end if;dbms_output.put_line(名字:|v_ename|工资:|v_sal);
24、end loop;close test_cursor;end;Pl/sqlPl/sqlPl/sqlPl/sql分支控制语句分支控制语句1.1.1.1.条件分支语句条件分支语句ifthenifthenelseiftheneslifthenelse当if语句结束时要有end if。不等于号是,不是!=,if job=MANAGER,是单引号,不是双引号。2.2.2.2.循环语句循环语句-loop-loop-loop-loop是pl/sql中最简单的循环语句,这种循环以loop开始,以end loop结束,此循环至少会被执行一次。例:编写一个循环过程,可输入用户名,并循环添加10个用户到user表中
25、,用户编号从1开始。Sqlcreate table user(userid number(10),username varchar2(20);Sqlcreate procedure xxc_insert_user1(name varchar2)isdeclarev_Num number:=1;-不用指定大小吗?beginloopinsert into user values(v_num,name);exit when v_num=10;v_num:=v_num+1;-Oracle中没有+符号end loop;end;-while-while-while-while循环循环当while条件为真时
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OraclePLSQL 编程 精简
限制150内