web-dev-qa-db-ja.com

Oracle PL / SQLで出力パラメーターを使用してストアドプロシージャを実行する方法

これは私が作成したテーブルです:

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;

しかし、コンパイルエラーが発生します。間違いはどこにあるのでしょうか?

4
stranger

いくつかの間違いがあります。
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;
3
a1ex07