2009-12-01 26 views
5

Tôi đang cố viết một chương trình nhỏ để lưu trữ và truy xuất các giá trị từ cơ sở dữ liệu. Cơ sở dữ liệu là đối tượng quan hệ.Làm thế nào để đối phó với VARRAYs (Oracle 9i) trong JDBC?

Here're DDL báo cáo:

create or replace type Guy as object (name varchar(80), address varchar(80), dateOfBirth date) 

create or replace type KnownLanguages as varray(10) of varchar(80) 

create table Coders (person_ Guy, description clob, knownLanguages_ KnownLanguages) 

Và đây là mã Java của tôi:

package adbms; 

import java.sql.Clob; 
import java.sql.Connection; 
import java.sql.Date; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Scanner; 

import oracle.jdbc.OracleDriver; 
import oracle.jdbc.driver.OraclePreparedStatement; 
import oracle.jdbc.driver.OracleResultSet; 
import oracle.sql.ARRAY; 
import oracle.sql.ArrayDescriptor; 

public class SimpleJdbcApplication { 
    public static final String DRIVER_TYPE = "thin"; 
    public static final String HOST_NAME = "localhost"; 
    public static final int PORT = 1521; 
    public static final String DATABASE_SID = "ralphdb"; 
    public static final String USER_NAME = "scott"; 
    public static final String PASSWORD = "tiger"; 
    public static final String URL = String.format("jdbc:oracle:%s:@%s:%d:%s", DRIVER_TYPE, HOST_NAME, PORT, DATABASE_SID); 

    private static Connection connection; 
    private static Scanner read; 
    private static PreparedStatement insertStatement; 
    private static PreparedStatement deleteStatement; 
    private static PreparedStatement updateStatement; 
    private static PreparedStatement displayStatement; 

    static { 
     try { 
      System.out.println(URL); 
      read = new Scanner(System.in); 
      DriverManager.registerDriver(new OracleDriver()); 
      connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD); 
      insertStatement = connection.prepareStatement("insert into Coders values(Guy(?,?,?) , ? , ?)"); 
      deleteStatement = connection.prepareStatement("delete from Coders where person_.name=?"); 
      updateStatement = connection.prepareStatement("update Coders set person_.name=? where person_.name=?"); 
      displayStatement = connection.prepareStatement("select * from Coders"); 
     } catch (Exception x) { 
      x.printStackTrace(); 
     } 
    } 

    public static void main(String... args) throws SQLException { 
     while (true) { 
      System.out.println("Enter your choice."); 
      System.out.println("1. Insert"); 
      System.out.println("2. Delete"); 
      System.out.println("2. Update"); 
      System.out.println("4. Display"); 
      System.out.println("5. Enter a direct query"); 
      System.out.println("6. Exit"); 
      switch (read.nextInt()) { 
       case 1: 
        insertCoder(); 
        break; 
       case 2: 
        removeCoder(); 
        break; 
       case 3: 
        updateCoder(); 
        break; 
       case 4: 
        displayAllCoders(); 
        break; 
       case 5: 
        processDirectQuerry(); 
        break; 
       default: 
        System.exit(0); 
      } 
     } 
    } 

    private static void processDirectQuerry() throws SQLException { 
     System.out.println("Enter the query."); 
     String query = read.nextLine(); 
     connection.createStatement().execute(query); 
    } 

    private static void displayAllCoders() throws SQLException { 
     ResultSet resultSet = displayStatement.executeQuery(); 
     System.out.println("Name\tAddress\tDate of birth\tDescription\tKnown Languages"); 
     while (resultSet.next()) { 
      System.out.print(resultSet.getString("person_.name")+"\t"); 
      System.out.print(resultSet.getString("person_.address")+"\t"); 
      System.out.print(resultSet.getDate("person_.dateOfBirth")+"\t"); 
      Clob description = resultSet.getClob("description"); 
      System.out.print(description.getSubString(1L, (int) description.length())); 
      ARRAY oraArray = ((OracleResultSet) resultSet).getARRAY("knownLanguages_"); 
      String[] languagesArray = (String[]) oraArray.getArray(); 
      for (String language : languagesArray) { 
       System.out.print(language + " "); 
      } 
      System.out.println(); 
     } 
    } 

    private static void updateCoder() throws SQLException { 
     System.out.println("Enter the name of the coder whose name is to be updated."); 
     String originalName = read.nextLine(); 
     System.out.println("ENter the new name."); 
     String newName = read.nextLine(); 
     updateStatement.setString(1, newName); 
     updateStatement.setString(2, originalName); 
     updateStatement.executeUpdate(); 
    } 

    private static void removeCoder() throws SQLException { 
     System.out.println("Enter the name of coder to be removed."); 
     String name = read.nextLine(); 
     deleteStatement.setString(1, name); 
     deleteStatement.executeUpdate(); 
    } 

    private static void insertCoder() throws SQLException { 
     read = new Scanner(System.in); 
     System.out.println("Enter the name, address and date of birth."); 
     String name = read.nextLine(); 
     String address = read.nextLine(); 
     String dateOfBirth = read.nextLine(); 
     System.out.println("Enter a brief description."); 
     String description = read.nextLine(); 
     List<String> languagesList = new ArrayList<String>(); 
     System.out.println("Enter names of known languages. (At most 10.) Type 'done' when you're done."); 
     String token = null; 
     int i = 0; 
     while (i < 10 && !(token = read.nextLine()).equalsIgnoreCase("done")) { 
      languagesList.add(token); 
        i++; 
     } 
     insertStatement.setString(1, name); 
     insertStatement.setString(2, address); 
     insertStatement.setDate(3, Date.valueOf(dateOfBirth)); 
     insertStatement.setString(4, description); 
     //String[] languagesArray = (String[]) languagesList.toArray(); 
     Object[] languagesArray = languagesList.toArray(); 
     ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("KnownLanguages", connection); 
     ARRAY oraArray = new ARRAY(arrayDescriptor, connection, languagesArray); 
     ((OraclePreparedStatement) insertStatement).setARRAY(5, oraArray); 
     insertStatement.executeUpdate(); 
    } 
} 

mã biên dịch tốt. Nhưng khi tôi cố gắng để chèn giá trị trong cơ sở dữ liệu, nó mang lại cho các lỗi sau

F: \ adb> java SimpleJdbcApplication jdbc: oracle: mỏng: @ 127.0.0.1: 1521: ralphdb Nhập lựa chọn của bạn. 1. Chèn 2. Xóa 2. Cập nhật 4. Hiển thị 5. Nhập truy vấn trực tiếp 6. Thoát 1 Nhập tên, địa chỉ và ngày tháng năm sinh. rahul mumbai 1989-12-22 Nhập mô tả ngắn gọn. vui lòng Nhập tên của các ngôn ngữ đã biết. (Tối đa 10.) Nhập 'xong' khi bạn hoàn tất. C++ c java làm Exception in thread "main" java.sql.SQLException: tên không hợp lệ mẫu: SYSTEM.K nownLanguages ​​ tại oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java : 112) tại oracle.jdbc .driver.DatabaseError.throwSqlException (DatabaseError.java : 146) tại oracle.jdbc.oracore.OracleTypeADT.initMetadata (OracleTypeADT.java:463 ) tại oracle.jdbc.oracore.OracleTypeADT.init (OracleTypeADT.java:362) tại oracle.sql.ArrayDescriptor.initPickler (ArrayDescriptor.java:1756) tại oracle.sql.ArrayDescriptor. (ArrayDescriptor.java:272) tại oracle.sql.ArrayDescriptor.createDescriptor (ArrayDescriptor.jav a: 196) tại oracle.sql.ArrayDescriptor.createDescriptor (ArrayDescriptor.java:165) tại oracle.sql.ArrayDescriptor.createDescriptor (ArrayDescriptor.java:150) tại oracle.sql.ArrayDescriptor.createDescriptor (ArrayDescriptor.java: 115) tại SimpleJdbcApplication.insertCoder (SimpleJdbcApplication.java:143) tại SimpleJdbcApplication.main (SimpleJdbcApplication.java:62) F: \ adb>

tôi nghĩ rằng có điều gì đó sai trái với cách tôi đã xử lý các VARRAY. Xin hãy giúp tôi ...

Cảm ơn bạn! :-)

Trả lời

1

Nó dường như là dòng này ném ngoại lệ:

ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("KnownLanguages", connection); 

Tôi nghĩ vấn đề là nó không được giải quyết tên gõ vào cơ sở dữ liệu. Tôi tin rằng tôi đã tìm thấy trong quá khứ rằng việc tra cứu kiểu là phân biệt chữ hoa chữ thường, và theo mặc định trong Oracle, tên kiểu là tất cả chữ hoa chữ thường. Vì vậy, hãy thử sử dụng "KNOWNLANGUAGES" trong dòng trên.

Ngoài ra, nó có vẻ như đang tìm trong lược đồ SYSTEM, mặc dù tôi không biết tại sao. Nếu loại không thuộc sở hữu của SYSTEM, bạn có thể cần chỉ định rõ ràng rằng trong cuộc gọi mô tả (ví dụ: "SCOTT.KNOWNLANGUAGES").

Các vấn đề liên quan