En aquest tema, explorarem com PL/SQL pot interactuar amb altres llenguatges de programació i sistemes externs. Aquesta capacitat és crucial per a la integració de PL/SQL en aplicacions més grans i complexes, on la comunicació entre diferents tecnologies és essencial.
Objectius del tema
- Comprendre com PL/SQL pot interactuar amb altres llenguatges de programació.
- Aprendre a utilitzar les funcions externes en PL/SQL.
- Veure exemples pràctics d'integració amb altres llenguatges.
- Realitzar exercicis pràctics per reforçar els conceptes apresos.
- Introducció a l'interfície amb altres llenguatges
PL/SQL és un llenguatge potent per a la programació de bases de dades Oracle, però sovint necessitem que interactuï amb altres llenguatges de programació per a tasques específiques o per integrar-se en aplicacions més grans. Això es pot aconseguir de diverses maneres, com ara:
- Funcions externes: PL/SQL pot cridar funcions escrites en altres llenguatges com C.
- APIs de bases de dades: Llenguatges com Java, Python, i .NET tenen APIs que permeten interactuar amb bases de dades Oracle.
- Serveis web: PL/SQL pot consumir i exposar serveis web per a la comunicació amb altres sistemes.
- Funcions externes
2.1. Què són les funcions externes?
Les funcions externes són funcions escrites en altres llenguatges de programació (com C) que es poden cridar des de PL/SQL. Això permet aprofitar la potència i les biblioteques d'altres llenguatges dins de PL/SQL.
2.2. Com definir una funció externa
Per definir una funció externa en PL/SQL, seguirem aquests passos:
- Escriure la funció en el llenguatge extern (per exemple, C).
- Compilar la funció i crear una biblioteca compartida.
- Crear una biblioteca en Oracle que apunti a la biblioteca compartida.
- Declarar la funció externa en PL/SQL.
2.3. Exemple pràctic
Pas 1: Escriure la funció en C
Pas 2: Compilar la funció
Compila la funció per crear una biblioteca compartida (per exemple, libadd.so en Linux).
Pas 3: Crear una biblioteca en Oracle
Pas 4: Declarar la funció externa en PL/SQL
CREATE OR REPLACE FUNCTION add_numbers(a IN PLS_INTEGER, b IN PLS_INTEGER)
RETURN PLS_INTEGER
AS
EXTERNAL
LIBRARY my_lib
NAME "add"
LANGUAGE C;Pas 5: Utilitzar la funció en PL/SQL
DECLARE
result PLS_INTEGER;
BEGIN
result := add_numbers(10, 20);
DBMS_OUTPUT.PUT_LINE('Result: ' || result);
END;
- APIs de bases de dades
3.1. Interfície amb Java
Oracle proporciona JDBC (Java Database Connectivity) per permetre que les aplicacions Java interactuïn amb bases de dades Oracle.
Exemple de codi Java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class OracleJDBCExample {
public static void main(String[] args) {
try {
// Carregar el driver JDBC
Class.forName("oracle.jdbc.driver.OracleDriver");
// Establir la connexió
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "username", "password");
// Crear una sentència
Statement stmt = conn.createStatement();
// Executar una consulta
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
// Processar els resultats
while (rs.next()) {
System.out.println("Employee ID: " + rs.getInt("employee_id"));
}
// Tancar la connexió
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}3.2. Interfície amb Python
Python utilitza el mòdul cx_Oracle per connectar-se a bases de dades Oracle.
Exemple de codi Python
import cx_Oracle
# Establir la connexió
conn = cx_Oracle.connect('username/password@localhost:1521/xe')
# Crear un cursor
cursor = conn.cursor()
# Executar una consulta
cursor.execute("SELECT * FROM employees")
# Processar els resultats
for row in cursor:
print("Employee ID:", row[0])
# Tancar la connexió
conn.close()
- Serveis web
PL/SQL pot consumir i exposar serveis web utilitzant UTL_HTTP i altres paquets.
4.1. Consumir un servei web
DECLARE
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
buffer VARCHAR2(32767);
BEGIN
req := UTL_HTTP.BEGIN_REQUEST('http://example.com/api/data');
resp := UTL_HTTP.GET_RESPONSE(req);
LOOP
UTL_HTTP.READ_LINE(resp, buffer, TRUE);
DBMS_OUTPUT.PUT_LINE(buffer);
END LOOP;
UTL_HTTP.END_RESPONSE(resp);
END;Exercicis pràctics
Exercici 1: Crear i utilitzar una funció externa
- Escriu una funció en C que multipliqui dos nombres.
- Compila la funció i crea una biblioteca compartida.
- Crea una biblioteca en Oracle que apunti a la biblioteca compartida.
- Declara la funció externa en PL/SQL.
- Utilitza la funció en un bloc PL/SQL per multiplicar dos nombres i mostrar el resultat.
Exercici 2: Interfície amb Python
- Escriu un script Python que es connecti a una base de dades Oracle.
- Executa una consulta per obtenir tots els registres d'una taula.
- Mostra els resultats de la consulta.
Solucions
Solució a l'Exercici 1
Funció en C
Compilar la funció
Crear una biblioteca en Oracle
Declarar la funció externa en PL/SQL
CREATE OR REPLACE FUNCTION multiply_numbers(a IN PLS_INTEGER, b IN PLS_INTEGER)
RETURN PLS_INTEGER
AS
EXTERNAL
LIBRARY my_lib
NAME "multiply"
LANGUAGE C;Utilitzar la funció en PL/SQL
DECLARE
result PLS_INTEGER;
BEGIN
result := multiply_numbers(10, 20);
DBMS_OUTPUT.PUT_LINE('Result: ' || result);
END;Solució a l'Exercici 2
Script Python
import cx_Oracle
# Establir la connexió
conn = cx_Oracle.connect('username/password@localhost:1521/xe')
# Crear un cursor
cursor = conn.cursor()
# Executar una consulta
cursor.execute("SELECT * FROM employees")
# Processar els resultats
for row in cursor:
print("Employee ID:", row[0])
# Tancar la connexió
conn.close()Conclusió
En aquesta secció, hem après com PL/SQL pot interactuar amb altres llenguatges de programació i sistemes externs. Hem vist com definir i utilitzar funcions externes, com interactuar amb bases de dades Oracle des de Java i Python, i com consumir serveis web des de PL/SQL. Aquests coneixements són essencials per a la integració de PL/SQL en aplicacions més grans i complexes.
Curs de PL/SQL
Mòdul 1: Introducció a PL/SQL
Mòdul 2: Fonaments de PL/SQL
- Estructura del bloc PL/SQL
- Variables i tipus de dades
- Estructures de control
- Cursors
- Gestió d'excepcions
