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

调用含输入输出参数的Synapse存储过程无法捕获输出结果的问题

调用带输入输出参数的Synapse存储过程并捕获输出结果

原代码使用execute()仅返回执行成功与否的布尔值,要获取存储过程的输出参数,需通过JDBC的CallableStatement规范处理参数注册与取值,具体实现如下:

完整代码示例

from py4j.java_gateway import java_import

# 导入JDBC类型定义类
java_import(spark._sc._gateway.jvm, "java.sql.Types")

# 建立数据库连接
driver_manager = spark._sc._gateway.jvm.java.sql.DriverManager
connection = driver_manager.getConnection(mssql_url, mssql_user, mssql_pass)

# 定义存储过程调用语句,用?作为参数占位符
# 示例对应存储过程:CREATE PROCEDURE sp_sample @input_val INT, @output_val VARCHAR(50) OUTPUT
call_sql = "{CALL sp_sample(?, ?)}"
call_stmt = connection.prepareCall(call_sql)

# 1. 设置输入参数(参数索引从1开始计数)
call_stmt.setInt(1, 456)  # 替换为实际输入值

# 2. 注册输出参数,指定参数索引和对应SQL数据类型
call_stmt.registerOutParameter(2, spark._sc._gateway.jvm.java.sql.Types.VARCHAR)

# 执行存储过程
call_stmt.execute()

# 3. 获取输出参数的值
output_result = call_stmt.getString(2)
print(f"存储过程输出结果:{output_result}")

# 关闭资源,避免泄漏
call_stmt.close()
connection.close()

关键说明

  • 调用格式:必须使用{CALL 存储过程名(参数占位符)}的标准JDBC调用格式,而非直接写EXEC语句
  • 参数操作:
    • 输入参数:用setXxx(索引, 值)方法设置,Xxx对应数据类型(如setInt、setString)
    • 输出参数:先通过registerOutParameter(索引, SQL类型)注册,再用getXxx(索引)获取结果
  • 类型匹配:输出参数注册时的SQL类型需与存储过程定义的参数类型一致,比如整数用Types.INTEGER、字符串用Types.VARCHAR
  • 资源释放:执行完成后需依次关闭CallableStatement和Connection,避免数据库连接资源泄漏

内容的提问来源于stack exchange,提问作者Rajesh Akshith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:35:16