oracle存储过程学习(一)

             最近几次出去面试,经常被问及项目中用到过存储过程没。从工作到现在,大大小小的项目几乎都是用的oracle,存储过程肯定是用的。但是呢,自己涉及的模块又都是没有存储过程,也或者有DBA在操作,接触不到,自然而然的说不知道了。于是下定决心一定要把oracle存储过程给补习下。

        PS:oracle有好多概念,像视图、索引、触发器、物化视图、游标、函数、包等。后续也会督促自己去学习,并总结整理出来。

       本文举例内容描述:

            实例: 根据dept_id查询属于此部门的雇员信息。

            分析: oracle存储过程本没有返回值,有返回值也是用out关键字来标示。但是像对于根据部门查询雇员的,会返回多条记录。所以此时可以建立一个package,即cursor游标。

            pl/sql:

                --1 建立一个package
    create or replace package testpackage as 
    TYPE test_cursor is ref cursor;
   end testpackage;

   --2 建立存储过程
    create or replace procedure findAllEmp
    (deptno in number,
p_cursor out testpackage.test_cursor)
   is
    begin
   open p_cursor forselect e.* from employees e where e.department_id = deptno;
    end findAllEmp;

         --注意蓝字部分的写法格式

            java调用:

(1)db工具类

                      package com.oracle.exe;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBUtil {
private static final String DRIVER = "oracle.jdbc.OracleDriver";
private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
private static final String USERNAME = "hr";
private static final String PASSWORD = "hr";

private static DBUtil dbUtil = null;

private DBUtil()
{

}
public static synchronized DBUtil getInstance()
{
if(dbUtil==null)
{
dbUtil = new DBUtil();
}
return dbUtil;
}
/**
*
* @return
*/
public static Connection getConn()
{
Connection conn = null;
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}

/**
*
* @param conn
*/
public void colseConn(Connection conn)
{
if(conn!=null)
{
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

public static void main(String[] args) {
System.out.println(DBUtil.getConn());
}
}

        (2)调用过程

package com.oracle.exe;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

public class CallProcedure {

private static Connection conn = DBUtil.getConn();


public static void main(String[] args) {
CallProcedure.callCursorProcedure();
}
/**
*
*/
public static void callCursorProcedure()
{
try {
CallableStatement call = conn.prepareCall("{ call findAllEmp (?,?)}");
call.setInt(1, 60);

//注册输出参数的类型
call.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);

call.execute();

ResultSet rs = (ResultSet)call.getObject(2);

//遍历结果集
while(rs.next())
{
System.out.println(rs.getInt(1)+" "+rs.getString(2));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}


       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值