2013-09-03 14 views
5

Może ktoś mi pomóc w tej sprawie: Chcę zadzwonić jeden program java z PL/SQL, Oracle RDBMS, poniżej są ustawieniaWywoływanie Javy z PL/SQL

Windows 7 maszyna jest zainstalowane Java na C: \ Program Files \ Java \ jdk1.7.0_02

Stworzyłem jeden katalog do przechowywania plików Java. D: \ Java, zawiera jeden plik hello.java.

public class Hello 
{ 
    public static String world() 
    { 
    return "Hello world"; 
    } 
} 

to zostało skompilowane w porządku, a plik .class został wygenerowany w tym samym katalogu.

Ponieważ mam zadzwonić tej funkcji przy użyciu PL/SQL, tutaj jest funkcja PL/SQL pisałem:

create or replace 
FUNCTION helloworld RETURN VARCHAR2 AS 
LANGUAGE JAVA NAME 'Hello.world() return java.lang.String'; 

i jest to procedura PL/SQL:

create or replace 
PROCEDURE hellow 
AS 
    my_string varchar2(400 char); 
begin 
    my_string:=helloworld(); 
    dbms_output.put_line('The value of the string is ' || my_string); 
end; 

zarówno funkcja, jak i procedura skompilowana dobrze przy użyciu SQL/programista.

Kiedy próbowałem uruchomieniem tej procedury:

set serveroutput on; 
execute hellow; 

następujący błąd nadchodzi:

Error starting at line 2 in command: execute hellow Error report: ORA-29540: class Hello does not exist ORA-06512: at "ORACLE_SOURCE.HELLOWORLD", line 1 ORA-06512: at "ORACLE_SOURCE.HELLOW", line 5 ORA-06512: at line 1 
29540. 00000 - "class %s does not exist" 
*Cause: Java method execution failed to find a class with the indicated name. 
*Action: Correct the name or add the missing Java class. 

umieściłem plik .class w folderze bin również, ale wciąż ten sam błąd nadchodzi . Czy ktoś może się temu przyjrzeć.

Odpowiedz

9

Można również utworzyć i zapisać źródłowy Java bezpośrednio w bazie danych, takich jak procedury przechowywane:

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Hello" AS 
public class Hello 
{ 
    public static String world() 
    { 
    return "Hello world"; 
    } 
}; 
/

> Java created 

Wywołanie tej funkcji jest prosta i nie wymaga dodatkowych ustawień:

CREATE OR REPLACE 
FUNCTION helloworld RETURN VARCHAR2 AS 
LANGUAGE JAVA NAME 'Hello.world() return java.lang.String'; 
/

DECLARE 
    my_string VARCHAR2(400 CHAR); 
BEGIN 
    my_string := helloworld(); 
    dbms_output.put_line('The value of the string is ' || my_string); 
END; 
/

> The value of the string is Hello world 

> PL/SQL procedure successfully completed 
+0

Z której wersji bazy danych Oracle można to zrobić, jakiekolwiek inne ograniczenia? –

+0

@SanKrish: [Zintegrowane jvm zostało wprowadzone w Oracle 8i (1999)] (http://www.orafaq.com/wiki/Oracle_8i). Potrzebujesz uprawnienia ['CREATE PROCEDURE'] (http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_5014.htm#SQLRF01211) do utworzenia źródła java lub funkcji. –

+0

dzięki. Mam to dobrze, ale nie mogłem uruchomić funkcji za pomocą trzeciej części kodu :( –

3

Zanim będzie można wywołać program Java w bazie danych Oracle, należy przesłać go na serwer. Kiedy PL/SQL wywołuje metody klasy Java, robi to w JVM działającym na serwerze Oracle, a nie w systemie lokalnym, a pliki źródłowe muszą zostać przesłane do systemu Oracle, skąd zostaną skompilowane.

pomocą narzędzia loadjava, jak opisano w Java Applications on Oracle

+0

Dzięki, zrozumiałam, że tylko jedna drobna wątpliwość, w moim przypadku, Oracle i JVM zostały zainstalowane na tym samym komputerze, ale zadziałało to dopiero po przesłaniu kodu źródłowego java przez programistę SQL do oracle, jak są te 2 różne? – Divas

+0

Kod Java musi być przechowywany w bazie danych. Podczas wywoływania działa w wewnętrznej JVM Oracle.Oracle nie ma dostępu do kodu Java w systemie poza własnym środowiskiem bazy danych. –

+0

@JimGarrison gdzie przesłać te pliki? mam słoik i oracle12c tę samą maszynę? – danielad

1

Od http://docs.oracle.com/cd/B28359_01/java.111/b31225/chthree.htm

załadować klasy na serwerze przy użyciu narzędzia loadjava. Musisz podać nazwę użytkownika i hasło. Uruchom narzędzie loadjava w następujący sposób:

loadjava -user scott Hello.class 
Password: password 

Proszę podać adres URL, aby uzyskać dodatkowe informacje.

+0

Nie powinien być na 11.1 - jdk 1.7 nie jest tam obsługiwany (gdy trzeba załadować pliki .class) – igr