En aquest tema, aprendrem com interactuar amb bases de dades utilitzant REXX. Això inclou la connexió a una base de dades, l'execució de consultes SQL, la manipulació de dades i la gestió d'errors. Aquest coneixement és essencial per desenvolupar aplicacions que necessiten emmagatzemar i recuperar dades de manera eficient.
Objectius del Tema
- Entendre com connectar-se a una base de dades des de REXX.
- Aprendre a executar consultes SQL.
- Manipular dades de la base de dades.
- Gestionar errors durant les operacions de base de dades.
- Connexió a una Base de Dades
1.1. Configuració de l'Entorn
Abans de començar, assegura't que tens instal·lats els controladors necessaris per a la base de dades amb la qual treballaràs (per exemple, DB2, MySQL, etc.). També necessitaràs les credencials d'accés a la base de dades.
1.2. Exemple de Connexió
A continuació, es mostra un exemple de com connectar-se a una base de dades DB2 utilitzant REXX:
/* Connexió a una base de dades DB2 */ ADDRESS TSO "SUBCOM DSNREXX LOAD" ADDRESS DSNREXX "CONNECT" "DSN" "USER(username)" "USING(password)" IF SQLCODE \= 0 THEN SAY "Connexió a la base de dades fallida. SQLCODE:" SQLCODE ELSE SAY "Connexió a la base de dades reeixida."
Explicació del Codi:
ADDRESS TSO "SUBCOM DSNREXX LOAD"
: Carrega el subcomandament DSNREXX.ADDRESS DSNREXX "CONNECT" "DSN" "USER(username)" "USING(password)"
: Intenta connectar-se a la base de dades amb les credencials proporcionades.IF SQLCODE \= 0 THEN
: Comprova si la connexió ha estat reeixida (SQLCODE
és 0 si la connexió és reeixida).
- Execució de Consultes SQL
2.1. Consultes SELECT
Per recuperar dades d'una base de dades, utilitzem la instrucció SELECT
. A continuació es mostra un exemple:
/* Executar una consulta SELECT */ ADDRESS DSNREXX "EXECSQL DECLARE C1 CURSOR FOR S1" ADDRESS DSNREXX "EXECSQL PREPARE S1 INTO :SQLSTMT FROM :QUERY" ADDRESS DSNREXX "EXECSQL OPEN C1" DO WHILE SQLCODE = 0 ADDRESS DSNREXX "EXECSQL FETCH C1 INTO :RESULT" IF SQLCODE = 0 THEN SAY "Resultat: " RESULT END ADDRESS DSNREXX "EXECSQL CLOSE C1"
Explicació del Codi:
DECLARE C1 CURSOR FOR S1
: Declara un cursor per a la consulta.PREPARE S1 INTO :SQLSTMT FROM :QUERY
: Prepara la consulta SQL.OPEN C1
: Obre el cursor.FETCH C1 INTO :RESULT
: Recupera les files una per una.CLOSE C1
: Tanca el cursor.
2.2. Consultes INSERT, UPDATE, DELETE
Per modificar dades, utilitzem les instruccions INSERT
, UPDATE
i DELETE
. A continuació es mostra un exemple d'inserció:
/* Executar una consulta INSERT */ ADDRESS DSNREXX "EXECSQL INSERT INTO my_table (col1, col2) VALUES ('value1', 'value2')" IF SQLCODE \= 0 THEN SAY "Inserció fallida. SQLCODE:" SQLCODE ELSE SAY "Inserció reeixida."
Explicació del Codi:
INSERT INTO my_table (col1, col2) VALUES ('value1', 'value2')
: Insereix una nova fila a la taulamy_table
.
- Manipulació de Dades
3.1. Exemple de Manipulació
A continuació es mostra un exemple complet que combina la connexió, la consulta i la manipulació de dades:
/* Connexió a la base de dades */ ADDRESS TSO "SUBCOM DSNREXX LOAD" ADDRESS DSNREXX "CONNECT" "DSN" "USER(username)" "USING(password)" IF SQLCODE \= 0 THEN SAY "Connexió a la base de dades fallida. SQLCODE:" SQLCODE ELSE DO SAY "Connexió a la base de dades reeixida." /* Executar una consulta SELECT */ QUERY = "SELECT col1, col2 FROM my_table" ADDRESS DSNREXX "EXECSQL DECLARE C1 CURSOR FOR S1" ADDRESS DSNREXX "EXECSQL PREPARE S1 INTO :SQLSTMT FROM :QUERY" ADDRESS DSNREXX "EXECSQL OPEN C1" DO WHILE SQLCODE = 0 ADDRESS DSNREXX "EXECSQL FETCH C1 INTO :RESULT" IF SQLCODE = 0 THEN SAY "Resultat: " RESULT END ADDRESS DSNREXX "EXECSQL CLOSE C1" /* Executar una consulta INSERT */ ADDRESS DSNREXX "EXECSQL INSERT INTO my_table (col1, col2) VALUES ('value1', 'value2')" IF SQLCODE \= 0 THEN SAY "Inserció fallida. SQLCODE:" SQLCODE ELSE SAY "Inserció reeixida." /* Tancar la connexió */ ADDRESS DSNREXX "DISCONNECT" END
- Gestió d'Errors
4.1. Exemple de Gestió d'Errors
És important gestionar els errors adequadament per assegurar la robustesa de l'aplicació. A continuació es mostra un exemple de com gestionar errors:
/* Connexió a la base de dades */ ADDRESS TSO "SUBCOM DSNREXX LOAD" ADDRESS DSNREXX "CONNECT" "DSN" "USER(username)" "USING(password)" IF SQLCODE \= 0 THEN SAY "Connexió a la base de dades fallida. SQLCODE:" SQLCODE ELSE DO SAY "Connexió a la base de dades reeixida." /* Intentar executar una consulta */ ADDRESS DSNREXX "EXECSQL SELECT col1 FROM my_table WHERE col2 = 'value'" IF SQLCODE \= 0 THEN SAY "Consulta fallida. SQLCODE:" SQLCODE ELSE SAY "Consulta reeixida. Resultat: " RESULT /* Tancar la connexió */ ADDRESS DSNREXX "DISCONNECT" END
Exercicis Pràctics
Exercici 1: Connexió i Consulta
- Connecta't a una base de dades de prova.
- Executa una consulta
SELECT
per recuperar totes les files d'una taula. - Mostra els resultats a la consola.
Exercici 2: Inserció de Dades
- Connecta't a una base de dades de prova.
- Insereix una nova fila en una taula.
- Verifica que la fila ha estat inserida correctament executant una consulta
SELECT
.
Exercici 3: Gestió d'Errors
- Connecta't a una base de dades de prova.
- Intenta executar una consulta amb un error intencionat (per exemple, una taula que no existeix).
- Gestiona l'error i mostra un missatge adequat a la consola.
Solucions
Solució a l'Exercici 1
/* Connexió a la base de dades */ ADDRESS TSO "SUBCOM DSNREXX LOAD" ADDRESS DSNREXX "CONNECT" "DSN" "USER(username)" "USING(password)" IF SQLCODE \= 0 THEN SAY "Connexió a la base de dades fallida. SQLCODE:" SQLCODE ELSE DO SAY "Connexió a la base de dades reeixida." /* Executar una consulta SELECT */ QUERY = "SELECT * FROM test_table" ADDRESS DSNREXX "EXECSQL DECLARE C1 CURSOR FOR S1" ADDRESS DSNREXX "EXECSQL PREPARE S1 INTO :SQLSTMT FROM :QUERY" ADDRESS DSNREXX "EXECSQL OPEN C1" DO WHILE SQLCODE = 0 ADDRESS DSNREXX "EXECSQL FETCH C1 INTO :RESULT" IF SQLCODE = 0 THEN SAY "Resultat: " RESULT END ADDRESS DSNREXX "EXECSQL CLOSE C1" ADDRESS DSNREXX "DISCONNECT" END
Solució a l'Exercici 2
/* Connexió a la base de dades */ ADDRESS TSO "SUBCOM DSNREXX LOAD" ADDRESS DSNREXX "CONNECT" "DSN" "USER(username)" "USING(password)" IF SQLCODE \= 0 THEN SAY "Connexió a la base de dades fallida. SQLCODE:" SQLCODE ELSE DO SAY "Connexió a la base de dades reeixida." /* Executar una consulta INSERT */ ADDRESS DSNREXX "EXECSQL INSERT INTO test_table (col1, col2) VALUES ('value1', 'value2')" IF SQLCODE \= 0 THEN SAY "Inserció fallida. SQLCODE:" SQLCODE ELSE SAY "Inserció reeixida." /* Verificar la inserció */ QUERY = "SELECT * FROM test_table WHERE col1 = 'value1'" ADDRESS DSNREXX "EXECSQL DECLARE C1 CURSOR FOR S1" ADDRESS DSNREXX "EXECSQL PREPARE S1 INTO :SQLSTMT FROM :QUERY" ADDRESS DSNREXX "EXECSQL OPEN C1" DO WHILE SQLCODE = 0 ADDRESS DSNREXX "EXECSQL FETCH C1 INTO :RESULT" IF SQLCODE = 0 THEN SAY "Resultat: " RESULT END ADDRESS DSNREXX "EXECSQL CLOSE C1" ADDRESS DSNREXX "DISCONNECT" END
Solució a l'Exercici 3
/* Connexió a la base de dades */ ADDRESS TSO "SUBCOM DSNREXX LOAD" ADDRESS DSNREXX "CONNECT" "DSN" "USER(username)" "USING(password)" IF SQLCODE \= 0 THEN SAY "Connexió a la base de dades fallida. SQLCODE:" SQLCODE ELSE DO SAY "Connexió a la base de dades reeixida." /* Intentar executar una consulta amb error */ ADDRESS DSNREXX "EXECSQL SELECT * FROM non_existent_table" IF SQLCODE \= 0 THEN SAY "Consulta fallida. SQLCODE:" SQLCODE ELSE SAY "Consulta reeixida. Resultat: " RESULT /* Tancar la connexió */ ADDRESS DSNREXX "DISCONNECT" END
Conclusió
En aquest tema, hem après com connectar-nos a una base de dades, executar consultes SQL, manipular dades i gestionar errors utilitzant REXX. Aquestes habilitats són fonamentals per desenvolupar aplicacions que necessiten interactuar amb bases de dades. Practica els exercicis proporcionats per consolidar els teus coneixements i estar preparat per a projectes més avançats.
Curs de Programació REXX
Mòdul 1: Introducció a REXX
- Què és REXX?
- Configuració de l'Entorn REXX
- Hola Món en REXX
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
Mòdul 2: Conceptes Bàsics de Programació
- Operadors i Expressions
- Estructures de Control: IF/THEN/ELSE
- Bucles: DO i LEAVE
- Entrada i Sortida
- Manipulació Bàsica de Cadenes
Mòdul 3: Programació Intermèdia en REXX
- Funcions i Subrutines
- Funcions Incorporades
- Gestió d'Errors
- Operacions d'Entrada/Sortida de Fitxers
- Treballant amb Arrays
Mòdul 4: Programació Avançada en REXX
- Manipulació Avançada de Cadenes
- Tècniques de Parsing
- Interfície amb Programes Externs
- Macros REXX
- Optimització del Rendiment