??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(); } }}
??