Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как понять, где ошибка в java-классе? / 7 сообщений из 7, страница 1 из 1
15.02.2017, 11:50
    #39404717
Pastic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как понять, где ошибка в java-классе?
Есть такой класс в СУБД Oracle 11:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
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 помечен как ошибочный. Как узнать, где ошибка?
...
Рейтинг: 0 / 0
15.02.2017, 13:07
    #39404832
dba123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как понять, где ошибка в java-классе?
Pastic,

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

как вариант, посмотреть на чистый java код в нотации(jdbc):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
//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

// нет такого метода  :( 
...
Рейтинг: 0 / 0
15.02.2017, 16:23
    #39405082
Pastic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как понять, где ошибка в java-классе?
dba123Pastic,

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

как вариант, посмотреть на чистый java код в нотации(jdbc):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
//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:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
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

Ну и эту ссылку я читал
...
Рейтинг: 0 / 0
15.02.2017, 16:54
    #39405127
dba123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как понять, где ошибка в java-классе?
Pastic,

теперь закомментируй
// #sql { INSERT INTO DUBP_ADVICE_FILES(FILE_NAME, FILE_CONTENT)
// VALUES (:element, :FileContent) };
...
Рейтинг: 0 / 0
15.02.2017, 17:01
    #39405137
Pastic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как понять, где ошибка в java-классе?
dba123Pastic,

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

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

И к тому же аналогичная конструкция #sql{} работала в другом java-классе на 11 версии Оракла и с тем же набором импортируемых библиотек (import java.io.*; import java.sql.*;).
...
Рейтинг: 0 / 0
15.02.2017, 17:39
    #39405173
Pastic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как понять, где ошибка в java-классе?
В общем, суть ошибки в том, что Оракл не даёт записать содержимое файла в ячейку таблицы. То есть, если компилировать этот класс со строкой
Код: java
1.
#sql { INSERT INTO DUBP_ADVICE_FILES(FILE_NAME) VALUES (:element) };

вместо
Код: java
1.
2.
#sql { INSERT INTO DUBP_ADVICE_FILES(FILE_NAME, FILE_CONTENT)
                    VALUES(:element, :FileContent) };

, то никакой ошибки при компиляции нет. И при этом совершенно не важен тип поля FILE_CONTENT - изначально это был long raw, но такая же ошибка компиляции имеет место и в том случае, если тип этого поля сделать blob или clob.
...
Рейтинг: 0 / 0
16.02.2017, 09:04
    #39405429
dba123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как понять, где ошибка в java-классе?
Pastic,

Из оракловых JDBC примеров samples\generic\temporarylob.java:
Код: java
1.
2.
3.
4.
5.
6.
7.
    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();


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
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 подскажет где ошибки
- Оракловый сервер только на юниксе
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как понять, где ошибка в java-классе? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]