marți, 18 noiembrie 2008

Oracle si Proceduri Stocate Java

Incepand cu versiunea Oracle 8i serverul de baze de date contine o masina virtuala nativa. Acest lucrul inseamna ca se pot stoca proceduri/programe scrise in java direct in baza de date. Acest lucru este util daca doriti sa adaugati functionalitati noi serverului. In cele ce urmeaza vom crea o clasa simpla care va contine o metoda cu un parametru de tip java.lang.String. Aceasta metoda va reprezenta de fapt procedura stocata.

Presupun ca se foloseste ca mediu de dezvoltare eclipse. Creati un proiect de tip "Java project". Adaugati ca referinta ojdbc14.jar(driver-ul jdbc pentru Oracle). In acest moment suntem gata sa adaugam clasa dorita.

package ro.teste.sp;

public class TesteSP
{
public static void WriteMessage(String msg) throws SQLException
{
Connection con = DriverManager.getConnection("jdbc:default:connection");

System.out.println("S-a transmis din PL/SQL: " + msg);
}
}


Pasul 2: se incarca clasa in baza de date

loadjava -user user/passwd@db TesteSP.java

Pasul 3: se creaza un wrapper in baza de date.

CREATE OR REPLACE PROCEDURE WrapJava1(msg VARCHAR2)
AS
LANGUAGE java
NAME 'ro.teste.sp.TesteSP.WriteMessage(java.lang.String)';

Pasul 4: executam procedura creata

CALL WrapJava1('Salutari');

Acest exemplu este unul extrem de simplu. Puteti crea exemple mai complicate. De exemplu, poate dorit sa generati o imagine pe baza unui anumite inregistrari. Sper ca veti gasi multe aplicatii pentru aceasta facilitate oferita de Oracle.

Observatii: Ar trebui sa observati un mod ciudat de obtinere a unei conexiuni la baza de date. Desi in acest exemplu, conexiune obtinuta nu este folosita este de retinut acest mod de conectare. Intrucat, metoda ruleaza in interiorul bazei de date, jdbc:default:connection ofera conexiunea curenta metodei.

Daca va placut acest articol sau daca il gasiti util nu ezitati sa adaugati un comentariu.

Cosnita Radu Viorel!

vineri, 7 noiembrie 2008

Oracle si JavaBean

In continuare voi arata cum se poate integra un JavaBean in Oracle Forms. Principala problema este ca cei de la Oracle nu ofera documentatie pentru frameworkul dezvoltat, asa ca ce ramane de facut este sa faceti un search pe google si sa studiati cat mai multe posturi. In continuare voi implementa un simplu JavaBean care va furniza un text catre Oracle Forms.

Pasul 1 este sa adaugati o referinta catre frmall.jar care se gaseste in locul in care ati instala Oracle Developer Suite/forms/java.

Pasul 2 este sa compilati urmatorul cod:

package ro.javabeans;

import oracle.forms.handler.IHandler;
import oracle.forms.properties.ID;
import oracle.forms.ui.CustomEvent;
import oracle.forms.ui.VBean;

public class HelloWorld extends VBean
{
private static IHandler myHandler;
protected static final ID MESAJ = ID.registerProperty("MESAJ");
private String msg;
public void setMsg(String s)
{
this.msg = s;
}
public String getMsg()
{
return this.msg;
}

public void init(IHandler handler)
{
myHandler = handler;
super.init(handler);
}

public boolean setProperty(ID property, Object value)
{
if(property == MESAJ)
{
this.setMsg((String)value);
return true;
}

return super.setProperty(property, value);
}

public Object getProperty(ID property)
{
if(property == MESAJ)
return this.getMsg();

return super.getProperty(property);
}

public void dispatchEvent(ID id)
{
CustomEvent ce = new CustomEvent(myHandler, id);
dispatchCustomEvent(ce);
}
}

Pasul 3: Consider ca ar trebui sa explic de ce se face asa. In primul rand, handler-ul pe care il setam ofera acces la diverse elemente din mediul forms.
protected static final ID MESAJ = ID.registerProperty("MESAJ") este importanta intrucat inregistreaza atribute ale bean-ului care vor putea fi referite in forms. Textul dintre ghilimele este case sensitive, asa ca recomand folosirea de majuscule.
setProperty si getProperty sunt foarte asemenatoare cu functiile getter/setter clasice. Ele sunt folosite in momentul in care se seteaza valoarea unui atribut din forms sau se cere valoarea unui atribut din forms.
Metoda dispatchEvent este folosita pentru a declansa evenimente ce pot fi captate in Oracle Forms.

Pasul 4: Exportarea proiectului creat mai sus intr-un jar.

Pasul 5: Trebuie modificat in fisierul DevsuiteHome/forms/server/formsweb.cfg valoarea pentru archive=....., nume.jar

Pasul 6: Se creeaza un formular si se adauga un item de tip JavaBean. La implementation class se seteaza: ro.javabeans.HelloWorld.

Pasul 7: Se adauga un trigger: when-new-form-instance care contine urmatorul cod:
declare
msg VARCHAR2(200) := 'Va pup pe toti';
begin
SET_CUSTOM_PROPERTY('BLOCK3.BEAN4', 1, 'MESAJ', 'SALUTARI');
end;

Observatii: Am presupus ca bean-ul se afla in data-block-ul BLOCK3 si se numeste BEAN4.
SET_CUSTOM_PROPERTY este un built-in folosit pentru a seta un atribut al bean-ului.

Pasul 8: Se adauga un item de tip buton.
Pasul 9: Se adauga un trigger pentru acest button de tip: when-mouse-click, cu urmatorul cod:
declare
msg VARCHAR2(2000) := GET_CUSTOM_PROPERTY('BLOCK3.BEAN4', 1, 'MESAJ');
begin
MESSAGE(msg);
end;

Observatii: GET_CUSTOM_PROPERTY este un builtin folosit pentru a returna valoarea atributului specificat.

Pasul 10:Rularea propriu-zisa a aplicatie.

Se observa ca integrarea dintre forms si java este destul de greoaie dar uneori merita intrucat se pot face lucruri complicate care sa adauge functionalitati noi la Oracle Forms.

Exemple de astfel de aplicatii: Transferul de tip FTP, Transmiterea de email-uri(se poate face si fara Java), generarea de imagini, etc..... Intr-un post viitor voi arata cum se pot imbina date dintr-un Oracle Forms cu un bean java pentru a genera imagini.