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) ) )