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.

  1. 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.

  1. 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:

  1. Escriure la funció en el llenguatge extern (per exemple, C).
  2. Compilar la funció i crear una biblioteca compartida.
  3. Crear una biblioteca en Oracle que apunti a la biblioteca compartida.
  4. Declarar la funció externa en PL/SQL.

2.3. Exemple pràctic

Pas 1: Escriure la funció en C

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

Pas 2: Compilar la funció

Compila la funció per crear una biblioteca compartida (per exemple, libadd.so en Linux).

gcc -shared -o libadd.so -fPIC add.c

Pas 3: Crear una biblioteca en Oracle

CREATE OR REPLACE LIBRARY my_lib AS '/path/to/libadd.so';

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;

  1. 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()

  1. 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

  1. Escriu una funció en C que multipliqui dos nombres.
  2. Compila la funció i crea una biblioteca compartida.
  3. Crea una biblioteca en Oracle que apunti a la biblioteca compartida.
  4. Declara la funció externa en PL/SQL.
  5. Utilitza la funció en un bloc PL/SQL per multiplicar dos nombres i mostrar el resultat.

Exercici 2: Interfície amb Python

  1. Escriu un script Python que es connecti a una base de dades Oracle.
  2. Executa una consulta per obtenir tots els registres d'una taula.
  3. Mostra els resultats de la consulta.

Solucions

Solució a l'Exercici 1

Funció en C

#include <stdio.h>

int multiply(int a, int b) {
    return a * b;
}

Compilar la funció

gcc -shared -o libmultiply.so -fPIC multiply.c

Crear una biblioteca en Oracle

CREATE OR REPLACE LIBRARY my_lib AS '/path/to/libmultiply.so';

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.

© Copyright 2024. Tots els drets reservats