powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как понять, где ошибка в java-классе?
7 сообщений из 7, страница 1 из 1
Как понять, где ошибка в java-классе?
    #39404717
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой класс в СУБД 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
Как понять, где ошибка в java-классе?
    #39404832
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как понять, где ошибка в java-классе?
    #39405082
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как понять, где ошибка в java-классе?
    #39405127
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pastic,

теперь закомментируй
// #sql { INSERT INTO DUBP_ADVICE_FILES(FILE_NAME, FILE_CONTENT)
// VALUES (:element, :FileContent) };
...
Рейтинг: 0 / 0
Как понять, где ошибка в java-классе?
    #39405137
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как понять, где ошибка в java-классе?
    #39405173
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, суть ошибки в том, что Оракл не даёт записать содержимое файла в ячейку таблицы. То есть, если компилировать этот класс со строкой
Код: 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
Как понять, где ошибка в java-классе?
    #39405429
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как понять, где ошибка в java-классе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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