Witam,
Tworzę bibliotekę w środowisku Oracle:
CREATE OR REPLACE LIBRARY PROC_INW_LIB IS
'C:\dev-cpp\proc_inwersja.so';
Definiuję procedurę wywołującą program zewnętrzny:
CREATE OR REPLACE PROCEDURE proc_inwersja (
buff IN OUT RAW,
first IN DOUBLE PRECISION,
wymiarX IN DOUBLE PRECISION,
wymiarY IN DOUBLE PRECISION,
bit IN DOUBLE PRECISION
) AS
EXTERNAL NAME "inwersja"
LIBRARY "PROC_INW_LIB"
LANGUAGE C
PARAMETERS ( buff BY reference,
buff LENGTH long,
first BY reference,
wymiarX BY reference,
wymiarY BY reference,
bit BY reference);
/
Powyższą procedurę wywoluje ta procedura w linii 37:
CREATE OR REPLACE PROCEDURE proc_inw
IS
b_loc blob;
l_bfile BFILE;
length DOUBLE PRECISION;
Pieces INTEGER;
Buffer RAW(32766);
Amount BINARY_INTEGER := 32766;
Position INTEGER := 1;
First DOUBLE PRECISION := 1;
--dlugosc DOUBLE PRECISION;
wymiarX DOUBLE PRECISION:=1024;
wymiarY DOUBLE PRECISION:=768;
bit DOUBLE PRECISION:=1;
begin
DBMS_LOB.createtemporary (lob_loc => b_loc ,
cache => TRUE,
dur => DBMS_LOB.call);
l_bfile := bfilename('TEST_DIR', 'obraz3.bmp');
IF DBMS_LOB.FILEEXISTS( l_bfile ) = 1 then
dbms_output.put_line( 'Exists!');
else
dbms_output.put_line( 'Not Exists!');
end IF;
length := dbms_lob.getlength (l_bfile);
dbms_output.put_line('length='||length);
SELECT foto INTO b_loc FROM foto2
WHERE o_id = 1 AND f_id = 1 FOR UPDATE;
DBMS_LOB.OPEN (b_loc, DBMS_LOB.LOB_READWRITE);
Pieces := floor((length ) / 32766) + 1;
dbms_output.put_line('pieces='||Pieces);
FOR i IN 1..Pieces LOOP
dbms_output.put_line('i='||i);
DBMS_LOB.READ(b_loc,Amount,Position,Buffer);
dbms_output.put_line('Amount='||Amount);
dbms_output.put_line('Position='||Position);
proc_inwersja(Buffer,First,wymiarX,wymiarY,bit);
DBMS_LOB.WRITE (b_loc, Amount, Position, Buffer);
Position := Position + Amount;
First := 0;
END LOOP;
DBMS_LOB.CLOSE (b_loc);
/*EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Błąd wykonywania');*/
END;
/
Wywołuję procedurę:
exec proc_inw;
Błąd:
ORA-28595: Agent procesu zewnetrznego: niepoprawna sciezka
ORA-06512: przy "SYSTEM.PROC_INWERSJA", linia 1
ORA-06512: przy "SYSTEM.PROC_INW", linia 37
ORA-06512: przy linia 1
ORA-28575
This error indicates that the database couldn't either establish a connection to the external
procedure listener or that the external procedure listener was unable to execute extproc.
Jak pozbyć się tego błędu?
Mój listener.ora:
# listener.ora Network Configuration File: C:\app\marcin\product\11.1.0\db_9\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = ORA816)
(ORACLE_HOME = C:\app\marcin\product\11.1.0\db_9)
)
(SID_DESC =
(PROGRAM = extproc)
(SID_NAME = PLSExtProc)
(ORACLE_HOME = C:\app\marcin\product\11.1.0\db_9)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS= C:\Dev-Cpp\proc_inwersja.so")
)
)
CONNECT_TIMEOUT_LISTENER_PROC = 10
TRACE_LEVEL_LISTENER_PROC = OFF
STARTUP_WAIT_TIME_LISTENER_PROC = 0
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = marcin-PC)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
Tsnames.ora:
# tnsnames.ora Network Configuration File: C:\app\marcin\product\11.1.0\db_9\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
ORCL8 =
(DESCRIPTION =
(ADDRESS_LIST = (PROTOCOL = TCP)(HOST = marcin-PC)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl8)
)
)