Cel mai bun dintre cele două lumi este apelul java de la pl

Odată cu apariția Oracle8i, dezvoltatorii pot, pe lângă PL / SQL, să profite de limbajul de programare Java standard pentru Internet. Acest articol vă spune de unde să începeți.







În Oracle8i pentru a construi aplicații care sunt stocate și rula pe serverul de baze de date, dezvoltatorii sunt capabili de a alege două limbaje de programare: PL / SQL și Java pe scară largă. PL / SQL și aplicații Java interacționează direct în baza de date, logica Java aplicație poate extinde / SQL programe PL existente, și Java stocate programe pot apela PL / SQL în software-ul de server (a se vedea. Figura 1).

Primul element de pe ordinea de zi este să instalați Java Development Kit (JDK) versiunea 1.1.5 sau o versiune ulterioară. JDK livrează cu Oracle8i. poate fi descărcat și de pe site-ul Sun Microsystems Java. Asigurați-vă că variabila de mediu CLASSPATH este setată astfel încât compilatorul Java să găsească clasa pe care o creați, precum și clasele furnizate de Oracle.

Informațiile inițiale pot fi găsite în nota "Az PL / SQL și Java" publicată în această ediție.

Accesarea Java din PL / SQL

Accesul la procedurile Java stocate din baza de date Oracle include șase pași de bază.

Pasul 1: Determinați ce funcționalitate Java doriți să utilizați în aplicația dvs. Vedeți dacă bibliotecile de clase existente Java conțin clase Java predefinite care includ metode cu astfel de funcționalități.

Pasul 2: Creați o clasă Java specială care include metode bazate pe aceste funcționalități.

Pasul 3: Compilați această clasă Java, testați-o și încărcați-o în baza de date.

Pasul 4: Creați un program PL / SQL wrapper care va apela procedura Java stocată.

Pasul 5: Dați privilegiile necesare programului PL / SQL wrapper și procedurile Java stocate la care se referă.

Pasul 6: Apelați programul PL / SQL.

Pentru a demonstra aceste acțiuni și a furniza tehnologia de care aveți nevoie pentru a face munca, voi folosi un exemplu foarte simplu. Acesta este: Vreau să pot șterge fișierele sistemului de operare din programul PL / SQL. Înainte de versiunea 8.1 și suportul Java Oracle8, au fost posibile numai următoarele opțiuni:

  • În Oracle7 Release 7.3, ați putea trimite un mesaj canalului bazei de date, apoi programul C-listener a interceptat mesajul ("Delete file X") și a făcut toate lucrările.
  • În Oracle8 Release 8.0, puteți crea o bibliotecă care să indice o bibliotecă C (DLL) sau o bibliotecă partajată dinamic. Apoi, din PL / SQL ați putea apela programul acestei biblioteci pentru a șterge fișierul.

Tehnologia canalului este convenabilă, dar este un dispozitiv artificial. Abordarea externă, deși cea mai bună soluție, nu este atât de simplă, mai ales dacă nu cunoașteți limba C. Pe de altă parte, Java conține clase predefinite care oferă interfețe de programare puternică și ușor de utilizat (API) pentru o gamă largă o gamă de funcționalități, inclusiv fișiere I / O.

Step1. Căutați funcția Java predefinită necesară.

public clasa java.io.File public boolean delete ();
public boolean mkdir ();
>

Cu alte cuvinte, pot apela o metodă Java booleană pentru a șterge fișierul solicitat. Dacă metoda șterge fișierul, ea returnează TRUE, altfel returnează FALSE.

Proceduri stocate în Java

PASUL 2. Construirea unei clase personalizate Java

S-ar putea să vă întrebați de ce este necesar să construiți o altă clasă Java bazată pe clasa File. De ce nu poți să apelezi doar File.delete direct din programul de împachetare? Există două motive pentru aceasta:

  • Metoda Java, în aproape toate cazurile (cu excepția metodelor statice și a metodelor de clasă), este executată dintr-un obiect special creat din clasă. Nu puteți instanțiza un obiect Java din PL / SQL și apoi apelați o metodă pentru acest obiect.
  • Tipurile de date din Java și PL / SQL nu coincid direct una cu cealaltă. De exemplu, nu puteți transmite un tip de date Java boolean direct la un tip de date PL / SQL Boolean.

Prin urmare, trebuie să construiți o nouă clasă care va fi:

  • Creați un obiect din clasa Fișier
  • Apelați metoda de ștergere pentru acest obiect
  • Întoarceți o valoare pe care PL / SQL o poate interpreta

Următoarea este o clasă simplă pe care am creat-o pentru a profita de metoda File.delete:

import java.io.File;
public class JDelete public static int șterge (String fileName) Fișierul myFile = fișier nou (fileName);
boolean retval = myFile.delete ();
dacă (retval) return 1; altul retur 0;
> // ștergeți metoda
> // clasa Jdelete

Metoda JDelete.delete creează pur și simplu un obiect File gol pentru numele de fișier dat, așa că pot apela metoda de ștergere din acest fișier. Declarând o metodă statică, o fac accesibilă, evitând necesitatea de a crea un obiect: metodele statice sunt asociate cu clase, nu cu obiecte din aceste clase.

Această clasă evidențiază unele diferențe importante între Java și PL / SQL:

  • Java nu are instrucțiuni BEGIN și END pentru blocuri, bucle și declarații de condiție. În schimb, trebuie să utilizați paranteza de deschidere () pentru ao închide.
  • Java este sensibil la minuscule, ceea ce înseamnă că dacă nu este același cu IF sau If sau iF.
  • Operatorul de atribuire Java este pur și simplu semnul "equals" (=), spre deosebire de caracterul complex PL: SQL (: =).
  • Când apelați o metodă care nu are un argument (cum ar fi metoda de ștergere din acest exemplu), este totuși necesar să specificați paranteze deschidere și închidere; în caz contrar, compilatorul Java va încerca să interpreteze metoda ca membru al clasei sau structurii de date.

PASUL 3. Compilarea, testarea și încărcarea clasei într-o bază de date Oracle

Pentru a compila clasa pe care am scris-o, trebuie să merg la directorul în care se află această clasă și să execute comanda javac din linia de comandă, folosind numele clasei ca argument:

D: \ Java> javac JDelete.java

Acum este logic să testați metoda înainte de ao încărca în baza de date. Este întotdeauna mai bine să creezi și să verifici imediat. Java oferă o modalitate ușoară de a face acest lucru: metoda principală. Dacă furnizați în clasa dvs. o metodă numită void care apelează principala și dați-i o listă validă de argumente, puteți apela apoi clasa și codul acesteia va fi executat. Adăugați metoda principală pentru JDelete, după cum se arată mai jos:







public class JDelete public static int delete
public static void principal (String args []) System.out.println (șterge (args [0]));
> // metoda principală
> // clasa JDelete

Cu alte cuvinte, metoda sună la ștergerea primei valori introduse în clasă și apoi afișează valoarea returnată. Acum trebuie să recompilați clasa și să o executați (acest exemplu este pornit din fereastra DOS):

D: \ Java> javac JDelete.java
D: \ Java> java JDelete c: \ temp \ te_employ.pks
1
D: \ Java> java JDelete c: \ temp \ te_employ.pks
0

Rețineți că prima dată când a fost apelat JDelete, a fost afișat 1 (TRUE), deoarece metoda mea a șters fișierul. Când această comandă a fost repornită, a fost afișat 0, deoarece metoda nu a putut șterge fișierul care nu există deja.

Acum că sunt sigur că metoda de ștergere funcționează, folosesc comanda loadjava pentru ao încărca. loadjava este un utilitar Oracle care se execută din linia de comandă a sistemului de operare, care încarcă elemente de cod Java (clase, fișiere jar și altele asemenea) într-o bază de date Oracle. Am încărcat clasa în schema SCOTT a bazei de date Oracle:

D: \ Java> loadjava -user scott / tigru -oci8 -resolve JDelete.class

Pentru a verifica dacă clasa a fost încărcată, solicit conținutul afișării dicționarului de date USER_OBJECTS (consultați Listă 1).

Acest lucru pune capăt problemelor asociate cu pașii specific Java. Este timpul să vă întoarcem la lumea familială a PL / SQL.

PASUL 4. Construirea unei specificații de apel PL / SQL

Vreau să dau tuturor posibilitatea de a se alătura instanței bazei mele de date pentru a șterge fișiere din PL / SQL. Pentru a realiza acest lucru, am crea o specificație de apel (cunoscut sub numele de spec apel), arată ca o funcție de PL / SQL, dar, de fapt, este doar un shell pentru a apela principal Java-cod:

Crearea sau înlocuirea funcției fDelete
(fișier IN VARCHAR2)
RETURN NUMBER
AS LIMBA JAVA
NAME 'JDelete.delete (java.lang.String)
return int ';
/

Punerea în aplicare funcția fDelete constă din linii care descriu apelul Java metodă. Lista de parametri trebuie să corespundă parametrilor metodei, dar în loc de fiecare parametru trebuie să specificați numele complet al unui tip de date exacte. (Java nu utilizează variabile globale, cu fiecare domeniu și metoda legat de clasă, și fiecare clasă face parte din pachetul Această ierarhie oferă un mecanism pentru calea completă și previne incoerențe în spațiul de nume.). În acest caz, înseamnă că eu nu pot apela doar string, dar în schimb pentru a adăuga numele complet al pachetului care conține clasa string. Clauza RETURN indică pur și simplu int pentru numere întregi. int este una dintre cele mai de bază tipuri de date Java, nu o clasă, prin urmare, este specificația sa completă.

PASUL 5. Crearea privilegiilor Oracle Database

Oracle8i oferă două noi roluri pentru a sprijini securitatea Java. Multe operațiuni orientate spre Java nu au nevoie de aceste roluri, dar dacă aveți nevoie să interacționați cu sistemul de operare, de exemplu, accesând sau schimbând fișierele sistemului de operare, trebuie să aveți rolul Javasyspriv sau Javauservpriv. Furnizarea acestui rol nu este diferită de furnizarea oricărui alt rol de bază de date. De exemplu, pentru ca SCOTT să efectueze orice operație Java, trebuie să executați următoarea comandă din contul SYSDBA:

GRANT JAVASYSPRIV LA SCOTT;

Dacă doriți să impuneți anumite restricții asupra a ceea ce un utilizator poate face cu Java, atunci în loc de aceasta, trebuie să executați această comandă:

GRANT JAVAUSERPRIV LA SCOTT;

Pentru a crea sau șterge un fișier utilizând Java, trebuie să aveți rolul JAVASYSPRIV; pentru a citi sau a scrie un fișier este suficient să aibă rolul de JAVAUSERPRIV.

Atunci când JServer este inițializat cu o mașină virtuală Java, este instalată o instanță Java Java Security Java Java java.lang .SecurityManager. Fiecare utilizator de bază de date are un ID dinamic (ID). care corespunde proprietarului sesiunii, atunci când utilizatorul accesează metode Java din PL / SQL. În cazul în care utilizatorul nu are suficiente privilegii, să încerce să execute operația, virtuală Java-masina de excludere excita java.lang.SecurityException (similar cu conceptul de câmp excepții în PL / SQL). În SQL * Plus veți vedea următoarele:

ORA-29532: Apel Java terminat de excepția excepțională Java: java.lang.SecurityException

La pornirea metodelor Java într-o bază de date, pot apărea diferite probleme de securitate, mai ales când programul interacționează cu sistemul de fișiere de pe server sau cu alte resurse ale sistemului de operare. Serverul de bază de date Oracle respectă una din cele două reguli pentru verificarea securității înainte de efectuarea operațiilor de I / O:

  • Dacă ID-ului dinamic este acordat privilegiul JAVASYSPRIV, Manager de securitate permite efectuarea operației;
  • În cazul în care identificatorul dinamic acordat privilegiul JAVAUSERPRIV, managerul de securitate urmează aceleași reguli care sunt utilizate de PL / SQL-pachet UTL_FILE pentru a determina dacă este permisă operațiunea, care precizează că dosarul trebuie să fie în directorul specificat în parametrul UTL_FILE_DIR în fișierul bază de date de inițializare .

PASUL 6. Apelarea programului PL / SQL

Acum, componentele Java sunt în vigoare, sunt furnizate privilegiile necesare, compilez funcția PL / SQL și apoi execut un trick magic, anterior dificil:

SQL> @ fdelete.sf
Funcția creată.
Intrarea este trunchiată la 12 caractere

SQL> exec DBMS_OUTPUT.PUT_LINE (
fdelete ('c: \ temp \ te_employee.pkb'))
1

SQL> exec DBMS_OUTPUT.PUT_LINE (
fdelete ('c: \ temp \ te_employee.pkb'))
0

De asemenea, puteți crea utilități bazate pe această funcție. De exemplu, puteți crea o procedură care șterge toate fișierele din rândurile unei tabele imbricate. Sau mai bine încă, puteți scrie o procedură care are ca intrare un nume de director și un filtru (de exemplu, „toate fișierele ca * tmp“) și șterge toate fișierele dintr-un director care trece filtrul.

O privire în viitor

Dacă nu ați mai folosit Java înainte, sper că acum vă veți spune: "Hei, este mai ușor decât am crezut!" Java are mai multe caracteristici decât am menționat în acest articol, dar exemplul JDelete ar trebui să vă dea un sentiment de încredere că utilizarea Java este posibilă. Încadrarea Java în aplicațiile PL / SQL poate fi, desigur, mult mai complexă, în funcție de ceea ce veți face. Voi discuta câteva dintre aceste probleme în următorul articol din această serie.

Java Glosar primar

Clasa A de blocuri de aplicații Java, o clasă este un grup de elemente de date (membri) cu care sunt asociate programe (metode) care efectuează operații pe aceste date. Pachetul PL / SQL este oarecum similar cu o clasă, cu excepția faptului că nu puteți crea un obiect separat de pachet, deci este mai mult ca o clasă Java statică.

Tipuri de date (tipuri de date) Totul în Java este definit printr-o clasă, cu excepția tipurilor de date elementare. Deci, String este o clasă, deci atunci când declarați o variabilă de tip String, creați un obiect bazat pe această clasă. Elementele Java de date elementare includ patru tipuri de numere întregi, precum și boolean, char, double și float.

Instanțierea Pentru a crea o instanță privată dintr-o structură mai generală, trebuie să declarați obiectul ca o implementare de instanță sau de clasă. În PL / SQL, puteți declara o înregistrare tip (TYPE) și apoi declarați o instanță a înregistrării pe baza acelui tip.

Clasa membru A poate conține orice număr de variabile, metode și alte clase (clase precum Java 1.1), toate denumite în mod colectiv membri ai clasei. O clasă poate fi definită în cadrul membrilor săi care conțin informații despre clasă ca întreg (membri statici) sau despre implementările obiectelor din această clasă. Membrii clasei sunt asemănători cu variabilele de nivel pachet în PL / SQL. Cu toate acestea, de fiecare dată când creați un obiect dintr-o clasă, primiți un nou set de membri. Pachetul are o singură implementare a datelor sale în timpul sesiunii bazei de date Oracle.

Metoda O metodă este un grup denumit de operatori de limbaj de programare Java care sunt asociați cu o anumită clasă și care pot fi numiți pentru obiecte care sunt implementări de clasă. În Java, puteți defini metode statice (numite și metode de clasă) care pot fi accesate direct din clasă fără a crea un obiect. Metoda principală este, de asemenea, declarată întotdeauna ca fiind statică.

Un obiect este, de asemenea, cunoscut ca o instanță, un obiect este un element de cod executabil care implementează în mod specific structura de bază a clasei. O clasă este un tip de tip generic (sortimente) care oferă structura și regulile pentru această structură. În general, un obiect este un element de date pe care îl manipulați în aplicația dvs.

Pachetul Un pachet este un element de limbă Java folosit pentru a grupa clasele conexe sub un nume comun. Toate pachetele din API-ul Java sunt grupate într-un singur pachet, numit java. În interiorul pachetului java există alte pachete grupate după funcționalitate, de exemplu pachetul java.util conține clasele principale de utilități.

Există sute de cărți dedicate programării în Java. Iată câteva dintre preferatele mele:

Pentru a verifica dacă clasa și metodele acesteia există în baza de date

solicitați conținutul dicționarului de date vizualizați USER_OBJECTS,

utilizând următoarea interogare:

# 9; SELECT nume_obiect, tip_obiect, stare, timestamp

# WHERE (nume_proiect nu este de acord cu 'SYS_%'

# 9; # 9; AND NAME_name nu-i place să creeze $%

# 9; # 9; # 9; AND nume_obiect nu-i place "JAVA $%"

# 9; # 9; AND NAME_name nu-i place "LOADLOB%")

# 9; ȘI object_type LIKE 'JAVA%'

ORDER BY object_type, object_name;

Iată rezultatul interogării:

# 9; Obiect Nume # 9; Tipul obiectului # 9; Starea # 9; # 9; Timestamp







Articole similare

Trimiteți-le prietenilor: