oracle中pl/sql编程(四):

本文介绍了 Oracle 数据库中 PL/SQL 的存储过程创建及不同类型的存储过程(无返回值、有返回值、返回结果集)。同时提供了使用 Java 程序调用这些存储过程的具体示例。
补充一下上次博客的一些知识点:
for循环:(用的不多,作了解)



基本结构:
begin 
  for i in reverse 1...10 loop
  insert into users values(i,'张三');
  end loop;
end;


控制变量i,在隐含中就在不停的增加


oracle中pl/sql编程(四):


下面的案例所有的表都需要提前创建好
--案例:无返回值的存储过程
编写一个过程,可以向book表添加书,要求通过java程序调用该过程


create or replace procedure sp_pro9(spBookId in number,spBookName in varchar2,spPublisher in varchar2) is
begin
insert into book values(spBookId,spBookName,spPublisher);
end;


java程序:
package javastudy;


//无返回值的存储过程
import java.sql.*;
public class Testit1 {


public static void main(String[] args) {
 
        try {
         //加载驱动程序
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //得到链接
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","lh621366");
        CallableStatement cs = conn.prepareCall("{call sp_pro10(?,?)}");//这里不支持exec这种调用模式
        cs.setInt(1, 7788);
        cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);//这里的类型取决于上面第二个问号值的类型,暂时给第二个问号传递一个输出参数
        
        //创建CallableStatement
        CallableStatement cs = conn.prepareCall("{call sp_pro9(?,?,?)}");
        //给?赋值
        cs.setInt(1, 10);
        cs.setString(2, "大卫");
        cs.setString(3, "中华人民出版社");
        //执行一下语句
        cs.execute();
        conn.close();
        cs.close();

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}


}


--案例:有返回值的存储过程
编写一个过程,可以输入雇员的编号,返回该雇员的姓名


create or replace procedure sp_pro10(spno in number,spName out varchar2) is
begin
select ename into spName from emp where spno=empno;
end;




对应的java程序:
package javastudy;


//无返回值的存储过程
import java.sql.*;
public class Testit1 {


public static void main(String[] args) {
 
        try {
         //加载驱动程序
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //得到链接
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","lh621366");
        CallableStatement cs = conn.prepareCall("{call sp_pro10(?,?)}");//这里不支持exec这种调用模式
        cs.setInt(1, 7788);
        cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);//这里的类型取决于上面第二个问号值的类型,暂时给第二个问号传递一个输出参数
    //执行一下语句
        cs.execute();
        //根据序号得到名字
        String name = cs.getString(2);
        //输出名字
        System.out.println("7788序号所对应的名字为:"+name);
        //关闭资源
        conn.close();
        cs.close();

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}


}


        








--案例:返回值为结果集的存储过程:



编写一个过程,输入部门号,返回该部门所有雇员信息


--分两步,先创建包,然后创建存储过程


--创建包
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;


--再来创建存储过程
create or replace procedure sp_pro11(spno in number,sp_cursor out testpackage.test_cursor) is
begin
open sp_cursor for select * from emp where deptno=spno;
end;


对应的java程序:
package javastudy;


import java.sql.*;


public class Test2 {


public static void main(String[] args) {


try {
// 加载驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
// 得到链接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "lh621366");
CallableStatement cs = conn.prepareCall("{call sp_pro11(?,?)}");// 这里不支持exec这种调用模式
            cs.setInt(1, 10);
            cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(2);
            while(rs.next())
            {
            System.out.println("用户名为:"+rs.getString(2));
            }
            conn.close();
            cs.close();
} catch (Exception e) {


}


}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弗兰随风小欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值