Oracle Type d'enregistrements PL/SQL avec exemples

โšก Rรฉsumรฉ intelligent

Le type Enregistrement PL/SQL est un type de donnรฉes complexe qui regroupe plusieurs colonnes, chacune ayant son propre nom et son propre type de donnรฉes, en un seul type. Un enregistrement peut รชtre dรฉfini au niveau de la base de donnรฉes comme un objet stockรฉ ou dans un sous-programme, et ses champs sont accessibles ร  l'aide de l'opรฉrateur point.

  • ๐Ÿงฑ Dรฉfinition: Un type d'enregistrement regroupe une ou plusieurs colonnes en un seul nouveau type de donnรฉes.
  • (I.e. Mot-clรฉ: Le mot-clรฉ TYPE indique au compilateur qu'un nouveau type de donnรฉes est en cours de crรฉation.
  • ๏ธ Deux niveaux : Un enregistrement au niveau de la base de donnรฉes est un objet stockรฉ ; un enregistrement au niveau du sous-programme nโ€™est visible quโ€™ร  lโ€™intรฉrieur de ce sous-programme.
  • ๐Ÿ”— Accรจs au terrain : Les champs sont accessibles sous la forme record_variable.column_name en utilisant l'opรฉrateur point.
  • (I.e. Niveau de colonne : Il est possible d'attribuer des valeurs ร  un seul champ ร  la fois.
  • ๐Ÿ“ฆ Au niveau de la ligne : Une instruction SELECT INTO permet de remplir un enregistrement complet ร  partir d'une ligne de table.
  • ๐Ÿงฉ Types d'enregistrements : %ROWTYPE basรฉ sur une table, %ROWTYPE basรฉ sur un curseur et enregistrements dรฉfinis par le programmeur.

Oracle Type d'enregistrement PL/SQL

Qu'est-ce qu'un type d'enregistrement ?

Un type d'enregistrement est un type de donnรฉes complexe qui permet au programmeur de crรฉer un nouveau type de donnรฉes avec la structure de colonnes souhaitรฉe. Ses principales caractรฉristiques sont :

  • Il regroupe une ou plusieurs colonnes pour former un nouveau type de donnรฉes.
  • Chacune de ces colonnes possรจde son propre nom et son propre type de donnรฉes.
  • Un type d'enregistrement peut accepter les donnรฉes sous la forme d'un enregistrement unique composรฉ de plusieurs colonnes, ou il peut accepter la valeur d'une colonne particuliรจre d'un enregistrement.
  • Un type d'enregistrement est simplement un nouveau type de donnรฉes. Une fois crรฉรฉ, il est stockรฉ comme un nouveau type de donnรฉes et peut รชtre utilisรฉ pour dรฉclarer une variable dans les programmes.
  • Il utilise le mot-clรฉ 'TAPER' pour indiquer au compilateur qu'un nouveau type de donnรฉes est en cours de crรฉation.
  • Il peut รชtre crรฉรฉ au niveau de base de donnรฉes, stockรฉ en tant qu'objet de base de donnรฉes et utilisรฉ dans toute la base de donnรฉes, ou au niveau de niveau du sous-programme, visible uniquement ร  l'intรฉrieur du sous-programme.
  • Un type d'enregistrement au niveau de la base de donnรฉes peut รฉgalement รชtre dรฉclarรฉ pour les colonnes de table, afin qu'une seule colonne puisse contenir des donnรฉes complexes.
  • Les donnรฉes sont accessibles en faisant rรฉfรฉrence au nom de la variable, puis ร  l'opรฉrateur point (.), puis au nom de la colonne, comme ' . '.

Syntaxe pour dรฉclarer un type d'enregistrement

Syntaxe de dรฉclaration au niveau de la base de donnรฉes :

Dรฉclaration du type d'enregistrement au niveau de la base de donnรฉes

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

Dans la premiรจre syntaxe, le mot-clรฉ ยซ CREATE TYPE ยป indique au compilateur de crรฉer un objet de base de donnรฉes de type enregistrement nommรฉ ยซ type_name_db ยป avec les colonnes spรฉcifiรฉes. Cette instruction est fournie individuellement, hors de tout bloc.

Syntaxe pour la dรฉclaration au niveau du sous-programme :

Dรฉclaration du type d'enregistrement au niveau du sous-programme

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

Dans cette syntaxe, le type d'enregistrement nommรฉ ยซ type_name ยป est crรฉรฉ uniquement ร  l'intรฉrieur du sous-programme. La dรฉfinition de la colonne et du type de donnรฉes est similaire dans les deux mรฉthodes.

Exemple 1 : Type dโ€™enregistrement en tant quโ€™objet de base de donnรฉes

Dans ce programme, nous voyons comment crรฉer un type d'enregistrement en tant qu'objet de base de donnรฉes. Nous crรฉons le type d'enregistrement ยซ emp_det ยป avec quatre colonnes. Voici les colonnes et leurs types de donnรฉes :

  • EMP_NO (NOMBRE)
  • EMP_NAME (VARCHAR2 (150))
  • DIRECTEUR (NUMร‰RO)
  • SALAIRE (NOMBRE)
CREATE TYPE emp_det IS OBJECT
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
/

Sortie :

Type created

Code Explication

  • Le code ci-dessus crรฉe le type emp_det en tant qu'objet de base de donnรฉes.
  • Elle comporte 4 colonnes : emp_no, emp_name, manager et salary, comme dรฉfini.
  • Maintenant, 'emp_det' est similaire ร  n'importe quel autre Type de donnรฉes (comme NUMBER ou VARCHAR2) et est visible dans toute la base de donnรฉes. Par consรฉquent, il peut รชtre utilisรฉ n'importe oรน dans la base de donnรฉes pour dรฉclarer une variable de ce type.

Exemple 2 : Accรจs au niveau du sous-programme et au niveau de la colonne

Dans cet exemple, nous voyons comment crรฉer un type d'enregistrement au niveau du sous-programme et comment le remplir et en extraire des valeurs par colonne. Nous crรฉons le type d'enregistrement ยซ emp_det ยป au niveau du sous-programme et l'utilisons pour remplir et afficher des donnรฉes.

Exemple d'accรจs au niveau des colonnes du type d'enregistrement

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;
/

Sortie :

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

Code Explication

  • Code lignes 2-8 : Le type d'enregistrement 'emp_det' est dรฉclarรฉ avec les colonnes emp_no, emp_name, manager et salary de type de donnรฉes NUMBER, VARCHAR2, NUMBER et NUMBER.
  • Code ligne 9: La variable guru99_emp_rec est dรฉclarรฉe comme รฉtant de type de donnรฉes 'emp_det'. variable peut contenir une valeur qui inclut les quatre champs.
  • Code ligne 11: Remplir le champ 'emp_no' de 'guru99_emp_rec' avec la valeur 1001.
  • Code ligne 12: Renseignez le champ ยซ emp_name ยป avec la valeur XXX.
  • Code ligne 13: Renseignez le champ ยซ responsable ยป avec la valeur 1000.
  • Code ligne 14: Renseignez le champ ยซ salaire ยป avec la valeur 10000.
  • Code lignes 15-19 : Affichage de la valeur de 'guru99_emp_rec' dans le rรฉsultat.

Exemple 3 : Accรจs au niveau du sous-programme et au niveau des lignes

Dans cet exemple, nous voyons comment crรฉer un type d'enregistrement au niveau du sous-programme et le renseigner au niveau de la ligne. Nous crรฉons le type d'enregistrement ยซ emp_det ยป au niveau du sous-programme et l'utilisons pour renseigner et afficher des donnรฉes.

Exemple d'accรจs au niveau des lignes d'un type d'enregistrement

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 Explication

  • Code lignes 2-8 : Le type d'enregistrement 'emp_det' est dรฉclarรฉ avec les colonnes emp_no, emp_name, manager et salary de type de donnรฉes NUMBER, VARCHAR2, NUMBER et NUMBER.
  • Code ligne 9: La variable guru99_emp_rec est dรฉclarรฉe comme รฉtant de type de donnรฉes 'emp_det' et peut contenir les quatre champs.
  • Code ligne 11: Remplissage de la table emp avec 1002 comme emp_no, YYY comme emp_name, 15000 comme salary et 1000 comme manager number.
  • Code ligne 12: Validation de la transaction d'insertion.
  • Code ligne 13: Remplissage de la variable 'guru99_emp_rec' au niveau de la ligne ร  partir de la requรชte SELECT pour l'employรฉ numรฉro 1002.
  • Code lignes 15-19 : Affichage de la valeur de 'guru99_emp_rec' dans le rรฉsultat.

Sortie :

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

ร€ noter: Un type d'enregistrement n'est accessible qu'au niveau de la colonne lors de la redirection de sa valeur vers un mode de sortie. Notez que dans cet exemple, l'ordre de la liste SELECT ne correspond pas ร  l'ordre des champs de l'enregistrement, ce qui explique pourquoi les valeurs ยซ salaire ยป et ยซ responsable ยป apparaissent inversรฉes dans le rรฉsultat.

Types d'enregistrements PL/SQL

Au-delร  de l'enregistrement dรฉfini par le programmeur et prรฉsentรฉ ci-dessus, Oracle Ce module propose deux types d'enregistrements ancrรฉs qui copient automatiquement leur structure. Leur utilisation รฉvite de redรฉclarer les colonnes et garantit que l'enregistrement reste synchronisรฉ avec la table ou le curseur sur lequel il est basรฉ.

Type d'enregistrement Dรฉclarรฉ avec La structure provient de
Enregistrement basรฉ sur une table nom_table%TYPE_LIGNE Toutes les colonnes d'un tableau
Enregistrement basรฉ sur un curseur nom_curseur%TYPE_LIGNE Liste de sรฉlection du curseur
Enregistrement dรฉfini par le programmeur TYPE โ€ฆ EST UN ENREGISTREMENT Colonnes que vous listez manuellement

Un enregistrement %ROWTYPE est le choix le plus sรปr lorsque la forme doit suivre un tableau ou un curseur, car toute modification de colonne est automatiquement prise en compte lors de la prochaine compilation.

FAQ

Un enregistrement regroupe diffรฉrentes colonnes, potentiellement de types diffรฉrents, en une structure linรฉaire. Une collection contient plusieurs รฉlรฉments du mรชme type, indexรฉs par un indice. Ces deux types d'รฉlรฉments sont souvent combinรฉs pour former une collection d'enregistrements.

%ROWTYPE dรฉclare un enregistrement dont les champs correspondent automatiquement ร  une table ou un curseur. Utilisez-le lorsque l'enregistrement doit reflรฉter cette source, afin qu'une modification de colonne soit prise en compte sans avoir ร  modifier la dรฉclaration.

Oui, si les deux enregistrements sont du mรชme type. SELECT INTO peut รฉgalement remplir un enregistrement entier ร  partir d'une ligne de table, ร  condition que l'ordre de la liste de sรฉlection corresponde ร  l'ordre des champs de l'enregistrement.

Oui. L'IA peut lire la dรฉfinition d'une table et produire un bloc TYPEโ€ฆ IS RECORD correspondant, ou recommander un %ROWTYPE lorsqu'un lien direct vers la table est prรฉfรฉrable. Vรฉrifiez les types de donnรฉes avant utilisation.

Un enregistrement au niveau de la base de donnรฉes est crรฉรฉ avec CREATE TYPE et stockรฉ comme un objet visible dans toute la base de donnรฉes. Un enregistrement au niveau du sous-programme est dรฉclarรฉ ร  l'intรฉrieur d'un bloc et n'existe que dans ce sous-programme.

Rรฉsumez cet article avec :