Java调用存储过程

Java调用存储过程

 * 调用存储过程和存储函数前过程和函数都需要先编译成功
 * 调用存储过程和存储函数都是用CallableStatement
 * 调用存储过程的sql语法格式:{call <procedure-name>[(<arg1>,<arg2>,...)]}
 * 调用存储函数的sql语法格式:{?=call <procedure-name>[(<arg1>,<arg2>,...)]}
 *                          ?:表示是返回值,且只有一个,存储函数只能有一个返回值
  • 调用存储过程
     测试调用存储过程
           -- 存储过程返回多个值
       -- 查询某个员工的姓名,职位和月薪
       create or replace procedure queryEmpInfo(eno    in  number,
                                                pename out varchar2,
                                                pjob   out varchar2,
                                                psal   out number)
       as
       begin
         select ename,empjob,sal into pename,pjob,psal from emp where empno = eno;
       end;
       如上存储过程在Java调用时只需看创建语句就可以了,存储函数也是一样
       @Test
   public void testProcedures() {
       // {call <procedure-name>[<arg1>,<arg2>,...]}
       String sql = "{call queryEmpInfo(?,?,?,?)}";
       Connection conn = null;
       CallableStatement call = null;
       try {
           conn = JDBCUtils.getConnection();
           call = conn.prepareCall(sql);
           // 对于in参数,赋值
           call.setInt(1, 7839);// 1:表示第一个?号
           // 对于out参数,声明
           call.registerOutParameter(2, OracleTypes.VARCHAR);
           call.registerOutParameter(3, OracleTypes.VARCHAR);
           call.registerOutParameter(4, OracleTypes.NUMBER);
           // 执行调用
           call.execute();
           // 调用完就有返回值了,取出返回值
           String name = call.getString(2);
           String job = call.getString(3);
           double sal = call.getDouble(4);
           System.out.println(name + "\t" + job + "\t" + sal);
       } catch (SQLException e) {
           e.printStackTrace();
       } finally {
           JDBCUtils.release(conn, call, null);
       }
   }
  • 调用存储函数
/**
     * 测试调用存储函数
     *  -- 存储函数
        -- 查询某个元的年收入
        create or replace function queryEmpTotalSal(eno in number)
        return number -- 定义返回类型
        as
          -- 月薪和奖金
          psal emp.sal%type;
          pcomm emp.comm%type;
        begin
          -- 得到月薪和奖金
          select sal,comm into psal,pcomm from emp where empno = eno;
          -- 返回年收入
          return psal * 12 + nvl(pcomm,0);-- 奖金可能为null
        end;
     */
    @Test
    public void testFunction() {
        // {?=call <procedure-name>[(<arg1>,<arg2>,...)]}
        String sql = "{?=call queryEempTotalSal(?)}";
        // 这里第一个 ? 就相当于 out 参数,第二个 ? 就相当于 in 参数
        Connection conn = null;
        CallableStatement call = null;
        try {
            conn = JDBCUtils.getConnection();
            call = conn.prepareCall(sql);
            // 对于out参数,声明
            call.registerOutParameter(1, OracleTypes.NUMBER);
            // 对于in参数,赋值
            call.setInt(2, 7839);
            // 执行调用
            call.execute();
            // 取出返回结果
            double totalSal = call.getDouble(1);
            System.out.println("7839号员工的年收入为:" + totalSal);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(conn, call, null);
        }
  • cursor作为out参数返回

     /**
      测试返回一个list集合,使用cursor作为out参数
      例:查询某个部门所有员工的所有信息
     */
    @Test
    public void testCursor() {
        // 此查询其实就是调用存储过程,因此语法是一样。{call <procedure-name> [(<arg1>,<arg2>,...]}
        // 但是要加上调用方法所在的包名,如下
        String sql = "{call testOutByCursor.queryEmpList(?,?)}";
        Connection conn = null;
        CallableStatement call = null;
        ResultSet resultSet = null;
        try {
            conn = JDBCUtils.getConnection();
            call = conn.prepareCall(sql);
            // 赋值,输入查询的部门
            call.setInt(1, 10);// 查10号部门
            // 申明out参数
            call.registerOutParameter(2, OracleTypes.CURSOR);
            // 执行
            call.execute();
            // 得到结果,此时要将call转成Oracle的CallableStatement
            resultSet = ((OracleCallableStatement) call).getCursor(2);
            while (resultSet.next()) {
                int empNo = resultSet.getInt("empno");
                String name = resultSet.getString("ename");
                String job = resultSet.getString("empjob");
                int mgr = resultSet.getInt("mgr");
                Date hireDate = resultSet.getDate("hiredate");
                double sal = resultSet.getDouble("sal");
                double comm = resultSet.getDouble("comm");
                int deptno = resultSet.getInt("deptno");
                System.err.println(empNo + "  " + name + "  " + job + "  " + mgr
                        + "  " + hireDate.toString() + "  " + sal + "  " + comm
                        + "  " + deptno + "  ");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(conn, call, resultSet);
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,603评论 18 399
  • 步骤1:在存储过程里返回错误代码 return error codeRAISERROR(" message ", ...
    专职跑龙套阅读 1,082评论 0 0
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,176评论 9 118
  • 公仔最近不开心,因为他太累了。 他的身份太多:有抱负的男人,贴心的未婚夫,成功的儿子,想讨老丈人丈母娘喜欢的女婿,...
    小竹子宝宝阅读 188评论 0 0
  • 关关雎鸠,在河之洲。 窈窕淑女,君子好逑。 参差荇菜,左右流之。 窈窕淑女,寤寐求之。 求之不得,寤寐思服。 悠哉...
    w影子w阅读 158评论 0 5