Скопируйте изображение на BLOB из клиента PC AKA Java Функция в Oracle
-
26-09-2019 - |
Вопрос
Я застрял с этим в течение последних двух дней. Я иду на Java Функция, хранящаяся в Oracle System, которая должна копировать изображение с локального диска DO удаленной базы данных и хранить его в BLOB - это называется copyblob и выглядит так:
import java.sql.*;
import oracle.sql.*;
import java.io.*;
public class CopyBLOB
{
static int id;
static String fileName = null;
static Connection conn = null;
public CopyBLOB(int idz, String f)
{
id = idz;
fileName = f;
}
public static void copy(int ident, String path) throws SQLException, FileNotFoundException
{
CopyBLOB cpB = new CopyBLOB(ident, path);
cpB.getConnection();
cpB.callUpdate(id, fileName);
}
public void getConnection() throws SQLException
{
DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
try
{
conn = DriverManager.getConnection("jdbc:oracle:thin:@oraserv.ms.mff.cuni.cz:1521:db", "xxx", "xxx");
}
catch (SQLException sqlex)
{
System.out.println("SQLException while getting db connection: "+sqlex);
if (conn != null) conn.close();
}
catch (Exception ex)
{
System.out.println("Exception while getting db connection: "+ex);
if (conn != null) conn.close();
}
}
public void callUpdate(int id, String file ) throws SQLException, FileNotFoundException
{
CallableStatement cs = null;
try
{
conn.setAutoCommit(false);
File f = new File(file);
FileInputStream fin = new FileInputStream(f);
cs = (CallableStatement) conn.prepareCall( "begin add_image(?,?); end;" );
cs.setInt(1, id );
cs.setBinaryStream(2, fin, (int) f.length());
cs.execute();
conn.setAutoCommit(true);
}
catch ( SQLException sqlex )
{
System.out.println("SQLException in callUpdateUsingStream method of given status : " + sqlex.getMessage() );
}
catch ( FileNotFoundException fnex )
{
System.out.println("FileNotFoundException in callUpdateUsingStream method of given status : " + fnex.getMessage() );
}
finally
{
try
{
if (cs != null) cs.close();
if (conn != null) conn.close();
}
catch ( Exception ex )
{
System.out.println("Some exception in callUpdateUsingStream method of given status : " + ex.getMessage( ) );
}
}
}
}
Функция обертки определяется в упаковке «MyPackage», как показало:
procedure image_adder( id varchar2, path varchar2 )
AS
language java name 'CopyBLOB.copy(java.lang.String, java.lang.String)';
И функция вставки называется image_add так же просто, как это:
procedure add_image( id numeric(10), pic blob)
AS
BEGIN
insert into pictures values (seq_pic.nextval, id, pic);
END add_image;
Теперь проблема: когда я печатаю
call MyPackage.image_adder(1, 'd:\samples\img.jpg');
Я получаю ошибку ORA-29531: нет копии метода в классе COPEBLOB. Не могли бы вы мне помочь?
Решение
Метод в вашем классе имеет эту подпись:
public static void copy(int ident, String path)
Но в вашей хранимой процедуре Java вы указали эту подпись:
'CopyBLOB.copy(java.lang.String, java.lang.String)'
Я думаю, что если вы измените первый аргумент java,lang.Integer
Ваша проблема должна решить себя. Возможно, вы должны изменить тип данных параметра ID в процедуре Image_Adder ().
редактировать
«Любые идеи, как загружать локальные файлы?»
Не необоснованно, база данных может взаимодействовать только с файлами, которые видны на свой сервер. Как правило, это ограничивает вопросы для файлов и каталогов, которые физически находятся в том же коробке, если только администратор сети не сопостает некоторых удаленных дисков.
Передача файлов с локального ПК-накопителя на сервер - это действительно клиент, т. Е. Проблема приложений, это не то, что база данных действительно должна быть связана с.
Я знаю, что это не то, что вы надеялись услышать. Если вы действительно хотите управлять загрузкой файлов из базы данных TEH, то механизм остается прежним, когда мы хотим передавать файлы через сеть: FTP. Тим Холл опубликовал реализацию PL / SQL для FTP на своем сайте Oracle-Base. Узнать больше.
«Долгое, как файл Smaler, чем 2000b (WTF?)»
Это подозрительно близко к бинарному ограничению CHAR (2000). В более старых версиях Oracle нам пришлось использовать двухступенчатый процесс: вставьте заполнитель, а затем выдать обновление. Что-то вроде этого:
procedure add_image( id numeric(10), pic blob)
AS
BEGIN
insert into pictures
values (seq_pic.nextval, id, empty_blob());
update pictures
set col_pic = pic
where id = seq_pic.currval;
END add_image;