Я пытаюсь создать функцию в базе данных Oracle, которая использует класс JAVA для чтения файлов с сетевого диска и возвращает содержимое файла в виде BLOB.читать сетевой файл из базы данных Oracle с помощью JAVA
До сих пор здесь прогресс
JAVA-код - FileAPI.java
import java.lang.*;
import java.io.*;
import java.sql.*;
public class FileAPI
{
public static String readFile (String path, Blob[] outLob)
{
FileInputStream fileStream = null;
try {
fileStream = new FileInputStream(path);
byte[] buffer = new byte[100];
int i = 0;
/* for testing just read 100 bytes */
/* code required for reading full file */
i = fileStream.read(buffer, 1, 100);
outLob[0] = new javax.sql.rowset.serial.SerialBlob(buffer);
if(fileStream != null)
fileStream.close();
return "success";
}
catch (Exception e) {
return e.getMessage();
}
}
};
функции Oracle PL/SQL
CREATE OR REPLACE FUNCTION readFile (p_path IN VARCHAR2, p_outlob IN OUT NOCOPY BLOB)
RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'FileAPI.readFile(
java.lang.String,
java.sql.Blob[]) return java.lang.String';
PL/SQL анонимный блок для тестирования выше функции
SET SERVEROUTPUT ON;
DECLARE
l_temp BLOB;
l_res VARCHAR2(1000);
BEGIN
l_res := readFile('/mnt/servername/foldername/filename.txt',l_temp);
IF l_res = 'success'
THEN
DBMS_OUTPUT.PUT_LINE('Success, length '||dbms_lob.getlength(l_temp));
ELSE
DBMS_OUTPUT.PUT_LINE('Error info '|| l_res);
END IF;
END;
/
Когда я бегу над блоком, тогда я не получаю никакой информации об ошибке. Это просто печать «Информация об ошибке». Никакие подробные исключения не печатаются.
Возможно, кто-то подскажет, что здесь происходит.
Также вы можете предложить прочитать содержимое полного файла и добавить его в переменную BLOB (outLob [0]) в JAVA?
детали JAVA
Java версия "1.7.0_79" Java (TM) SE Runtime Environment (сборка 1.7.0_79-b15) Java HotSpot (TM) 64-разрядного сервера VM (сборка 24,79-B02, смешанный режим)
Oracle DB - Oracle 11g R2 EE
С наилучшими пожеланиями,
[обновлено JAVA код]
import java.lang.*;
import java.io.*;
import java.sql.*;
public class FileAPI
{
public static String readFile (String path, Blob[] outLob)
{
FileInputStream fileStream = null;
Blob tmp = outLob[0];
try {
fileStream = new FileInputStream(path);
byte[] buffer = new byte[100];
int i = 0;
/* for testing just read 100 bytes */
/* code required for reading full file */
i = fileStream.read(buffer, 0, 100);
tmp = new javax.sql.rowset.serial.SerialBlob(buffer);
outLob[0] = tmp;
if(fileStream != null)
fileStream.close();
return "success";
}
catch (Exception e) {
//return e.getMessage();
return e.toString();
}
}
};
Попробуйте 'e.toString()' вместо 'e.getMessage()'. Есть определенные случаи, когда сообщение об ошибке пусто. – Timekiller
Спасибо за ответ. Была проблема с массивом. Я исправил это. Теперь, когда я запускаю блок pl/sql, я становлюсь ниже ошибки ORA-00932: непоследовательные типы данных: ожидается, что аргумент OUT в позиции 2, являющийся экземпляром определенного класса Java, конвертируемого в тип Oracle, получил объект, который не мог быть преобразованным –
Какое правильное сопоставление данных для Oracle datatype BLOB в JAVA? или мне нужно изменить код JAVA? –