web-dev-qa-db-fra.com

Comment exécuter une procédure stockée avec un paramètre de sortie dans Oracle PL / SQL?

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?

4
stranger

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;
3
a1ex07