sql是用于访问oracle数据库的语言,pl/sql扩展和加强了sql的功能,它同时引入了更强的程序逻辑。 pl/sql支持dml命令和sql的事务控制语句。ddl在pl/sql中不被支持,这就意味作在pl/sql程序块中不能创建表或其他任何对象。较好的pl/sql程序设计是在pl/sql块中使用象dbms_sql这样的内建包或执行execute immediate命令建立动态sql来执行ddl命令,pl/sql编译器保证对象引用以及用户的权限。下面我们将讨论各种用于访问oracle数据库的ddl和tcl语句。
查询
select语句用于从数据库中查询数据,当在pl/sql中使用select语句时,要与into子句一起使用,查询的返回值被赋予into子句中的变量,变量的声明是在delcare中。select into语法如下:
| select [distictall]{*column[,column,...]} into (variable[,variable,...] record) from {table(sub-query)}[alias] where............ |
| v_empno scott.emp.empno%type; v_salary emp.salary%type; |
| delcare v_a number(5):=10; v_b v_a%type:=15; v_c v_a%type; begin dbms_output.put_line (v_a=v_av_b=v_bv_c=v_c); end sql>/ v_a=10 v_b=15 v_c= pl/sql procedure successfully completed. sql> |
| create or replace procedure fire_employee (pempno in number) as v_ename emp.ename%type; begin select ename into v_ename from emp where empno=p_empno; insert into former_emp(empno,ename) values (p_empno,v_ename); delete from emp where empno=p_empno; update former_emp set date_deleted=sysdate where empno=p_empno; exception when no_data_found then dbms_output.put_line(employee number not found!); end |
dml语句的结果
当执行一条dml语句后,dml语句的结果保存在四个游标属性中,这些属性用于控制程序流程或者了解程序的状态。当运行dml语句时,pl/sql打开一个内建游标并处理结果,游标是维护查询结果的内存中的一个区域,游标在运行dml语句时打开,完成后关闭。隐式游标只使用sql%found,sql%notfound,sql%rowcount三个属性.sql%found,sql%notfound是布尔值,sql%rowcount是整数值。
sql%found和sql%notfound
在执行任何dml语句前sql%found和sql%notfound的值都是null,在执行dml语句后,sql%found的属性值将是:
. true :insert
. true :delete和update,至少有一行被delete或update.
. true :select into至少返回一行
当sql%found为true时,sql%notfound为false。
sql%rowcount
在执行任何dml语句之前,sql%rowcount的值都是null,对于select into语句,如果执行成功,sql%rowcount的值为1,如果没有成功,sql%rowcount的值为0,同时产生一个异常no_data_found.
sql%isopen
sql%isopen是一个布尔值,如果游标打开,则为true, 如果游标关闭,则为false.对于隐式游标而言sql%isopen总是false,这是因为隐式游标在dml语句执行时打开,结束时就立即关闭。
事务控制语句
事务是一个工作的逻辑单元可以包括一个或多个dml语句,事物控制帮助用户保证数据的一致性。如果事务控制逻辑单元中的任何一个dml语句失败,那么整个事务都将回滚,在pl/sql中用户可以明确地使用commit、rollback、savepoint以及set transaction语句。
commit语句终止事务,永久保存数据库的变化,同时释放所有lock,rollback终止现行事务释放所有lock,但不保存数据库的任何变化,savepoint用于设置中间点,当事务调用过多的数据库操作时,中间点是非常有用的,set transaction用于设置事务属性,比如read-write和隔离级等。
显式游标
当查询返回结果超过一行时,就需要一个显式游标,此时用户不能使用select into语句。pl/sql管理隐式游标,当查询开始时隐式游标打开,查询结束时隐式游标自动关闭。显式游标在pl/sql块的声明部分声明,在执行部分或异常处理部分打开,取数据,关闭。下表显示了显式游标和隐式游标的差别:
表1 隐式游标和显式游标
| 隐式游标 | 显式游标 |
| pl/sql维护,当执行查询时自动打开和关闭 | 在程序中显式定义、打开、关闭,游标有一个名字。 |
| 游标属性前缀是sql | 游标属性的前缀是游标名 |
| 属性%isopen总是为false | %isopen根据游标的状态确定值 |
| select语句带有into子串,只有一行数据被处理 | 可以处理多行数据,在程序中设置循环,取出每一行数据。 |
使用游标
这里要做一个声明,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情况,我们所说的游标都是指显式游标。要在程序中使用游标,必须首先声明游标。
声明游标
语法:
| cursor cursor_name is select_statement; |
| delcare cursor c_emp is select empno,ename,salary from emp where salary>2000 order by ename; ........ begin |
| open cursor_name |
| open c_emp; |
| close cursor_name |
| close c_emp; |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器