器中的SQL语句执行器处理pl/sql程序块中的SQL语句。 PL/SQL的优点如下: . PL/SQL是一种高性能的基于事务处理的语言,能运行在任何ORACLE环境中,支持所有数据处理命令。通过使用PL/SQL程序单元处理SQL的数据定义和数据控制元素。 . PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有ORACLE对象类型 . PL/SQL块可以被命名和存储在ORACLE服务器中,同时也能被其他的PL/SQL程序或SQL命令调用,任何客户/服务器工具都能访问PL/SQL程序,具有很好的可重用性。 . 可以使用ORACLE数据工具管理存储在服务器中的PL/SQL程序的安全性。可以授权或撤销数据库其他用户访问PL/SQL程序的能力。 . PL/SQL代码可以使用任何ASCII文本编辑器编写,所以对任何ORACLE能够运行的操作系统都是非常便利的 . 对于SQL,ORACLE必须在同一时间处理每一条SQL语句,在网络环境下这就意味作每一个独立的调用都必须被oracle服务器处理,这就占用大量的服务器时间,同时导致网络拥挤。而PL/SQL是以整个语句块发给服务器,这就降低了网络拥挤。 PL/SQL块结构 PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL 程序包含了一个或多个逻辑块,每个块都可以划分为三个部分(生命部分,执行部分,异常处理部分)。与其他语言相同,变量在使用之前必须声明,PL/SQL提供了独立的专门用于处理异常的部分,下面描述了PL/SQL块的不同部分: 声明部分(Declaration section) 声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分;需要说明的是游标的声明也在这一部分。 执行部分(Executable section) 执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。 异常处理部分(Exception section) 这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细讨论我们在后面进行。 PL/SQL块语法 [DECLARE] ---declaration statements BEGIN ---executable statements [EXCEPTION] ---exception statements END PL/SQL块中的每一条语句都必须以分号结束,SQL语句可以使多行的,但分号表示该语句的结束。一行中可以有多条SQL语句,他们之间以分号分隔。每一个PL/SQL块由BEGIN或DECLARE开始,以END结束。注释由--标示。 Oracle中过程介绍 oracle中的过程是一种命名的快,存储在oracle数据库中,相当于sql server中的存储过程。 下面是一个过程的定义: create or replace procedure query_emp--先删除重名的,后新建 ( v_no in emp.empno%type,--该参数是接受外来实参赋值的(in) v_name out emp.ename%type,--该参数是在过程内部赋值的(out) v_sal out emp.sal%type--该参数是在过程内部赋值的(out) ) is e_sal_error exception;--声明了一个异常 begin select ename,sal into v_name,v_sal from emp where empno=v_no; if v_sal >2500 then dbms_output.put_line('雇员工资'||v_sal); raise e_sal_error; else null; end if; exception when no_data_found then dbms_output.put_line('该雇员不存在'); when e_sal_error then dbms_output.put_line('该雇员工资高于2500了'); end query_emp; 过程的调用: a.在sql*plus中: SQL> variable a1 nvarchar2(16); SQL> variable a2 number; SQL> execute query_emp(7788,:a1,:a2); b.在其他pl/sql块中 declare v_al emp.ename%type; v_a1 emp.sal%type; begin query_emp(v_ename=>v_al,v_sal=>v_a1,v_no=>5678); end; 我们创建的过程都是存放在数据字典中的,可以用以下语句来查询我们创建好的块: select * from user_source where name='QUERY_EMP'; 将过程的执行权限授予其他用户: Grant execute procname to username; 删除过程: Drop procedure procname; Oracle中函数的介绍 函数和过程一样也是一种命名的块,其主要作用是返回值 如: create or replace function get_salary_by_deptno ( v_dept_no in emp.deptno%type,--输入部门号 v_emp_cnt out number--输出部门人数 ) return number is Result number;--要返回的工资总数 begin select sum(sal),count(*) into Result,v_emp_cnt from emp where deptno =v_dept_no; return(Result); end get_salary_by_deptno; 在sql中调用函数以及在PL/SQL中调用函数和调用过程是一样的,只不过是调用函数必须放在表达式中: 删除函数 drop function get_salary_by_deptno Oracle游标介绍 简单说,Oracle游标提供了以一种对多行数据的查询结果集中的每行数据单独处理的方式,是设计交互式应用程序常用的编程接口。 游标分为显示游标和隐式游标,隐式游标是oracle提供的游标,显示游标是用户自定义的游标。 游标的使用步骤: 1)声名游标 2)打开游标 3)提取游标 4)关闭游标 使用游标的几种方式 1.一般调用方式 declare cursor c1(v_ss nvarchar2)--声名了一个个带参数的游标 is select * from stu where ss=v_ss;--游标的select语句 v_stu c1%rowtype;--基于游标定义的变量,可以存储游标取出的每一行数据 begin open c1(224); loop fetch c1 into v_stu; exit when c1%notfound; dbms_output.put_line('name'||v_stu.name||' '||'ss'||v_stu.ss); end loop; close c1; end Cursor1; 拓展:(过程中使用游标) create or replace procedure Cursor1 ( v_ss nvarchar2 ) is cursor c1 is select * from stu where ss=v_ss; v_stu c1%rowtype; begin open c1; loo |