2009-12-01 16 views
5

私は、データベースから値を格納して検索する小さなプログラムを作成しようとしています。データベースはオブジェクトリレーショナルです。JDBCでVARRAY(Oracle 9i)を処理する方法は?

Here're DDL文:

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(); 
    } 
} 

コードは罰金コンパイル:

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) 

そして、これは私のJavaコードです。オラクル:薄い:@ 127.0.0.1:1521:ralphdb あなたの選択を入力し、ADB> JavaのSimpleJdbcApplication JDBC \:私は、データベースに値を挿入しようとする。しかし、それは次のようなエラー

Fを与えます。 1. を挿入します。2. を削除します。2. を更新します。4. を表示します。5.直接クエリを入力します。 6.終了1名前、住所、生年月日を入力します。 rahul mumbai 1989-12-22 簡単な説明を入力します。喜んで知られている言語の名前を と入力します。 (最大でも 10.)完了したら 'done'と入力してください。 C++ C Javaのスレッドで例外を行って、 "メイン" ます。java.sql.SQLException:のoracle.jdbcで :oracle.jdbc.driver.DatabaseError.throwSqlException(112 DatabaseError.java )でSYSTEM.K nownLanguages :無効な名前 パターン.driver.DatabaseError.throwSqlException(DatabaseError.java :146) oracle.jdbc.oracore.OracleTypeADT.initMetadata(OracleTypeADT.java:463 )oracle.jdbc.oracore.OracleTypeADT.initで で(OracleTypeADT.java:362 oracle.sql.ArrayDescriptor.createDescriptorでoracle.sql.ArrayDescriptorでoracle.sql.ArrayDescriptor.initPickler(ArrayDescriptor.java:1756) で) 。(ArrayDescriptor.java:272) (ArrayDescriptor.jav A:196)oracle.sql.ArrayDescriptor.createDescriptorでoracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:150) でoracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:165) (ArrayDescriptor.javaで 。 115)SimpleJdbcApplication.main(SimpleJdbcApplication.java:62) FでSimpleJdbcApplication.insertCoder(SimpleJdbcApplication.java:143) で :\ ADB>

私が扱ってきたやり方と間違って何かがあると思いますバレー。助けてください...

ありがとう!

答えて

1

:-)例外をスローこの行のように見える:

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

私は、問題はそれがデータベース内にタイプの名前を解決していないことだと思います。私は過去に型の参照が大文字と小文字を区別していることを発見したと信じています。そして、Oracleではデフォルトで型名はすべて大文字です。したがって、上記の行に "KNOWNLANGUAGES"を使用してみてください。

また、私はなぜそれがわからないが、SYSTEMスキーマを見ているようだ。タイプがSYSTEMによって所有されていない場合は、その記述子呼び出しでそのタイプを明示的に指定する必要があります(例: "SCOTT.KNOWNLANGUAGES")。

関連する問題