Oracle
 sql >> Base de données >  >> RDS >> Oracle

Insertion et mise à jour basées sur les enregistrements dans Oracle

Vous pouvez également utiliser des enregistrements basés sur des déclarations %ROWTYPE par rapport à table dans laquelle l'insertion et la mise à jour sont faites, ou sur un TYPE d'enregistrement explicite compatible avec la structure de la table.

Exemple d'insertion basée sur les enregistrements :

DECLARE
my_book books%ROWTYPE;
COMMENCER
my_book.isbn :='1-123456-123-1';
my_book.title :='Fox Infotech Blogs';
my_book.summary :='Fox Example';
my_book.author :='V. Kapoor';
my_book.page_count :=300;
INSERT INTO books VALUES my_book;
END;
/
Notez que vous n'incluez pas de parenthèses autour du spécificateur d'enregistrement . Si vous utilisez ce format :

INSERT INTO books VALUES (my_book); -- Avec parenthèses, INVALIDE !

alors vous obtiendrez une exception ORA-00947 :pas assez de valeurs, car le programme attend une expression distincte pour chaque colonne de la table.

Exemple de mise à jour basée sur les enregistrements :

Vous pouvez également effectuer des mises à jour d'une ligne entière à l'aide d'un enregistrement. L'exemple suivant met à jour une ligne dans la table des livres avec un enregistrement %ROWTYPE. Notez que j'utilise le mot-clé ROW pour indiquer que je mets à jour la ligne entière avec un enregistrement :

DECLARE
my_book books%ROWTYPE;
COMMENCER
my_book.isbn :='1-123456-123-1';
my_book.title :='Fox Infotech Blogs';
my_book.summary :='Fox Example';
my_book.author :='V. Kapoor';
my_book.page_count :=300;

UPDATE books
SET ROW =my_book
WHERE isbn =my_book.isbn;
END;
/
Il existe certaines restrictions sur les mises à jour basées sur les enregistrements :

Vous devez mettre à jour une ligne entière avec la syntaxe ROW. Vous ne pouvez pas mettre à jour un sous-ensemble de colonnes (bien que cela puisse être pris en charge dans les versions futures). Tous les champs dont les valeurs restent NULL entraîneront l'attribution d'une valeur NULL à la colonne correspondante.
Vous ne pouvez pas effectuer de mise à jour à l'aide d'une sous-requête.
Et, au cas où vous vous poseriez la question, vous ne pouvez pas créer une colonne de table appelée ROW.