如何在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,实际上这个方法只需要一个闭包来接收所有输出参数:
- 闭包的参数顺序必须和存储过程定义的输出参数顺序完全对应,比如示例中
ec对应第二个参数(INTEGER类型输出),es对应第三个参数(VARCHAR类型输出)。 - Groovy闭包可以直接访问外部作用域的变量,所以在闭包内部直接给
errorCount和errorString赋值即可,不需要额外的语法。 - 如果存储过程包含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
相关产品推荐
相关产品推荐

