PLSQL程序设计简介.ppt
什么是PL/SQL,PL/SQL是 Procedure Language&Structured Query Language 的缩写PL/SQL是对SQL语言存储过程语言的扩展,PL/SQL提高了性能,Database,Database,SQLIF.THENSQLELSESQLEND IF;SQL,应用程序,应用程序,PL/SQL的优点,有利于客户/服务器环境应用的运行PL/SQL是对SQL语言存储过程语言的扩展PL/SQL是ORACLE系统的核心语言,现在ORACLE的许多部件都是由PL/SQL写成,PL/SQL块结构和组成元素,PL/SQL程序由三个块组成 即声明部分执行部分异常处理部分,PL/SQL块结构和组成元素,PL/SQL块的结构如下:DECLARE/*声明部分:在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数*/BEGIN/*执行部分:过程及SQL 语句,即程序的主要部分*/EXCEPTION/*执行异常部分:错误处理*/END;其中 执行部分 即 begin 和 end 块是必须的。,PL/SQL中的标识符,PL/SQL程序设计中的标识符定义与SQL的标识符定义的要求相同标识符名不能超过30字符 第一个字符必须为字母 不分大小写 不能是SQL保留字,PL/SQL中的标识符,一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果,例:DECLARE ename varchar2(20):=KING;BEGINDELETE FROM emp WHERE ename=ename;END;,PL/SQL中的标识符,下面是建议使用的变量命名方法,PL/SQL中的变量类型,PL/SQL中声明变量,在语句块的声明部分对变量声明,声明一个变量的语法是:variable_name constant type not null:=value其中:variable_name 为变量名 type 为类型 value 为变量的初值,PL/SQL中声明变量,例:DECLAREV_Description VARCHAR2(50);V_Number NUMBER:=45;V_Counter BINARY_INTEGER:=0;V_PI CONSTANT NUMBER NOT NULL:=3.14;注意:如果变量在声明时使用了NOT NULL选项则必须为变量指定初值如果变量在声明时使用了CONSTANT选项则必须为变量指定初值,并且该初值不能被改变。,PL/SQL中的复合类型,记录类型:记录类型是把逻辑相关的数据作为一个单元存储起来,定义记录类型语法如下:TYPE record_type IS RECORD(Field1 type1 NOT NULL:=exp1,Field2 type2 NOT NULL:=exp2,.Fieldn typen NOT NULL:=expn);,PL/SQL中的复合类型,%TYPE:定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE,例:DECLARE-用%TYPE 类型定义变量v_ename emp.ename%TYPE;-用%TYPE 类型定义与表相配的字段TYPE t_Record IS RECORD(t_no emp.empno%TYPE,t_name emp.ename%TYPE,t_sal emp.sal%TYPE);-声明接收数据的变量 v_emp t_Record;,PL/SQL中的复合类型,%ROWTYPE:返回一个记录类型,其数据类型和数据库表的数据结构相一致。,例:DECLARE v_empno emp.empno%TYPE:=,PL/SQL表类型,PL/SQL 表,或者称为索引表(index-table),是可以在PL/SQL 程序中引用、能够模仿数组的非永久表。用户可以定义一个表类型,然后声明这种类型的变量。接下来,用户就可以将记录添加到用户的PL/SQL 表中,并且采用与引用数组元素大体相同的方法引用他们,表包括两个基本成分:数据处理类型为BINARY_INTEGER主键 标量或记录数据类型的列 Note:此表非彼表,PL/SQL表,定义一个表:TYPE type_name IS TABLE OFcolumn_type|variable%TYPE|table.column%TYPE NOT NULL|table%ROWTYPE INDEX BY BINARY_INTEGER;,例:DECLARETYPE dept_table_type IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;my_dname_table dept_table_type;,PL/SQL表,注意:Index-by表中的元素不一定要按任何特定的顺序排序 关键字唯一允许的类型是BINARY_INTERGER 使用主键值引用表中的字段,引用表元素,DECLAREtype dept_table_type is table of dept%ROWTYPE index by binary_integer;my_dname_table dept_table_type;v_count number(3);BEGIN v_count:=-10;my_dname_table(v_count).dname:=searching;dbms_output.put_line(my_dname_table(v_count).dname);v_count:=0;my_dname_table(v_count).dname:=market;dbms_output.put_line(my_dname_table(v_count).dname);v_count:=10;my_dname_table(v_count).dname:=finance;dbms_output.put_line(my_dname_table(v_count).dname);END;,PL/SQL中的可变数组,元素下标从0开始,数组变量的声明需要同时初始化一般格式为:,TYPE type_name IS VARRAY(maximum_size)OF element_type,其中:type_name是新可变长数组类型的类型名,maximum_size是一个指定可变数组中元素最大数目的整数。element_type是一个PL/SQL标量、记录或对象类型。,一般格式为:DECLAREtype numberlist is varray(10)of number(5);type recordlist is varray(5)of dept%rowtype;,引用数组元素,例:DECLAREtype strings is varray(5)of varchar2(10);-Declare a varray with four element v_list strings:=strings(scott,peter,smith,tom);v_count number;BEGIN v_count:=1;dbms_output.put_line(v_list(v_count);v_list(v_count):=urman;dbms_output.put_line(v_list(v_count);v_count:=3;dbms_output.put_line(v_list(v_count);v_list(v_count):=jackson;dbms_output.put_line(v_list(v_count);v_list(4):=oracle;dbms_output.put_line(v_list(4);END;,表和数组属性,表和数组属性,例:DECLARE type strings_table is table of varchar2(10)index by binary_integer;strings strings_table;v_count number;BEGIN v_count:=1;strings(v_count):=element1;if strings.exists(v_count)then dbms_output.put_line(strings(v_count);else dbms_output.put_line(no data!);end if;-to be continued,表和数组属性,例:strings(2):=element2;strings(3):=element3;strings(4):=element4;strings(5):=element5;strings(6):=element6;dbms_output.put_line(strings.count);dbms_output.put_line(strings.first);dbms_output.put_line(strings.last);dbms_output.put_line(strings.next(2);dbms_output.put_line(strings.prior(4);strings.delete(1,3);-delete from 1 to 3-dbms_output.put_line(strings(2);-cannt find dataEND;,PL/SQL运算符和表达式,关系运算符,PL/SQL运算符和表达式,一般运算符,PL/SQL运算符和表达式,逻辑运算符,PL/SQL中的变量赋值,在PL/SQL编程中,变量赋值是一个值得注意的地方,它的语法如下:variable:=expression;variable 是一个PL/SQL变量,expression 是一个PL/SQL 表达式.BOOLEAN 型变量赋值:布尔值只有TRUE,FALSE及 NULL 三个值,其中空值在参加算数运算时,结果仍为空值。,PL/SQL中的变量赋值,例:DECLAREdone BOOLEAN;/*the following statements are legal:*/BEGINdone:=FALSE;WHILE NOT done LOOP-do somethingDbms_output.put_line(hello!);Done:=TRUE;END LOOP;END;,嵌套块和变量作用域,只要是允许执行语句的地方,就可以使用嵌套语句嵌套块也被当作一个语句异常部分也可以包含嵌套块,嵌套块也可以包括异常部分对象的作用域指的是可以应用对象的程序范围标识符可见的范围:块可以向上查看父块的标识符块不能向下查看到子块的标识符,PL/SQL中的变量作用范围及可见性,PL/SQL的变量作用范围特点是:变量的作用范围是在所引用的程序单元(块、子程序、包)内。即从声明变量开始到该块的结束 一个变量(标识)只能在所引用的块内是可见的 当一个变量超出了作用范围,PL/SQL引擎就释放用来存放该变量的空间(因为它可能不用了)在子块中重新定义该变量后,它的作用仅在该块内,嵌套块中的变量赋值,DECLARE v_weight NUMBER(3):=100;v_message VARCHAR2(255):=Outer Value;BEGIN DECLARE v_weight NUMBER(3):=1;v_message VARCHAR2(255):=Inner value;BEGIN v_weight:=v_weight+1;v_message:=Put|v_message;END;v_weight:=v_weight+1;v_message:=Put|v_message;END;,PL/SQL中的变量作用范围及可见性,例:DECLAREv_Number NUMBER(3,2);BEGINDECLARE v_Character VARCHAR2(10);BEGIN END;END;,v_Number的作用域,v_Character的作用域,PL/SQL中的注释,在PL/SQL里,可以使用两种符号来写注释:PL/SQL允许用 来写注释,它的作用范围是只能在一行有效。例:V_Sal NUMBER(12,2);-工资变量 使用/*/来加一行或多行注释。例:/*/*文件名:department_salary.sql*/*/,PL/SQL示例,例:简单数据插入例子 DECLAREv_ename VARCHAR2(20):=Bill;v_sal NUMBER(7,2):=1234.56;v_deptno NUMBER(2):=10;v_empno NUMBER(4):=8888;BEGININSERT INTO emp(empno,ename,JOB,sal,deptno,hiredate)VALUES(v_empno,v_ename,Manager,v_sal,v_deptno,TO_DATE(1954.06.09,yyyy.mm.dd);COMMIT;END;,PL/SQL示例,例:简单数据删除例子 DECLAREv_empno number(4):=8888;BEGINDELETE FROM emp WHERE empno=v_empno;COMMIT;END;,谢谢,