これは私が作成したテーブルです:
CREATE TABLE Toy
(Toy_No NUMBER PRIMARY KEY,
Toy_Name VARCHAR(30) NOT NULL
);
これは私が作成したシーケンスです:
CREATE SEQUENCE toy_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;
次に、出力パラメーターを使用して簡単なストアドプロシージャを作成してみました。
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;
しかし、コンパイルエラーが発生します。間違いはどこにあるのでしょうか?
いくつかの間違いがあります。
1。プロシージャのパラメータを指定する場合、サイズを指定する必要はありません。例えば。 CREATE OR REPLACE PROCEDURE insert_toys(toy_id OUT NUMBER,toy_name VARCHAR )
ではなく.... VARCHAR(30))
である必要があります
2。シーケンスCREATE SEQUENCE toy_seq
を作成しましたが、異なる名前toy_id := seq_toy.NEXTVAL;
(toy_seq vs seq_toy)のシーケンスを使用しようとしています。3。パラメーター名はフィールドと同じです名前(Toy_Name)。コンパイルエラーではありませんが、変数の修飾は、解決ルールに依存するよりも常にはるかに優れています。
INSERT INTO Toy (Toy_No,Toy_Name)
VALUES (insert_toys.toy_id,insert_toys.toy_name);
プロシージャは2つのパラメータを取り、そのように呼び出す必要があります。
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;