如何在 Oracle PL/SQL 中使用输出参数执行存储过程?

str*_*ger 6 oracle stored-procedures plsql

这是我创建的表:

CREATE TABLE Toy
(Toy_No NUMBER PRIMARY KEY,
 Toy_Name VARCHAR(30) NOT NULL
 );
Run Code Online (Sandbox Code Playgroud)

这是我创建的序列:

CREATE SEQUENCE toy_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用输出参数创建一个简单的存储过程:

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;
Run Code Online (Sandbox Code Playgroud)

但我收到编译错误。错误可能在哪里?

a1e*_*x07 4

有几个错误。
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_seqseq_toy) 3. 参数名称与字段名称相同(Toy_Name)。尽管这不是编译错误,但与依赖解析规则相比,限定变量总是要好得多:

INSERT INTO Toy (Toy_No,Toy_Name)
VALUES (insert_toys.toy_id,insert_toys.toy_name);
Run Code Online (Sandbox Code Playgroud)

该过程有 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;
Run Code Online (Sandbox Code Playgroud)