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