You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Groovy中从Oracle存储过程获取多个输出参数

Groovy调用Oracle存储过程获取多个输出参数的正确写法

正确实现代码

import groovy.sql.SQL

def inParameter = 'send this value to the stored proc'
def errorCount = 0
def errorString = ''
// 替换为你的数据库连接创建逻辑
def conn = // DriverManager.getConnection(url, user, password)
def sql = Sql.newInstance(conn)

// 核心:单个闭包接收所有输出参数
sql.call('{call MY_SCHEMA.MY_STOREDPROC(?, ?, ?)}', [inParameter, Sql.INTEGER, Sql.VARCHAR]) { ec, es ->
    errorCount = ec
    errorString = es
}

conn.close()

错误点修正与关键说明

你之前的写法错误在于传递了多个闭包给sql.call,实际上这个方法只需要一个闭包来接收所有输出参数:

  1. 闭包的参数顺序必须和存储过程定义的输出参数顺序完全对应,比如示例中ec对应第二个参数(INTEGER类型输出),es对应第三个参数(VARCHAR类型输出)。
  2. Groovy闭包可以直接访问外部作用域的变量,所以在闭包内部直接给errorCount和errorString赋值即可,不需要额外的语法。
  3. 如果存储过程包含IN/OUT类型的参数,需要用Sql.INOUT包装类型,比如Sql.INOUT(Sql.INTEGER),而不是单纯的Sql.INTEGER。

进阶优化:自动管理数据库资源

为了避免手动关闭连接时出现遗漏,推荐使用SQL.withInstance方法自动管理连接和SQL实例:

import groovy.sql.SQL

def inParameter = 'send this value to the stored proc'
def errorCount = 0
def errorString = ''

// 传入数据库连接参数,自动关闭资源
SQL.withInstance(
    'jdbc:oracle:thin:@//your-db-host:port/service-name',
    'username',
    'password',
    'oracle.jdbc.OracleDriver'
) { sql ->
    sql.call('{call MY_SCHEMA.MY_STOREDPROC(?, ?, ?)}', [inParameter, Sql.INTEGER, Sql.VARCHAR]) { ec, es ->
        errorCount = ec
        errorString = es
    }
}

内容的提问来源于stack exchange,提问作者John Chase

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 12:17:39