如何使用 java 从 PL/SQL 读取字符串输出?
How to read string output from PL/SQL using java?
我有一个 SQl 的存储过程,并将 return 一个字符串作为输出,如下所示
create PROCEDURE "PRATIK"."PRC_test3" (IN param1 INT,
param2 NVARCHAR(15),
OUT outParam1 VARCHAR (2000))
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
--DEFAULT SCHEMA <default_schema_name>
--READS SQL DATA AS
AS
BEGIN
----------- ### Exception Handler ### ------------------------
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
outParam1 := 'SQL Exception occured. Error Code is: ' || ::SQL_ERROR_CODE || ' Error message is: ' || ::SQL_ERROR_MESSAGE;
END;
outparam1 := ' Param2: ' || :param2 || '| param1: ' || :param1;
END;
为了阅读它的回复,我有以下 java 代码
if (connection != null) {
try {
String Stm = "CALL \"PRATIK\".\"PRC_test3_2\"("+param1+",'"+param2+"',"+outparams1+")";
System.out.println("Connection to HANA successful!");
java.sql.Statement stmt = connection.createStatement();
java.sql.ResultSet resultSet = stmt.executeQuery(Stm);
resultSet.next();
String res1 = resultSet.getString(1);
System.out.println("This is the result of the query -- "+res1);
//System.out.println("METADATA -- "+resultSet.getMetaData());
} catch (SQLException e) {
System.err.println("Query failed!");
System.err.println(e.getStackTrace());
e.printStackTrace();
}
}
当我执行这段代码时,它给我一个错误,指出输出不是 resultSet 类型。以下是堆栈跟踪。
Query failed!
[Ljava.lang.StackTraceElement;@6504e3b2
com.sap.db.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: SQL statement does not generate a result set.
at com.sap.db.jdbc.exceptions.SQLExceptionSapDB._newInstance(SQLExceptionSapDB.java:197)
at com.sap.db.jdbc.exceptions.SQLExceptionSapDB.newInstance(SQLExceptionSapDB.java:26)
at com.sap.db.jdbc.StatementSapDB._executeQuery(StatementSapDB.java:1355)
at com.sap.db.jdbc.StatementSapDB.executeQuery(StatementSapDB.java:162)
at com.saphana.tibco.Procedure.main(Procedure.java:33)
有没有办法在不改变 sql 过程的情况下从 PL/SQl 从 java 读取字符串输出以给出 sql return 格式的结果如下图
SELECT
:param1 as "outParam1"
FROM Dummy;
嗨 Pratik,请看下面 link
我们需要使用 callableStatement,因为 resulset 将不起作用
https://www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-out-parameter-example/
我只使用 java 与 H2Db 合作,而不是 PL/SQL,但我认为 Java 的事情会是一样的。我这样做的方式就像您需要一个准备语句,然后是一个结果集来执行查询。您不需要boolean stmt
,您可以直接准备一条语句执行查询并将其分配给结果集。下面是一个片段。让我知道此解决方案是否有效。
if (connection != null) {
try {
String Stm = "CALL \"PRATIK\".\"PRC_test3_2\"("+param1+",'"+param2+"',"+outparams1+")";
System.out.println("Connection to HANA successful!");
PreparedStatement process = connection.prepareStatement(Stm).;
java.sql.ResultSet resultSet = process.executeQuery(Stm);
if(resultSet.next()){
while(resultSet.next()){
String res1 = resultSet.getString("name");
System.out.println("This is the result of the query -- "+res1);
}
}
//System.out.println("METADATA -- "+resultSet.getMetaData());
} catch (SQLException e) {
System.err.println("Query failed!");
System.err.println(e.getStackTrace());
e.printStackTrace();
}
}
注意:当您尝试获取值时,您可以传递列名。例如,如果您要获取名称,假设您的列名称是 "name",您需要传递 getString("name")
我有一个 SQl 的存储过程,并将 return 一个字符串作为输出,如下所示
create PROCEDURE "PRATIK"."PRC_test3" (IN param1 INT,
param2 NVARCHAR(15),
OUT outParam1 VARCHAR (2000))
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
--DEFAULT SCHEMA <default_schema_name>
--READS SQL DATA AS
AS
BEGIN
----------- ### Exception Handler ### ------------------------
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
outParam1 := 'SQL Exception occured. Error Code is: ' || ::SQL_ERROR_CODE || ' Error message is: ' || ::SQL_ERROR_MESSAGE;
END;
outparam1 := ' Param2: ' || :param2 || '| param1: ' || :param1;
END;
为了阅读它的回复,我有以下 java 代码
if (connection != null) {
try {
String Stm = "CALL \"PRATIK\".\"PRC_test3_2\"("+param1+",'"+param2+"',"+outparams1+")";
System.out.println("Connection to HANA successful!");
java.sql.Statement stmt = connection.createStatement();
java.sql.ResultSet resultSet = stmt.executeQuery(Stm);
resultSet.next();
String res1 = resultSet.getString(1);
System.out.println("This is the result of the query -- "+res1);
//System.out.println("METADATA -- "+resultSet.getMetaData());
} catch (SQLException e) {
System.err.println("Query failed!");
System.err.println(e.getStackTrace());
e.printStackTrace();
}
}
当我执行这段代码时,它给我一个错误,指出输出不是 resultSet 类型。以下是堆栈跟踪。
Query failed! [Ljava.lang.StackTraceElement;@6504e3b2 com.sap.db.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: SQL statement does not generate a result set. at com.sap.db.jdbc.exceptions.SQLExceptionSapDB._newInstance(SQLExceptionSapDB.java:197) at com.sap.db.jdbc.exceptions.SQLExceptionSapDB.newInstance(SQLExceptionSapDB.java:26) at com.sap.db.jdbc.StatementSapDB._executeQuery(StatementSapDB.java:1355) at com.sap.db.jdbc.StatementSapDB.executeQuery(StatementSapDB.java:162) at com.saphana.tibco.Procedure.main(Procedure.java:33)
有没有办法在不改变 sql 过程的情况下从 PL/SQl 从 java 读取字符串输出以给出 sql return 格式的结果如下图
SELECT
:param1 as "outParam1"
FROM Dummy;
嗨 Pratik,请看下面 link 我们需要使用 callableStatement,因为 resulset 将不起作用
https://www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-out-parameter-example/
我只使用 java 与 H2Db 合作,而不是 PL/SQL,但我认为 Java 的事情会是一样的。我这样做的方式就像您需要一个准备语句,然后是一个结果集来执行查询。您不需要boolean stmt
,您可以直接准备一条语句执行查询并将其分配给结果集。下面是一个片段。让我知道此解决方案是否有效。
if (connection != null) {
try {
String Stm = "CALL \"PRATIK\".\"PRC_test3_2\"("+param1+",'"+param2+"',"+outparams1+")";
System.out.println("Connection to HANA successful!");
PreparedStatement process = connection.prepareStatement(Stm).;
java.sql.ResultSet resultSet = process.executeQuery(Stm);
if(resultSet.next()){
while(resultSet.next()){
String res1 = resultSet.getString("name");
System.out.println("This is the result of the query -- "+res1);
}
}
//System.out.println("METADATA -- "+resultSet.getMetaData());
} catch (SQLException e) {
System.err.println("Query failed!");
System.err.println(e.getStackTrace());
e.printStackTrace();
}
}
注意:当您尝试获取值时,您可以传递列名。例如,如果您要获取名称,假设您的列名称是 "name",您需要传递 getString("name")