Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wywołanie zewnetrznej procedury, ORA-28595
Forum PHP.pl > Forum > Bazy danych > Oracle
ktosnowy2
Witam,



Tworzę bibliotekę w środowisku Oracle:

  1. CREATE OR REPLACE LIBRARY PROC_INW_LIB IS
  2.  
  3. 'C:\dev-cpp\proc_inwersja.so';


Definiuję procedurę wywołującą program zewnętrzny:


  1. CREATE OR REPLACE PROCEDURE proc_inwersja (
  2. buff IN OUT RAW,
  3. first IN DOUBLE PRECISION,
  4. wymiarX IN DOUBLE PRECISION,
  5. wymiarY IN DOUBLE PRECISION,
  6. bit IN DOUBLE PRECISION
  7. ) AS
  8.  
  9. EXTERNAL NAME "inwersja"
  10. LIBRARY "PROC_INW_LIB"
  11. LANGUAGE C
  12. PARAMETERS ( buff BY reference,
  13. buff LENGTH long,
  14. first BY reference,
  15. wymiarX BY reference,
  16. wymiarY BY reference,
  17. bit BY reference);
  18.  
  19. /


Powyższą procedurę wywoluje ta procedura w linii 37:

  1. CREATE OR REPLACE PROCEDURE proc_inw
  2. IS
  3. b_loc blob;
  4. l_bfile BFILE;
  5. length DOUBLE PRECISION;
  6. Pieces INTEGER;
  7. Buffer RAW(32766);
  8. Amount BINARY_INTEGER := 32766;
  9. Position INTEGER := 1;
  10. First DOUBLE PRECISION := 1;
  11. --dlugosc DOUBLE PRECISION;
  12. wymiarX DOUBLE PRECISION:=1024;
  13. wymiarY DOUBLE PRECISION:=768;
  14. bit DOUBLE PRECISION:=1;
  15. begin
  16. DBMS_LOB.createtemporary (lob_loc => b_loc ,
  17. cache => TRUE,
  18. dur => DBMS_LOB.call);
  19. l_bfile := bfilename('TEST_DIR', 'obraz3.bmp');
  20. IF DBMS_LOB.FILEEXISTS( l_bfile ) = 1 then
  21. dbms_output.put_line( 'Exists!');
  22. else
  23. dbms_output.put_line( 'Not Exists!');
  24. end IF;
  25. length := dbms_lob.getlength (l_bfile);
  26. dbms_output.put_line('length='||length);
  27. SELECT foto INTO b_loc FROM foto2
  28. WHERE o_id = 1 AND f_id = 1 FOR UPDATE;
  29. DBMS_LOB.OPEN (b_loc, DBMS_LOB.LOB_READWRITE);
  30. Pieces := floor((length ) / 32766) + 1;
  31. dbms_output.put_line('pieces='||Pieces);
  32. FOR i IN 1..Pieces LOOP
  33. dbms_output.put_line('i='||i);
  34. DBMS_LOB.READ(b_loc,Amount,Position,Buffer);
  35. dbms_output.put_line('Amount='||Amount);
  36. dbms_output.put_line('Position='||Position);
  37. proc_inwersja(Buffer,First,wymiarX,wymiarY,bit);
  38. DBMS_LOB.WRITE (b_loc, Amount, Position, Buffer);
  39. Position := Position + Amount;
  40. First := 0;
  41. END LOOP;
  42. DBMS_LOB.CLOSE (b_loc);
  43. /*EXCEPTION
  44.   WHEN OTHERS THEN
  45.   DBMS_OUTPUT.PUT_LINE('Błąd wykonywania');*/
  46. END;
  47. /


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:

  1. # listener.ora Network Configuration File: C:\app\marcin\product\11.1.0\db_9\NETWORK\ADMIN\listener.ora
  2. # Generated by Oracle configuration tools.
  3.  
  4.  
  5. SID_LIST_LISTENER =
  6. (SID_LIST =
  7. (SID_DESC =
  8. (SID_NAME = ORA816)
  9. (ORACLE_HOME = C:\app\marcin\product\11.1.0\db_9)
  10. )
  11. (SID_DESC =
  12. (PROGRAM = extproc)
  13. (SID_NAME = PLSExtProc)
  14. (ORACLE_HOME = C:\app\marcin\product\11.1.0\db_9)
  15. (PROGRAM = extproc)
  16. (ENVS = "EXTPROC_DLLS= C:\Dev-Cpp\proc_inwersja.so")
  17. )
  18. )
  19.  
  20. CONNECT_TIMEOUT_LISTENER_PROC = 10
  21.  
  22. TRACE_LEVEL_LISTENER_PROC = OFF
  23.  
  24. STARTUP_WAIT_TIME_LISTENER_PROC = 0
  25.  
  26. LISTENER =
  27. (DESCRIPTION_LIST =
  28. (DESCRIPTION =
  29. (ADDRESS = (PROTOCOL = TCP)(HOST = marcin-PC)(PORT = 1521))
  30. )
  31. (DESCRIPTION =
  32. (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
  33. )
  34. )


Tsnames.ora:


  1. # tnsnames.ora Network Configuration File: C:\app\marcin\product\11.1.0\db_9\network\admin\tnsnames.ora
  2. # Generated by Oracle configuration tools.
  3.  
  4. ORCL8 =
  5. (DESCRIPTION =
  6. (ADDRESS_LIST = (PROTOCOL = TCP)(HOST = marcin-PC)(PORT = 1521))
  7. (CONNECT_DATA =
  8. (SERVER = DEDICATED)
  9. (SERVICE_NAME = orcl8)
  10. )
  11. )


IP!
Nie mam teraz dostępu do środowiska aby to reprodukować, ale...

1. Usługa została zrestarowana po zmianie konfigu, prawda?
2. DLL zamiast SO?
3. Ta ścieżka może być wrażliwa na wielkość znaków nawet na Windows, była kiedyś taka niespodzianka.
4. Problem ze znakami '\' ?
5. Nie jesteś zalogowany jako SYS lub SYSTEM, prawda?
ktosnowy2
1. Tak
2. Próbowałem, bez zmian.
3. Zwróciłem uwage na znaki, bez zmian.
4. Co masz na myśli?
5. Faktycznie byłem zalogowany jako system, ale zrobilem to wszystko na innym koncie i efekt bez zmian.

Jakieś inne pomysły?
goszczu
Nie jestem pewien, ale z komunikatu błędu wnioskuję, że w pliku tnsnames.ora może brakować wpisu
umożliwiającego wywołanie zdalnej procedury. Powinno to wyglądać mniej więcej tak:


  1. EXTPROC_CONNECTION_DATA =
  2. (DESCRIPTION =
  3. (ADDRESS_LIST =
  4. (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
  5. )
  6. (CONNECT_DATA =
  7. (SID = PLSExtProc)
  8. (PRESENTATION = RO)
  9. )
  10. )
ktosnowy2
Też to nic nie zmienia.
Miałem taki ten wpis już wcześniej, ale potem generowałem te pliki automatycznie i zniknął. W każdym razie też nie działa, bez zmian.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.