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