当前位置: 代码迷 >> SQL >> Oracle pl/sql块范例
  详细解决方案

Oracle pl/sql块范例

热度:55   发布时间:2016-05-05 11:03:57.0
Oracle pl/sql块实例

??1、pl/sql块包括三个部分,定义部分,执行部分,异常处理部分,以下是一个例子:

declare

?--定义变量(可选)

??v_name?varchar2(20);

??v_sal?number;

?begin

??--执行部分

??select?name,sal?into?v_name,v_sal?from?user1?where?id=2;

??dbms_output.put_line('查询到的用户名为:'||v_name);

??--异常处理(可选)

?exception

??when?no_data_found?then

????dbms_output.put_line('查询不到制定的用户');

?end;

2、存储过程示例:

(1)创建一个名称为prc_user 的不带参数的存储过程:

?

?create?or?replace?procedure?prc_user?is

?begin

?update?user1?set?sal=11?where?id=1;

?end;

对应的java代码调用如下:

?

import java.sql.*;public class DB {	public static void main(String[] args) {		try {			//1.加载驱动			Class.forName("oracle.jdbc.driver.OracleDriver");			//2.建立数据库连接			Connection con=DriverManager.getConnection(					"jdbc:oracle:thin:@127.0.0.1:1521:orcl","cxq", "cxq123");			//3.创建CallableStatement		    CallableStatement cst=con.prepareCall("{call prc_user}");		    //4.执行		    cst.execute();		    //4.关闭		    cst.close();		    con.close();		} catch (Exception e) {			e.printStackTrace();?		}	}}

?

(2)创建一个名称为prc_user1 的带输入参数的存储过程:

?create?or?replace?procedure?prc_updateUserSal(userId?IN?number,newSal?IN?number)

?is

?begin

?update?user1?set?sal=newSal?where?id=userId;

?end;

注意:输入参数IN是可以省略的,默认就是IN。

对应的java代码调用如下:

??

import java.sql.*;public class DB {	public static void main(String[] args) {		try {			//1.加载驱动			Class.forName("oracle.jdbc.driver.OracleDriver");			//2.建立数据库连接			Connection con=DriverManager.getConnection(					"jdbc:oracle:thin:@127.0.0.1:1521:orcl","cxq", "cxq123");			//3.创建CallableStatement		    CallableStatement cst=con.prepareCall("{call prc_updateUserSal(1,3500)}");		    		    /*或者这样		    3.创建CallableStatement		    CallableStatement cst=con.prepareCall("{call prc_updateUserSal(?,?)}");		    cst.setInt(1, 1);		    cst.setInt(2, 3500);		    */		    //4.执行		    cst.execute();		    //4.关闭		    cst.close();		    con.close();		} catch (Exception e) {			e.printStackTrace();		}	}}

?

(3)创建一个名称为prc_user2 的带输入参数和输出参数的存储过程:

create?or?replace?procedure?prc_getUserSal(userId?IN?number,userSal?OUT?number)?is

begin

select?sal?into?userSal?from?user1?where?id=userId;

end;

对应的java代码调用如下:

3、函数示例:

(1)输入用户的姓名,返回用户的年薪:

create?or?replace?function?f_getUserYearSal(userName?varchar2)?return?number

as

yearSal?number;

begin

??select?sal*12?into?yearSal?from?user1?where?name=userName;

??return?yearSal;

end;

在命令行中调用函数如下:

SQL>?var?yearSal?number;

SQL>?call?f_getUserYearSal('cxq')?into:yearSal;

返回结果:

Method?called

yearSal

---------

60000

如果没返回就打印变量:

SQL>?print?yearSal;?

会返回结果:

yearSal

---------

60000

对应的java代码调用如下:
import java.sql.*;public class Test {	public static void main(String[] args) {		try {			//1.加载驱动			Class.forName("oracle.jdbc.driver.OracleDriver");			//2.建立数据库连接			Connection con=DriverManager.getConnection(					"jdbc:oracle:thin:@127.0.0.1:1521:orcl","cxq", "cxq123");			//3.创建PreparedStatement			String sqlStr="select f_getUserYearSal(?) from dual";		    PreparedStatement psmt=con.prepareStatement(sqlStr);		    psmt.setString(1, "cxq");		    //4.执行查询		    ResultSet rs=psmt.executeQuery();		    //5.处理结果集		    while(rs.next()){		    	int yearSal=rs.getInt(1);		    	System.out.println("用户cxq的年薪为"+yearSal);		    }		    //6.关闭		    psmt.close();		    con.close();		} catch (Exception e) {			e.printStackTrace();		}	}}

??

  相关解决方案