如何将 java 对象传递给 oracle 存储过程,详细信息如下

Posted

技术标签:

【中文标题】如何将 java 对象传递给 oracle 存储过程,详细信息如下【英文标题】:how to pass a java object to oracle stored procedure with following details 【发布时间】:2012-06-04 08:24:39 【问题描述】:

我的 ORACLE 表的结构为

desc extraction_log1
           Name                           Null                        
                                                     Type                                                                                                                                                                                          

 ------------------------------ -------- ------------------------------------------------------------     ----------------------------------------------------------------------------------------------------      ----------------------------- 
 ROW_NUM                        NOT NULL            NUMBER                                                                                                                                                                                        
DATE_TIME                                        TIMESTAMP(8)                                                                                                                                                                                  
USER_NAME                                         VARCHAR2(32)                                                                                                                                                                                  
PLATFORM_NAME                                      VARCHAR2(20)                                                                                                                                                                                  
R_OBJECT_ID                                       VARCHAR2(16)   

然后我在 oracle 中创建了一个对象类型为

create or replace type EXTRACTION_LOG_TYPE as object    (          

 USER_NAME VARCHAR2(32), 
 R_OBJECT_ID VARCHAR2(16), 

  );

然后我在一个包中创建了一个过程

create or replace package body PAC_BEAN is 
  --The insert procedure will receive EXTRACTION_LOG_TYPE and put it into table EXTRACTION_LOG1.  

   procedure PRO_INSERT_LOG(ELT in EXTRACTION_LOG_TYPE) is 

   begin 

      insert into EXTRACTION_LOG1 ( R_OBJECT_ID, USER_NAME)
           values (ELT.R_OBJECT_ID, ELT.USER_NAME);  

      commit;  

 exception  

  when others then 
    rollback;  

  end PRO_INSERT_LOG;  
  end PAC_BEAN; 

来到我的java端,我已经声明了一个bean

public class ExtractionLogType         
        //Name declared in Oracle        
   public static final String ORACLE_OBJECT_NAME = "EXTRACTION_LOG_TYPE";            
   //The attributes        
  private String  R_OBJECT_ID;        
  private String USER_NAME;      
  //setters and getters      
  public  String getR_OBJECT_ID() 
    return R_OBJECT_ID;
  
  public  void setR_OBJECT_ID(String rOBJECTID) 
    R_OBJECT_ID = rOBJECTID;
    
  public  String getUSER_NAME() 
    return USER_NAME;
   
  public  void setUSER_NAME(String uSERNAME) 
    USER_NAME = uSERNAME;
   


             

在我的包含 main 的类中

               import java.sql.CallableStatement;
               import java.sql.Connection;
                 import java.sql.DriverManager;
               import java.sql.SQLException;

            public class DBLogger     
          String dbUrl;     
        Connection con;      
     //constructor for creation of  connection object 
        as and when an object of DBLogger is instantiated     
        public DBLogger()           
    dbUrl = "jdbc:oracle:thin@my url";        
         try              
        //load Oracle Driver class             
        Class.forName("oracle.jdbc.driver.OracleDriver");     
         catch (ClassNotFoundException e)          
            e.printStackTrace();         
            System.err.println("Oracle driver class not found");       
                  
        try          
            //instantiate connection object       
            con = DriverManager.getConnectio (dbUrl,"userId","pwd");                
             catch (SQLException e)       
                e.printStackTrace();                       
              System.err.println("Connection object to oracle cant be established");   
                    
             
        public static void main(String args[])  
     try
    DBLogger db=new DBLogger();        
    CallableStatement cs = null;        
    ExtractionLogType elt=new  ExtractionLogType();         
    elt.setR_OBJECT_ID("79479479A900");       
    elt.setUSER_NAME("Jeevan");               
    cs = db.con.prepareCall("call PAC_BEAN.PRO_INSERT_LOG(?)");                
    /*                     
     * *code to insert the above object into our Database               
     *       
    */
    cs.execute();           
    System.out.println("insert procedure executed successfully");                  
    db.con.close();      
      //end try  
catch (SQLException e)       
    e.printStackTrace();        
catch(Exception e)              e.printStackTrace();        
   


                

我想不出将对象插入我的数据库的代码。 任何人都可以就此向我提出建议。

谢谢。

【问题讨论】:

【参考方案1】:

你必须为你的数据库类型定义一个数组描述符,这个例子可以帮助你:

final ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("EXTRACTION_LOG_TYPE", con);
// create an Object Array
Object[] data = new Object[2];
// set the values in order of appearance
data[0] = elt.getUSER_NAME();
data[1] = elt.getR_OBJECT_ID();
// Create the Array
ARRAY array = new ARRAY(descriptor, con, data);
// put it on your statement
cs.setArray(1, array);
// execute ...

【讨论】:

获取错误为“无法构造描述符:无法解析类型:“SYSTEM.EXTRACTION_LOG_TYPE”“ 我的数据库中有这个但抛出了这个异常。 @Jeevan 类型 EXTRACTION_LOG_TYPE 是模式 SYSTEM 的一部分吗?你在哪里创建类型?在一个包里? @Jeevan 可能适用于 ArrayDescriptor.createDescriptor("SYSTEM.EXTRACTION_LOG_TYPE", con); 运气不好。还是一样的例外【参考方案2】:

在数据库的 SYSTEM 模式中创建任何对象是一个糟糕的主意。将您的应用程序直接连接到此方案也是同样的坏主意。 这看起来像是缺乏特权,不允许您获得想要的东西。创建新模式,此模式的专用用户,然后使用此新用户创建所有必需的对象(它将是您的对象的所有者)。通过这种方式,您可以避免“问题”,即您无法访问您应该可以访问的内容。

【讨论】:

以上是关于如何将 java 对象传递给 oracle 存储过程,详细信息如下的主要内容,如果未能解决你的问题,请参考以下文章

使用简单的 jdbc 调用将数组作为输入参数传递给 oracle 存储过程

将 LoginContext 作为凭据传递给 JCR(java 内容存储库)中的存储库登录

如何将具有多个对象的状态数组作为参数传递给graphql突变?

如何将复杂的 Java 类对象作为参数传递给 Spark 中的 Scala UDF?

如何将结果集作为输入从java传递到oracle存储过程

如何将网页中的字符串输入作为 Java 对象传递给 @RestController?