pl/sql编程实例:
1. 只包括执行部分的pl/sql块
set serveroutput on;打开输出选项
begin dbms_output.put_line(‘hello’);end;
dbms_output是oracle所提供的包(类似Java的开发包), 该包包含一些过程,put_line就是该包的一个过程。
2.包含定义部分和执行部分的pl/sql块
declare v_ename varchar2(5);--定义字符串变量 v_sal number(7,2);--定义number类型的变量表示工资 begin select ename,sal into v_ename,v_sal from emp where empno=&no; dbms_output.put_line(‘雇员名:’||v_ename||’ 工资:’||v_sal); end;
&表示接收从控制台 输入的变量
3. 包含定义部分、执行部分、例外处理部分
为了避免pl/sql程序运行错误,提高健壮性,应该对可能的错误进行处理,这个很有必要
a. 比如在上面的例子中,如果输入了不存在的雇员号,应当做例外处理
b. 有时出现异常,希望用另外的逻辑处理
另外,oracle预先定义了一些例外,no_data_found就是找不到数据的例外
declare v_ename varchar2(5);--定义字符串变量 v_sal number(7,2);--定义number类型的变量表示工资 begin select ename,sal into v_ename,v_sal from emp where empno=&no; dbms_output.put_line(‘雇员名:’||v_ename||’ 工资:’||v_sal); exception when no_data_found then dbms_output.put_line(‘朋友,你输入的编号有误’); end;
过程
过程用于执行特定的操作。当建立过程时,既可以指定输入(in)参数,也可以指定输出(out)参数,通过在过程中使用输入参数,可以将数据传递到执行部分,通过使用输出参数,可以将执行部分的数据传递到应用环境。在sqlplus中可以用create procedure命令来建立过程
SQL> create procedure morf_pro1(empName varchar2,newSal number) is 2 begin 3 update emp set sal=newSal where ename=empName; 4 end; 5 /SQL> call morf_pro1('SCOTT',3003);
其实,过程如果是在sqlplus中调用意义就不大了,主要是在程序中,如下例子,是在Java程序中调用。
首先我这有一个book表:
SQL> desc book;
Name Type Nullable Default Comments
------------ ------------ -------- ------- --------
BOOKID NUMBER Y
BOOKNAME VARCHAR2(50) Y
PUBLISHHOUSE VARCHAR2(50) Y
然后我写了一个过程,用于向表中插入一条数据:
create or replace procedure insert1book(mbookId in number,mbookName in varchar2,mpublishHouse in varchar2) isbegininsert into book values(mbookId,mbookName,mpublishHouse);end;
下面给出调用的Java程序:
//调用一个没有返回值的存储过程package com.morflame;import java.sql.*;public class Test1 { public static void main(String[] args) { try { Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger"); CallableStatement cs=conn.prepareCall("{call insert1book(?,?,?)}"); cs.setInt(1, 10); cs.setString(2, "笑傲江湖"); cs.setString(3, "人民出版社"); cs.execute(); cs.close(); conn.close(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句,而在函数体内必须包含return语句返回的数据。我们可以使用create function来建立函数。
--函数:得到某个人的年薪create function morf_fun1(name varchar2) return number isyearSal number(7,2);beginselect sal*12+nvl(comm,0)*12 into yearSal from emp where ename=name;return yearSal;end;
再给出一个简单例子:
package morflame;import java.sql.*;public class TestOraPro1 { public static void main(String[] args) { // TODO Auto-generated method stub String driver="oracle.jdbc.driver.OracleDriver"; String dburl="jdbc:oracle:thin:@localhost:1521:orcl"; String dbuser="scott"; String dbpass="tiger"; Connection conn=null; Statement stmt=null; ResultSet rs=null; CallableStatement cs=null;//准备CallableStatement对象来调用过程 try { Class.forName(driver); conn=DriverManager.getConnection(dburl,dbuser,dbpass); cs=conn.prepareCall("{call morf_pro1(?,?)}"); cs.setString(1, "SCOTT"); cs.setInt(2,999); cs.execute(); cs.close(); stmt=conn.createStatement(); rs=stmt.executeQuery("select morf_fun1('SCOTT') from dual"); if(rs.next()) System.out.println(rs.getInt(1)); rs.close(); stmt.close(); conn.close(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
在sqlplus中调用函数
var income number;
call morf_fun1(‘scott’) into:income;
print income;
不过这个方法实在是没啥用处……