首页 > 解决方案 > 如何从 spark scala 调用 db2 数据库中的存储过程

问题描述

我必须在 db2 中调用一个存储过程,它需要 3 个参数并返回一个整数。谁能帮我从 spark Scala 代码中调用这个 sp。下面是 db2 中的存储过程。

CREATE PROCEDURE TEST_PROC(IN V_DATE DATE,IN V_GROUP VARCHAR(20),IN V_FREQ 
VARCHAR(20),IN V_RULE VARCHAR(20), OUT ID INTEGER)
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN
LOCK TABLE CAL_LOG IN EXCLUSIVE MODE;
SET ID = (10+ COALESENCE((SELECT MAX(ID) FROM CAL_LOG WITH UR),0));
INSERT INTO CAL_RESULT(ID,P_DATE,GROUP,FREQ,RULE)
VALUES(ID,V-DATE,V_GROUP,V_FREQ,V_RULE);
COMMIT:
END;

PROC 已创建并按预期工作。

现在我想从 spark scala 代码中调用这个过程。我正在尝试下面的代码

val result = spark.read.format("jdbc")
.options(Map(
"url"-> //the db2 url
"driver" - > // my db2 driver
"user name" - > // username
"password" -> // password
""dbtable" -> "(CALL TEST_PROC('2020-07-08','TEST',''TEST','TEST,?)) as proc_result;"
)).load()

但代码片段给出以下错误

DB@ SQL Error: SQLCODE=-104, SQLSTATE=42601
com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601

标签: scalaapache-spark

解决方案


您无法使用 Apache Spark 调用存储过程,尽管使用 Spark load 加载相同的数据

从 db2 加载

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

val df= sqlContext.load("jdbc", Map(
                       "url" -> "jdbc:db2://xx.xx.xx.xx:50000/SQLDB:securityMechanism=9;currentSchema=vaquarkhan;user=<ur-username>;password=xxxxx;",
        "driver" -> "com.ibm.db2.jcc.DB2Driver",
        "dbtable" -> "scheam.TableName"))

创建临时表/df 并添加过滤器以获得所需的响应。


推荐阅读