Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как понять, где ошибка в java-классе?  [new]
Pastic
Member

Откуда: Москва
Сообщений: 1268
Есть такой класс в СУБД Oracle 11:

create or replace and compile java source named "UpLoadFiles" as
import java.io.*;
import java.sql.*;

  public class UpLoadFiles
  {
    public static void InsertFiles(String directory) throws IOException, SQLException
    {  File path=new File(directory);
       if (!path.exists()) { throw new IOException("Каталог '"+directory+"' не найден."); }
       String[] list=path.list();
       String element;
       int n;
       for(int i=0; i<list.length; i++)
       {  element=list[i];
          try
          {  FileInputStream fi=new FileInputStream(element);
             n=fi.length();
             StringBuffer FileContent=new StringBuffer(n);
             for(int j=0; j<n; j++)
             {  FileContent.append((char) fi.read());
             }
             #sql { INSERT INTO DUBP_ADVICE_FILES(FILE_NAME, FILE_CONTENT)
                    VALUES (:element, :FileContent) };
          }
          catch(IOException e)
            { throw new IOException("I/O error: "+e+" "+e.getCause()); }
          catch(SQLException e)
            { throw new SQLException("SQL error: "+e+" "+e.getCause()); }
          finally
          {  try
               { fi.close(); }
             catch(IOException e)
               { throw new IOException("I/O error: "+e+" "+e.getCause()); }
             catch(SQLException e)
               { throw new SQLException("SQL error: "+e+" "+e.getCause()); }
          }
       }
    }
  }


После его компиляции в PL/SQL Developer'e появляется сообщение "Compiled with errors", а сам класс в ветках "Java classes" и "Java sources" в PL/SQL Developer'e помечен как ошибочный. Как узнать, где ошибка?
15 фев 17, 11:50    [20213335]     Ответить | Цитировать Сообщить модератору
 Re: Как понять, где ошибка в java-классе?  [new]
dba123
Member

Откуда:
Сообщений: 956
Pastic,

Думаю что JDeveloper должен точнее указать на ошибки

как вариант, посмотреть на чистый java код в нотации(jdbc):
//1)
C:\>sqlj.exe UpLoadFiles.sqlj
Error: Could not find or load main class sqlj.tools.Sqlj
// import sqlj.tools.*;
// import sqlj.runtime.*;

//2)
C:\>javap java.io.FileInputStream|findstr close
    public void close()       throws java.io.IOException;
// есть такой метод!

//3)
C:\>javap java.io.FileInputStream|findstr length

// нет такого метода  :( 
15 фев 17, 13:07    [20213763]     Ответить | Цитировать Сообщить модератору
 Re: Как понять, где ошибка в java-классе?  [new]
Pastic
Member

Откуда: Москва
Сообщений: 1268
dba123
Pastic,

Думаю что JDeveloper должен точнее указать на ошибки

как вариант, посмотреть на чистый java код в нотации(jdbc):
//1)
C:\>sqlj.exe UpLoadFiles.sqlj
Error: Could not find or load main class sqlj.tools.Sqlj
// import sqlj.tools.*;
// import sqlj.runtime.*;

//2)
C:\>javap java.io.FileInputStream|findstr close
    public void close()       throws java.io.IOException;
// есть такой метод!

//3)
C:\>javap java.io.FileInputStream|findstr length

// нет такого метода  :( 


Спасибо.

Я убрал вызов метода length класса FileInputStream, заменив его методом available:
create or replace and compile java source named "UpLoadFiles" as
import java.io.*;
import java.sql.*;

  public class UpLoadFiles
  {
    public static void InsertFiles(String directory) throws IOException, SQLException
    {  File path=new File(directory);
       if (!path.exists()) throw new IOException("Каталог '"+directory+"' не найден.");
       String[] list=path.list();
       String element;
       int n;
       for(int i=0; i<list.length; i++)
       {  element=list[i];
          try
          {  FileInputStream fi=new FileInputStream(element);
             n=fi.available();
             StringBuffer FileContent=new StringBuffer(n);
             for(int j=0; j<n; j++)
             {  FileContent.append((char) fi.read());
             }
             #sql { INSERT INTO DUBP_ADVICE_FILES(FILE_NAME, FILE_CONTENT)
                    VALUES (:element, :FileContent) };
          }
          catch(IOException e)
            { throw new IOException("I/O error: "+e+" "+e.getCause()); }
          catch(SQLException e)
            { throw new SQLException("SQL error: "+e+" "+e.getCause()); }
          finally
          {  try
               { fi.close(); }
             catch(IOException e)
               { throw new IOException("I/O error: "+e+" "+e.getCause()); }
             catch(SQLException e)
               { throw new SQLException("SQL error: "+e+" "+e.getCause()); }
          }
       }
    }
  }


Но это не помогло - PL/SQL Developer по-прежнему пишет сообщение "Compiled with errors". Ещё я установил JDeveloper и открыл в нём этот файл, но JDeveloper не указал на какие-либо ошибки в этом файле.

sqlj.exe UpLoadFiles.sqlj выдал мне тоже самое сообщение, что и Вам: Error: Could not find or load main class sqlj.tools.Sqlj

Ну и эту ссылку я читал
15 фев 17, 16:23    [20214711]     Ответить | Цитировать Сообщить модератору
 Re: Как понять, где ошибка в java-классе?  [new]
dba123
Member

Откуда:
Сообщений: 956
Pastic,

теперь закомментируй
// #sql { INSERT INTO DUBP_ADVICE_FILES(FILE_NAME, FILE_CONTENT)
// VALUES (:element, :FileContent) };
15 фев 17, 16:54    [20214874]     Ответить | Цитировать Сообщить модератору
 Re: Как понять, где ошибка в java-классе?  [new]
Pastic
Member

Откуда: Москва
Сообщений: 1268
dba123
Pastic,

теперь закомментируй
// #sql { INSERT INTO DUBP_ADVICE_FILES(FILE_NAME, FILE_CONTENT)
// VALUES (:element, :FileContent) };


С этими закомментированными строками класс компилируется без ошибок, но мне нужно делать вставку в таблицу.

И к тому же аналогичная конструкция #sql{} работала в другом java-классе на 11 версии Оракла и с тем же набором импортируемых библиотек (import java.io.*; import java.sql.*;).
15 фев 17, 17:01    [20214916]     Ответить | Цитировать Сообщить модератору
 Re: Как понять, где ошибка в java-классе?  [new]
Pastic
Member

Откуда: Москва
Сообщений: 1268
В общем, суть ошибки в том, что Оракл не даёт записать содержимое файла в ячейку таблицы. То есть, если компилировать этот класс со строкой
#sql { INSERT INTO DUBP_ADVICE_FILES(FILE_NAME) VALUES (:element) };
вместо
#sql { INSERT INTO DUBP_ADVICE_FILES(FILE_NAME, FILE_CONTENT)
                    VALUES(:element, :FileContent) };
, то никакой ошибки при компиляции нет. И при этом совершенно не важен тип поля FILE_CONTENT - изначально это был long raw, но такая же ошибка компиляции имеет место и в том случае, если тип этого поля сделать blob или clob.
15 фев 17, 17:39    [20215063]     Ответить | Цитировать Сообщить модератору
 Re: Как понять, где ошибка в java-классе?  [new]
dba123
Member

Откуда:
Сообщений: 956
Pastic,

Из оракловых JDBC примеров samples\generic\temporarylob.java:
    String insertSql = "insert into jdbc_demo_lob_table values ( ?, ?, ? )";
    PreparedStatement pstmt = conn.prepareStatement( insertSql );
    pstmt.setString( 1, "one" );
    pstmt.setBlob( 2, tempBlob );
    pstmt.setClob( 3, tempClob );
    pstmt.execute();
    pstmt.close();

javap -classpath ojdbc5.jar oracle.jdbc.OraclePreparedStatement
 public abstract void setCLOB(int, oracle.sql.CLOB)       throws java.sql.SQLException;
 public abstract void setCLOBAtName(java.lang.String, oracle.sql.CLOB)       throws java.sql.SQLException;

javap java.sql.PreparedStatement
    public abstract void setBlob(int, java.sql.Blob)       throws java.sql.SQLException;
    public abstract void setClob(int, java.sql.Clob)       throws java.sql.SQLException;
    public abstract void setLong(int, long)       throws java.sql.SQLException;

Для себя сделал заключение:
- GUI программы бесполезны
- Только sqlplus со своим show error или select * from user_errors подскажет где ошибки
- Оракловый сервер только на юниксе
16 фев 17, 09:04    [20216334]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить