【问题标题】:how to pass a java object to oracle stored procedure with following details如何将 java 对象传递给 oracle 存储过程,详细信息如下
【发布时间】: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();        
}   
}

       }         

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

谢谢。

【问题讨论】:

    标签: java database oracle logging stored-procedures


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

    【讨论】:

      猜你喜欢
      • 2017-06-08
      • 1970-01-01
      • 2011-10-23
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 2023-03-27
      相关资源
      最近更新 更多