资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,7,章,PL/SQL,编程基础,前面所学习的,SQL,是操作关系性数据库的一种通用语言,但是,SQL,本身是一种非过程化的语言,即不用指明执行的具体方法和途径,而是简单地调用相应语句直接取得结果即可。所以,SQL,本身并不适合在复杂的业务流程下使用,为了解决这一问题,,Oracle,提供了,PL/SQL,编程,这是一种过程化编程语言,与,JAVA,语言一样关注于处理细节,可以实现较为复杂的业务逻辑。,1,7.1,PL/SQL,简介,PL/SQL,语法结构,DECLARE,-,声明部分,例如:定义变量、常量、游标,BEGIN,-,程序编写、,SQL,语句,EXECEPTION,-,处理异常,END;,/,声明部分(,DECLARE,),:包含变量定义、用户定义的,PL/SQL,类型、游标、引用 的函数或过程。,执行部分(,BEGIN,),:包含变量赋值、对象初始化、条件结构、迭代结构、嵌套的,PL/SQL,块,或是对局部或者存储,PL/SQL,命名块的调用。,异常部分(,exception,),:包含错误处理语句,该语句可以像执行部分一样使用所有项。,结束部分(,END,),:,程序执行到,END,表示结束,分号用户结束块,正斜杠(,/,)执行块程序,2,既没有变量,也没有流程控制(分支、循环)。,PL/SQL,与,SQL,区别:,SQL,PL/SQL,PL/SQL,是结构化和过程化的结合体。,每条,SQL,语句逐一发送给数据库。,一次性将多条,SQL,语言一起发送给数据库,7.1,PL/SQL,简介,3,最简单的,PL/SQL,块可以不做任何事情,但是在,PL/SQL,编程过程中要求,执行块至少要有一条语句,即使这条语句只是编写一个,NULL,也行。,范例:,编写不做任何工作的,PL/SQL,块。,BEGIN,NULL;,END;,/,范例:,编写一个简单的,PL/SQL,程序,DECLARE,v_num number;,BEGIN,v_num:=30;,DBMS_output.put_line(v_num,变量的内容是:,|v_num);,END;,7.1,PL/SQL,简介,4,范例:,编写,PL/SQL,块,输入一个雇员编号,而后取得指定的雇员姓名。,Declare,v_eno number;,v_ename varchar2(10);,Begin,V_eno:=-,由键盘输入雇员编号,Select ename into v_ename from emp where empno=v_eno;,DBMS_OUTPUT.put_line(,编号为,:|v_eno|,雇员的名字为:,|v_ename);,End;,7.1,PL/SQL,简介,5,7.2,变量的声明与赋值,变量声明并使用变量:,变量名称可以有字母、数字、,_,、,$,、,#,等组成。,所有变量名称要求以字母开头,不能是,Oracle,中的保留字,变量的长度最多只能为,30,个字符,变量不区分大小写,6,7.2,变量的声明与赋值,声明变量语法:,变量名称,CONSTANT,类型,not NULL:=value,使用,%TYPE,声明变量类型:,在编写,PL/SQL,程序时,如果希望某一个变量与指定数据表中某一列的类型一样,则可以采用,“变量定义”表名称,.,表名称,%TYPE,的格式,7,7.2,变量的声明与赋值,Declare,v_eno emp.empno%type;,v_ename emp.ename%type;,Begin,DBMS_output.put_line(,请输入雇员编号:,);,v_eno:=,select ename into v_ename from emp where empno=v_eno;,DBMS_output.put_line(,编号为:,|v_eno|,雇员的名字为:,|v_ename);,end;,8,7.2,变量的声明与赋值,使用,%ROWTYPE,声明变量类型,PL/SQL,提供了一种,%ROWTYPE,,使用此标记可以定义表中一行记录的类型。,当用户使用了“,selectinto,”将表中的一行记录设置为,ROWTYPE,类型的变量中时,就可以利用“,rowtype,变量,.,表字段”的方式取得表中每行对应的列数据。,9,7.2,变量的声明与赋值,Declare,v_deptrow dept%rowtype;-,装载一行,dept,记录,Begin,select*into v_deptrow from dept where deptno=10;,DBMS_output.put_line(,部门编号:,|v_deptrow.deptno|,名称:,|v_deptrow.dname|,位置:,|v_deptrow.loc);,End;,10,7.3,标量类型,数值型,标量类型,字符型,日期型,大对象,布尔,11,7.3,标量类型,No.,分类,数据类型,描述,1,数值型,Number(,数据总长度,小数位长度,),Number,是一种表示数字的数据类型。可声明保存数据类型的整数位和小数位的精度,在数据库中是以十进制格式存储,在计算时,系统将其变成二进制数据运算,占,32,字节。,BINARY_INTEGER,不存储在数据库中,只能在,PL/SQL,中使用的带符号整数,范围为,-2,31,-2,31,,如果发生溢出,则自动变为,number,型数据。,2,3,PLS_INTEFER,有符号的整数,范围为,-2,31,-2,31,,可以直接进行数学运算,溢出则触发异常,与,Number,相比,其占空间小,性能好,4,BINARY_FLOAT,单精度,32,位浮点类型,占,5,个字节,5,BINARY_DOUBLE,双精度浮点数类型,占,9,个字节,12,7.3,标量类型,No.,分类,数据类型,描述,12,字符型,RAW,保存固定长度的二进制数据,最多可以存放,2000,个字节的数据,LONG RAW,存储二进制数据(图片、音乐等),最多可以存储,2G,大小数据,13,14,ROWID,数据表中每行记录的唯一物理地址标示,只支持物理行,ID,,不支持逻辑行,ID,15,UROWID,支持物理行,ID,和逻辑行,ID,13,7.3,标量类型,No.,分类,数据类型,描述,16,日期型,DATA,DATA,是一个,7,字节的列,可以保存时期和时间,不包含毫秒,TIMESTAMP,DATA,子类型,包含日期和时间,时间部分包含毫秒,有,TIMESTAMP WITH TIME ZONE,和,TIMESTAMP WITH LOCAL TIME ZONE,17,18,INTERVAL,DATA,的子类型,用于管理时间间隔,有,INTERVAL DAY,TO SECOND,和,INTERVAL YEAR TO MONTH,两种子类型,14,7.3,标量类型,No.,分类,数据类型,描述,19,大对象,CLOB,CLOB,数据类型代表字符型大对象,最大存储,4GB,的字符串数据,NCLOB,存储,UNICODE,编码的大文本数据,最多可以存储,4GB,的非结构化的二进制数据,20,21,BLOB,BLOB,数据类型列可以包含最大,4GB,的非结构化二进制数据,22,BFILE,包含存储在外部文件系统上文件的索引,最大不超过,4GB,23,布尔,BOOLEAN,布尔类型,可以设置的内容为,TRUE,、,FALSE,、,NULL,15,7.4,程序结构,PL/SQL,程序与其他编程语言一样,也拥有自己的,3,中程序结构,即顺序结构、分支结构、循环结构。,开始,语句,1,语句,2,语句,n,结束,顺序结构,判断条件,语句,2,语句,n,结束,语句,1,分支结构,语句,1,语句,2,判断条件,循环结构,16,7.4.1,分支结构,IF,语句,If,语句,IFelse,语句,IFelseifelse,语句,If,判断条件,Then,满足条件执行语句;,End if;,If,判断条件,then,满足条件执行语句;,Else,不满足条件执行语句;,End IF;,If,判断条件,1,then,满足条件,1,执行语句;,Elseif,判断条件,2 then,Else,所有条件不满足执行语句;,END if;,17,7.4.1,分支结构,范例:,查询,emp,表的工资。输入员工编号,根据编号查询工资。如果工资高于,3000,元,则显示高工资;如果工资大于,2000,元则显示中等工资;如果小于,2000,元,则显示低工资。,18,DECLARE,v_empSalemp.sal%TYPE;-,定义变量与,emp.sal,字段类型相同,v_empNameemp.ename%TYPE;-,定义变量与,emp.ename,字段类型相同,v_enoemp.empno%TYPE;-,定义变量与,emp.empno,字段类型相同,BEGIN,v_eno:=-,用户输入要查找的雇员编号,-,根据输入的雇员编号查找雇员姓名及工资,SELECT ename,sal INTO v_empName,v_empSal FROM emp WHERE empno=v_eno;,IF v_empSal 3000 THEN-,判断,DBMS_OUTPUT.put_line(v_empName|,的工资属于高工资!,);,ELSIF v_empSal 2000 THEN-,判断,DBMS_OUTPUT.put_line(v_empName|,的工资属于中等工资!,);,ELSE,DBMS_OUTPUT.put_line(v_empName|,的工资属于低工资!,);,END IF;,END;,7.4.1,分支结构,19,范例:,用户输入一个雇员编号,根据它所在的部门给上涨工资,规则:,10,部门上涨,10%,,,20,上涨,20%,,,30,上涨,30%,;,但是要求最高不能超过,5000,,超过,5000,就停留在,5000,。,7.4.1,分支结构,20,7.4.1,分支结构,DECLARE,v_empSalemp.sal%TYPE;-,定义变量与,emp.sal,字段类型相同,v_dnoemp.deptno%TYPE;-,定义变量与,emp.deptno,字段类型相同,v_enoemp.empno%TYPE;-,定义变量与,emp.empno,字段类型相同,BEGIN,v_eno:=-,用户输入要查找的雇员编号,SELECT deptno,sal INTO v_dno,v_empSal FROM emp WHERE empno=v_eno;,IF v_dno=10 THEN,IF v_empSal*1.1 5000 THEN,UPDATE emp SET sal=5000 WHERE empno=v_eno;,ELSE,UPDATE emp SET sal=sal*1.1 WHERE empno=v_eno;,END IF;,ELSIF v_dno=20 THEN,IF v_empSal*1.2 5000 THEN,UPDATE emp SET sal=5000 WHERE empno=v_eno;,ELSE,UPDATE emp SET sal=sal*1.2 WHERE empno=v_eno;,END IF;,ELSIF v_dno=30 THEN,IF v_empSal*1.3 5000 THEN,UPDATE emp SET sal=5000 WHERE empno=v_eno;,ELSE,UPDATE emp SET sal=sal*1.3 WHERE empno=v_eno;,END IF;,ELSE,null;,END IF;,END;,21,7.4.1,分支结构,CASE,语句,Case,语句是一种多条件的判断语句,其功能与,IFelseifelse,类似,Case,语法:,Case,变量,when,值,|,表达式,THEN,执行语句块;,when,值,|,表达式,THEN,执行语句块;,Else,条件都不满足时执行语块;,End case,22,7.4.1,分支结构,范例:,使用,CASE,进行多条件判断,DECLARE,v_salaryemp.sal%TYPE;,v_enoemp.empno%TYPE;,BEGIN,v_eno:=,SELECT sal INTO v_salary FROM emp WHERE empno=v_eno;,CASE,WHEN v_salary=3000 THEN,DBMS_OUTPUT.put_line(雇员:|v_eno|的收入为高工资。);,WHEN v_salary=2000 AND v_salary=3;,v_i:=v_i+1;,END LOOP;,END;,27,7.4.2,循环结构,范例:,使用,WHILELOOP,循环,DECLARE,v_i NUMBER:=1;-,定义一个变量,用于循环,BEGIN,WHILE(v_i 10 AND v_data 0 THEN-,部门存在,RAISE_APPLICATION_ERROR(-20888,此部门编号已存在,请重新输入!,);,ELSE-,部门不存在,INSERT INTO dept(deptno,dname,loc)VALUES(v_dno,v_dna,v_dloc);,DBMS_OUTPUT.put_line(,新部门增加成功!,);,COMMIT;,END IF;,EXCEPTION,WHEN others THEN,DBMS_OUTPUT.put_line(SQLERRM);,ROLLBACK;,END;,范例:,使用,PL/SQL,增加部门信息,39,
展开阅读全文