Oracle存储过程的调用

来源:互联网 发布:linux mysql设定字符集 编辑:程序博客网 时间:2024/04/28 23:28

Oracle 表的语句

  create table student(sid int,sname varchar(20),sno int)

一:无返回值的存储过程

 create or replace procedure proc_student(para1 Integer, para2 varchar2, para3 Integer)
 is

 

BEGIN
 insert into student(sid,snam,sno) values (para1,para2,para3);
end ;

 

 

 

 

public class TestProcedureOne {


 public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
 public static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
 public static final String USERNAEM = "system";
 public static final String PASSWORD = "123";

 public static void main(String[] args)

{

  ResultSet rs = null;
  Connection conn = null;
  CallableStatement proc = null;
  try {
   Class.forName(DRIVER);
   conn = DriverManager.getConnection(URL, USERNAEM, PASSWORD);

   proc = conn.prepareCall("{call system.testc(?,?,?)}");//这里不是PreparedStatement接口,而是调用存储过程的接口

   proc.setInt(1, 1);
   proc.setString(2, "zhangsan");
   proc.setInt(3, 2);//这里的参数是根据sql语句的顺序来的
   proc.execute();

  } catch (SQLException ex2) {
   ex2.printStackTrace();

  } catch (Exception ex2) {
   ex2.printStackTrace();
  } finally {
   try {
    if (rs != null) {
     rs.close();
     if (proc != null) {
      proc.close();
     }
     if (conn != null) {
      conn.close();
     }
    }
   } catch (SQLException ex1) {
   }
  }
 }
}

二:有返回值的存储过程(非列表)

  create or replace procedure proc_student2(para_1 Integer,para_2 out varchar2, para_3 out

  Integer)
   is
 begin
  select snam,sno into para_2,para_3 from student where sid =  para_1;
 end proc_student2 ;

 

 java的主要代码如下

 proc = conn.prepareCall("{call system.proc_student2(?,?,?)}");

   proc.setInt(1, 1);
   proc.registerOutParameter(2, Types.VARCHAR);//输出参数的类型
   proc.registerOutParameter(3, Types.INTEGER);
   proc.execute();
   System.out.println(proc.getString(2)+proc.getInt(3));

 

三:返回列表

由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,

1, 建一个程序包。如下:

 create or replace package package_1

as

type test_cursor is ref cursor;

end package_1;

2,建立存储过程,存储过程为:

create or replace prcedure proc_student3(stu_cursor out package_1.test_cursor) is

begin

 open stu_cursor for select * from system.student

end

可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。

 java的主要代码如下

 

   proc = conn.prepareCall("{call system.proc_student3(?)}");
   proc.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
   proc.execute();
   rs = (ResultSet) proc.getObject(1);
   while(rs.next()){
    System.out.println(rs.getInt(1)+rs.getString(2)+rs.getInt(3));
   
   }

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/surpassdream/archive/2009/09/25/4592281.aspx

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 查不到全国学籍怎么办 六福的会员卡怎么办 夏天小腿皮肤痒怎么办 夏天皮肤容易痒怎么办 夏天身上老是痒怎么办 龙虾塘没水草怎么办 龙虾塘水草太多怎么办 电脑卡死黑屏怎么办 手机进入游戏时闪退怎么办? lol画面卡住了怎么办 PLSQL DEV未响应怎么办 英雄联盟载入慢怎么办 玩英雄联盟黑屏怎么办 电脑玩lol死机怎么办 输入不支援黑屏怎么办 一加玩游戏登录不了怎么办 网络连接错误711怎么办 电脑网络错误651怎么办 打游戏内存不够怎么办 电脑超频后黑屏怎么办 玩lol显示器超频怎么办 win10显示器超频黑屏怎么办 电脑开机显示超频怎么办 玩英雄联盟网卡怎么办 英雄联盟超屏怎么办 三星手机基带未知怎么办 显卡进桌面黑屏怎么办 电脑开机黑屏怎么办打开 ap黑屏打不开了怎么办 老人机屏幕变黑怎么办 电脑一直弹网页怎么办 电脑一直跳网页怎么办 电脑网页一直转圈怎么办 消费者联盟闪退怎么办 门卡住了打不开怎么办 悦平台出现bug怎么办 lol开不了全屏怎么办 韩服lol忘记密码怎么办 股票交易密码忘记了怎么办 指纹解锁密码忘记怎么办 玩lol美服有延迟怎么办