Spring 调用 Store Procedure 并获取返回值

简述

Store Procedure 叫做存储过程(简称SP),类似于 Java 中的函数,包含一些 sql 语句集,完成相应的功能,并且也有 输入(IN)和 输出(OUT)。

创建 SP

  1.无 输出(OUT)参数 

create or replace PROCEDURE SP_TEST_1(
     inPara1 IN  NUMBER,     -- 输入参数
     inPara2 IN  VARCHAR2
 )  is
  V_CURR_TIME              TIMESTAMP(6);
BEGIN
    SELECT SYSTIMESTAMP INTO V_CURR_TIME FROM DUAL;
           .
           .
           .
EXCEPTION WHEN OTHERS THEN
    dbms_output.PUT_LINE(‘Error‘);
END SP_TEST_1;
/
-- 赋给角色需要的权限
GRANT EXECUTE ON SP_TEST_1 TO read;
GRANT EXECUTE ON SP_TEST_1 TO write;
/

 2.有 输出(OUT)参数

create or replace PROCEDURE SP_TEST_2(
     inPara1 IN  NUMBER,          -- 输入参数
     inPara2 IN  VARCHAR2,
     outPara1 OUT VARCHAR2      -- 输出参数
 )  is
  V_CURR_TIME              TIMESTAMP(6);
BEGIN
    SELECT SYSTIMESTAMP INTO V_CURR_TIME FROM DUAL;
           .
           .
           .
EXCEPTION WHEN OTHERS THEN
    dbms_output.PUT_LINE(‘Error‘);
END SP_TEST_2;
/
-- 赋给角色需要的权限
GRANT EXECUTE ON SP_TEST_2 TO read;
GRANT EXECUTE ON SP_TEST_2 TO write;
/

调用 SP

Spring 有很多方法可以调用 Oracle 的 procedure,原来我一直用

getJdbcTemplate().update("{call SP_TEST_1(?, ?)}", new Object[] { inPara1, inPara2 });

在 procedure 没有 OUT 输出的时候这样做很方便,但是当要获取 OUT 输出时,这种方法就不灵了。

getJdbcTemplate().update("{call SP_TEST_2(?, ?, ?)}", new Object[] { inPara1, inPara2, outPara});

虽然 SP可以正常被调用执行,但是却不能获得 SP 返回的输出参数 outPara。

这时,可以用另一种方法:

public String invokeSPTest(final Long inPara1, final String inPara2) {  String outResult = "";
  try {
    outResult = (String) getJdbcTemplate().execute( new ConnectionCallback(){
       @Override
       public Object doInConnection(Connection con) throws SQLException, DataAccessException {
           CallableStatement  callableSt = con.prepareCall("{call SP_TEST_2(?, ?, ?)}");
           callableSt.setLong(1, inPara1);        callabelSt.setString(2, inPara2);
           callableSt.registerOutParameter(3, Types.VARCHAR);
           callableSt.executeUpdate();
           return callableSt.getString(3);
          }
       });
  } catch (CannotGetJdbcConnectionException e) {
    e.printStackTrace();
  }
  return outResult;}

参考资料

时间: 2024-08-28 12:15:12

Spring 调用 Store Procedure 并获取返回值的相关文章

在批处理中调用VBScript(支持获取返回值)

有个帖子简单介绍了利用mshta来调用vbs的方法(链接).虽该文章作者认为 到此,在bat中使用vbs得到了完全解决.从此可以在bat和vbs间自由的航行了. 但任然无法获取vbs的返回值,可见该方法有一定缺陷.于是写出该帖子来补充一下下~先不看这个缺陷,原调用代码的html标签也可以不要(lz最早是看见zhonghua兄使用该方法) Mshta Vbscript:VBS命令(Close) 感谢zhonghua,我们来看几个例子: Mshta Vbscript:Msgbox("Hello,wo

Java调用Python脚本并获取返回值

在Java程序中有时需要调用Python的程序,这时可以使用一般的PyFunction来调用python的函数并获得返回值,但是采用这种方法有可能出现一些莫名其妙的错误,比如ImportError.在这种情况下可以采用另一种方法:使用Java的Runtime,像在命令行直接调用python脚本那样调用python程序.此时可以通过文件作为脚本参数来传递Python程序所需要的参数,并从脚本的输入输出流来获取本来该打印在控制台的结果. 先准备好一个python文件: def get_path(fi

微信小程序前端调用后台方法并获取返回值

wxml代码 <wxs src="../../wxs/string.wxs" module="tools" /> <!-- 调用tools.img(item.content)返回bool,也可以返回其他值 --> <view class='clearfix' wx:if="{{tools.img(item.content)}}"> <view class='content-view'> <im

[蟒蛇菜谱] Python调用shell命令,获取返回值和返回信息

# -*- coding: utf-8 -*- import os import subprocess import signal class MockLogger(object): '''模拟日志类.方便单元测试.''' def __init__(self): self.info = self.error = self.critical = self.debug def debug(self, msg): print "__LOGGER__:"+msg class Shell(obj

工作随笔——Java调用Groovy类的方法、传递参数和获取返回值

接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码如下: # TestGroovy.groovy 定义testC方法,传入3个参数,返回处理后的数据 def testC(int numA, int numB, int numC) { "传入参数:" + numA + numB + numC + "计算之和为:" + (

获取存储过程返回值及代码中获取返回值

获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert](@o_buyerid int ,@o_id bigint OUTPUT)ASBEGINSET NOCOUNT ON;BEGININSERT INTO [Order](o_buyerid )VALUES (@o_buyerid )SET @o_id = @@IDENTITYENDEND 存储过程中获得方法: D

WebView Android 调用js且需要获取返回结果

原来有一两个人说我不帅的时候,我不以为意,逗我玩而已,后来几乎所有 人都说我不帅,我才真正意识到事态的严重,这社会骗子真是越来越多了... 好吧我承认,这个笑话不好笑,其实我想说的是,做人一定要坚持自己的原则, 哪怕有一天所有人都和你背道而驰,都不要放弃自己当初的梦想,如果有一天, 我们淹没在人海之中,庸碌一生,那是因为我们不够努力,不够勇敢的去面对生活. 每天积累一点点,嗯,满足简单的快乐. ---------------------------------------------------

【黑马Android】(07)多线程下载的原理/开源项目xutils/显示意图/隐式意图/人品计算器/开启activity获取返回值

多线程下载的原理 司马光砸缸,多开几个小水管,抢救小朋友. import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import

python执行系统命令后获取返回值

import os, subprocess # os.system('dir') #执行系统命令,没有获取返回值,windows下中文乱码 # result = os.popen('dir') #执行系统命令,返回值为result# res = result.read()# for line in res.splitlines():# print(line ) #用subprocess库获取返回值.# p = subprocess.Popen('dir', shell=True, stdout=