Oracle Tipo di record PL/SQL con esempi

⚡ Riepilogo intelligente

Il tipo Record di PL/SQL è un tipo di dati complesso che raggruppa diverse colonne, ognuna con il proprio nome e tipo di dati, in un unico nuovo tipo. Un record può essere definito a livello di database come oggetto memorizzato o all'interno di una sottoprogramma, e i suoi campi sono accessibili tramite l'operatore punto.

  • 🧱 Definizione: Un tipo di record raggruppa una o più colonne in un unico nuovo tipo di dati.
  • 🔑 Parola chiave: La parola chiave TYPE indica al compilatore che si sta creando un nuovo tipo di dati.
  • ️ Due livelli: Un record a livello di database è un oggetto memorizzato; un record a livello di sottoprogramma è visibile solo all'interno di tale sottoprogramma.
  • 🔗 Accesso al campo: I campi vengono raggiunti come record_variabile.nome_colonna utilizzando l'operatore punto.
  • 📥 A livello di colonna: È possibile assegnare valori a un solo campo alla volta.
  • 📦 Livello di riga: Un'istruzione SELECT INTO può popolare un intero record a partire da una riga di una tabella.
  • 🧩 Tipi di record: Record %ROWTYPE basati su tabelle, record %ROWTYPE basati su cursori e record definiti dal programmatore.

Oracle Tipo di record PL/SQL

Che cos'è un tipo di record?

Un tipo record è un tipo di dati complesso che consente al programmatore di creare un nuovo tipo di dati con la struttura di colonne desiderata. Le sue caratteristiche principali sono:

  • Consente di raggruppare una o più colonne per formare un nuovo tipo di dati.
  • Ciascuna di queste colonne ha un proprio nome e un proprio tipo di dati.
  • Un tipo di record può accettare i dati come un singolo record composto da più colonne, oppure può accettare il valore di una particolare colonna di un record.
  • Un tipo record è semplicemente un nuovo tipo di dati. Una volta creato, viene memorizzato come un nuovo tipo di dati e può essere utilizzato per dichiarare una variabile nei programmi.
  • Utilizza la parola chiave 'TIPO' per indicare al compilatore che si sta creando un nuovo tipo di dati.
  • Può essere creato al livello del database, memorizzato come oggetto del database e utilizzato in tutto il database, oppure al livello del sottoprogrammavisibile solo all'interno del sottoprogramma.
  • È possibile dichiarare un tipo di record a livello di database anche per le colonne di una tabella, in modo che una singola colonna possa contenere dati complessi.
  • I dati vengono acceduti facendo riferimento al nome della variabile, quindi all'operatore punto (.), quindi al nome della colonna, come ' . '.

Sintassi per dichiarare un tipo di record

Sintassi per la dichiarazione a livello di database:

Dichiarazione del tipo di record a livello di database

CREATE TYPE <type_name_db> IS RECORD
(
<column 1> <datatype>,
);

Nella prima sintassi, la parola chiave 'CREATE TYPE' indica al compilatore di creare il tipo di record denominato "type_name_db" con le colonne specificate come oggetto database. Questa istruzione viene fornita singolarmente, non all'interno di alcun blocco.

Sintassi per la dichiarazione a livello di sottoprogramma:

Dichiarazione del tipo di record a livello di sottoprogramma

DECLARE
TYPE <type_name> IS RECORD
(
<column1> <datatype>,
);
BEGIN
<execution_section>;
END;

In questa sintassi, creiamo il tipo di record denominato "type_name" solo all'interno della sottoprogramma. In entrambi i metodi, il modo di definire la colonna e il tipo di dati è simile.

Esempio 1: Tipo di record come oggetto di database

In questo programma, vediamo come creare un tipo di record come oggetto di database. Creiamo il tipo di record 'emp_det' con quattro colonne. Le colonne e i relativi tipi di dati sono:

  • EMP_NO (NUMERO)
  • NOME_EMP (VARCHAR2 (150))
  • RESPONSABILE (NUMERO)
  • STIPENDIO (NUMERO)
CREATE TYPE emp_det IS OBJECT
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
/

Produzione:

Type created

Code Spiegazione

  • Il codice sopra riportato crea il tipo emp_det come oggetto del database.
  • È composto da 4 colonne: emp_no, emp_name, manager e salary, come definito.
  • Ora 'emp_det' è simile a qualsiasi altro tipo di dati (come NUMBER o VARCHAR2) ed è visibile in tutto il database. Pertanto, può essere utilizzato ovunque nel database per dichiarare una variabile di questo tipo.

Esempio 2: Accesso a livello di sottoprogramma e a livello di colonna

In questo esempio, vediamo come creare un tipo di record a livello di sottoprogramma e come popolarlo e recuperare i valori per colonna. Creiamo il tipo di record 'emp_det' a livello di sottoprogramma e lo utilizziamo per popolare e visualizzare i dati.

Esempio di accesso a livello di colonna del tipo di record

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
guru99_emp_rec.emp_no:= 1001;
guru99_emp_rec.emp_name:= 'XXX';
guru99_emp_rec.manager:= 1000;
guru99_emp_rec.salary:= 10000;
dbms_output.put_line('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: ' ||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

Produzione:

Employee Detail
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000

Code Spiegazione

  • Code righe 2-8: Il tipo di record 'emp_det' è dichiarato con le colonne emp_no, emp_name, manager e salary di tipo dati NUMBER, VARCHAR2, NUMBER e NUMBER.
  • Code riga 9: La variabile guru99_emp_rec è dichiarata come tipo di dati 'emp_det'. Questo variabile può contenere un valore che include tutti e quattro i campi.
  • Code riga 11: Compilando il campo 'emp_no' di 'guru99_emp_rec' con il valore 1001.
  • Code riga 12: Inserimento del valore XXX nel campo 'emp_name'.
  • Code riga 13: Inserimento del valore 1000 nel campo 'manager'.
  • Code riga 14: Inserimento del valore 10000 nel campo 'stipendio'.
  • Code righe 15-19: Visualizzazione del valore di 'guru99_emp_rec' nell'output.

Esempio 3: Accesso a livello di riga a livello di sottoprogramma

In questo esempio, vediamo come creare un tipo di record a livello di sottoprogramma e popolarlo a livello di riga. Creiamo il tipo di record 'emp_det' a livello di sottoprogramma e lo utilizziamo per popolare e visualizzare i dati.

Esempio di accesso a livello di riga del tipo di record

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);
COMMIT;
SELECT emp_no, emp_name, salary, manager INTO guru99_emp_rec FROM emp WHERE emp_no=1002;
dbms_output.put_line ('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: '||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

Code Spiegazione

  • Code righe 2-8: Il tipo di record 'emp_det' è dichiarato con le colonne emp_no, emp_name, manager e salary di tipo dati NUMBER, VARCHAR2, NUMBER e NUMBER.
  • Code riga 9: La variabile guru99_emp_rec è dichiarata come tipo di dati 'emp_det' e può contenere tutti e quattro i campi.
  • Code riga 11: Popolamento della tabella emp con 1002 come emp_no, YYY come emp_name, 15000 come stipendio e 1000 come numero del responsabile.
  • Code riga 12: Commiting della transazione di inserimento.
  • Code riga 13: Popolamento della variabile 'guru99_emp_rec' a livello di riga dalla query SELECT per il dipendente numero 1002.
  • Code righe 15-19: Visualizzazione del valore di 'guru99_emp_rec' nell'output.

Produzione:

Employee Detail
Employee Number: 1002
Employee Name: YYY
Employee Salary: 1000
Employee Manager Number: 15000

Nota: Un tipo di record può essere acceduto solo a livello di colonna quando si reindirizza il suo valore a una qualsiasi modalità di output. Si noti che in questo esempio l'ordine dell'elenco SELECT non corrisponde all'ordine dei campi del record, motivo per cui i valori di stipendio e responsabile appaiono scambiati nell'output.

Tipi di record PL/SQL

Oltre al record definito dal programmatore mostrato sopra, Oracle Offre due tipi di record ancorati che copiano automaticamente la loro struttura. Il loro utilizzo evita di ridichiarare le colonne e mantiene il record allineato alla tabella o al cursore su cui si basa.

Tipo di record Dichiarato con La struttura deriva da
record basato su tabella table_name%ROWTYPE Tutte le colonne di una tabella
Record basato sul cursore nome_cursore%ROWTYPE Elenco di selezione del cursore
Record definito dal programmatore TIPO … È REGISTRAZIONE Colonne che elenchi manualmente

Un record %ROWTYPE è la scelta più sicura quando la forma deve seguire una tabella o un cursore, perché una modifica alla colonna viene rilevata automaticamente alla successiva compilazione.

DOMANDE FREQUENTI

Un record raggruppa diverse colonne, potenzialmente di tipi diversi, in un'unica struttura a riga. Una collezione contiene molti elementi dello stesso tipo, indicizzati da un indice. Spesso vengono combinati, formando una collezione di record.

%ROWTYPE dichiara un record i cui campi corrispondono automaticamente a una tabella o a un cursore. Utilizzalo quando il record deve rispecchiare tale origine, in modo che una modifica a una colonna venga riflessa senza dover modificare la dichiarazione.

Sì, se entrambi i record sono dello stesso tipo. SELECT INTO può anche riempire un intero record da una riga di tabella, a condizione che l'ordine dell'elenco di selezione corrisponda all'ordine dei campi del record.

Sì. L'IA può leggere la definizione di una tabella e produrre un blocco TYPE … IS RECORD corrispondente, oppure consigliare un %ROWTYPE laddove sia preferibile un collegamento diretto alla tabella. Verificare i tipi di dati prima dell'uso.

Un record a livello di database viene creato con CREATE TYPE e memorizzato come oggetto visibile in tutto il database. Un record a livello di sottoprogramma viene dichiarato all'interno di un blocco ed esiste solo all'interno di quel sottoprogramma.

Riassumi questo post con: