如何将具有 70 个字段的 java 对象发送到具有相同字段数的对象的 pl sql 过程

Posted

技术标签:

【中文标题】如何将具有 70 个字段的 java 对象发送到具有相同字段数的对象的 pl sql 过程【英文标题】:How to send a java object with 70 fields to pl sql procedure having an object with the same number of fields 【发布时间】:2019-12-06 08:43:53 【问题描述】:

我有一个包含 70 个字段的 java 类。我的表中还有 70 个字段,我需要在其中执行 CRUD 操作。我有一个程序,它有一个包含 70 个字段的对象作为对象。我需要调用此过程并执行操作。任何人都可以提出任何可能的解决方案。

【问题讨论】:

到目前为止你有什么尝试? 【参考方案1】:

首先,我建议创建一个数据库 OBJECT 和该对象的构造函数,以表示您的过程的输入参数。

/* set this up with your 70 values needed */
CREATE OR REPLACE TYPE Myproc_Parameters AS OBJECT(
                                       Number_Parameter   NUMBER(10)
                                      ,Varchar_Parameter1 VARCHAR2(20) 
                                      ,Varchar_Parameter2 VARCHAR2(30) 
                                      ,Varchar_Etc        VARCHAR2(100) 
                                      ,CONSTRUCTOR FUNCTION Myproc_Parameters 
                                         RETURN SELF AS RESULT);
/

CREATE OR REPLACE TYPE BODY Myproc_Parameters AS
  CONSTRUCTOR FUNCTION Myproc_Parameters RETURN SELF AS RESULT AS
  BEGIN
    RETURN;
  END;
END;
/

您将将此对象传递给您将用于 CRUD 操作的任何过程。

CREATE OR REPLACE PROCEDURE Myproc_Crud (
  p_My_Params   IN  Myproc_Parameters)
IS
BEGIN
  NULL; /* CRUD logic here */
END;
/

一旦设置好参数对象和过程,就可以从 Java 中调用它。

public class TestCallDatabaseProcedure 
    public static void main(String[] args)     
        try 
            // set up an Oracle database connection 
            OracleConnection connection = getOracleConnection().unwrap(OracleConnection.class);

            System.out.println("Got Connection.");

            // create an object array based on the database object 
            // add your 70 values for the procedure here
            Object[] procParameters = new Object[] 1, "param2", "param3", "param4";

            // use the object array to create a struct based on the database object
            Struct structParameters = connection.createStruct("MYPROC_PARAMETERS", procParameters);

            OracleCallableStatement statement = (OracleCallableStatement) connection.prepareCall(
                    "begin " +
                    "  Myproc_Crud(?); " +
                    "end;");

            // pass the struct to the callable statement executing your procedure
            statement.setObject(1, structParameters);           

            statement.execute();

            System.out.println("Statement executed.");

            statement.close();
            connection.close();
         catch (SQLException se) 
            System.out.println("SQL exception: " + se.getMessage());
         catch (Exception e) 
            System.out.println(e.getMessage());
         
    

这是我用来获取 Oracle 数据库连接的方法。

    private static Connection getOracleConnection() throws Exception 
        String driver = "oracle.jdbc.driver.OracleDriver";
        String url = "jdbc:oracle:thin:@myhost.com:1521:mydb";
        String username = "myuser";
        String password = "mypasswd";

        Class.forName(driver); 

        Connection connection = DriverManager.getConnection(url, username, password);

        return connection;
    

【讨论】:

以上是关于如何将具有 70 个字段的 java 对象发送到具有相同字段数的对象的 pl sql 过程的主要内容,如果未能解决你的问题,请参考以下文章

如何防止对象在 Retrofit2 的 API 调用中发送空字段

C ++ MPI创建并发送具有字段char [16]和整数的结构数组

如何在嵌入 discord.py 中将长字段作为页面发送?

Retrofit2:如何在具有不同字段名称的对象中接收 JSON 响应?

如何在将jsonObject转换为模型对象时检测缺失的字段

如何创建或设置具有最大值的 JodaTime DateTime 对象?