如何使用 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")