Voici le tableau que j'ai créé:
CREATE TABLE Toy
(Toy_No NUMBER PRIMARY KEY,
Toy_Name VARCHAR(30) NOT NULL
);
Voici la séquence que j'ai créée:
CREATE SEQUENCE toy_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;
J'ai ensuite essayé de créer une procédure stockée simple avec un paramètre de sortie:
CREATE OR REPLACE PROCEDURE insert_toys(toy_id OUT NUMBER,toy_name VARCHAR(30))
AS
BEGIN
toy_id := seq_toy.NEXTVAL;
INSERT INTO Toy (Toy_No,Toy_Name)
VALUES (toy_id,toy_name);
END;
Mais je reçois une erreur de compilation. Où peut-être l'erreur peut-être?
Il y a plusieurs erreurs.
1. Lorsque vous spécifiez des paramètres de procédure, vous n'avez pas besoin de spécifier la taille. Par exemple. ce doit être CREATE OR REPLACE PROCEDURE insert_toys(toy_id OUT NUMBER,toy_name VARCHAR )
, pas .... VARCHAR(30))
2. Vous avez créé la séquence CREATE SEQUENCE toy_seq
, mais essayant d'utiliser une séquence avec un nom différent toy_id := seq_toy.NEXTVAL;
(toy_seq vs seq_toy) 3. Le nom du paramètre est le même que le nom du champ (Toy_Name). Même s'il ne s'agit pas d'une erreur de compilation, les variables de qualification sont toujours bien meilleures que de s'appuyer sur des règles de résolution:
INSERT INTO Toy (Toy_No,Toy_Name)
VALUES (insert_toys.toy_id,insert_toys.toy_name);
La procédure prend 2 paramètres et doit être appelée ainsi.
set serveroutput on;
declare new_id NUMBER;
BEGIN
insert_toys(new_id,'name2');
dbms_output.put_line(new_id); --print value of new id
END;