使用 PL/SQL 创建函数
Creating a function using PL/SQL
我有以下 table:
create table movie(
movie_id integer primary key,
title varchar(500) not null,
kind varchar(30),
year integer not null
);
我想创建一个函数:
addMovie(title, kind, year)
该函数必须在影片 table 中插入一个具有唯一性 movie_id 的新行,然后 return movie_id。
这是我第一次使用 PL/SQL,所以我现在有点迷茫 - 到目前为止找不到任何(好的)示例。
谢谢!
你的函数需要做 3 件事
- 生成唯一的电影 ID
- 插入 table
- Return生成的id
让我们一步一个脚印
生成唯一的电影 ID
最好的方法是使用一个序列,它会为您生成一个 ID。查找 sequences
插入 table
这是通过直接插入完成的。由于电影id是由序列生成的,所以我们在insert语句中使用sequence_name.nextval
。因此插入语句看起来像
INSERT INTO movie(movie_id, title, kind, year) values (movie_id_seq.nextval, title, kind, year)
Return 返回生成的id
你可以利用Returning clause in a DML将生成的idreturn放回一个变量中。然后使用 RETURN 语句将 return 的值返回。
这就是您的函数的样子
FUNCTION addmovie(p_title,
p_kind,
p_year)
RETURN NUMBER
IS
v_id movie.id%TYPE;
BEGIN
INSERT INTO movie
(
movie_id,
title,
kind,
year
)
VALUES
(
movie_id_seq.NEXTVAL,
p_title,
p_kind,
p_year
)
returning id
INTO v_id;
RETURN v_id;
END;
请注意,这是一个相当基本的功能,没有错误检查和异常处理 - 我将留给您。
请注意,就作业而言,max(movie_id)+1 不是最佳前进方式。你需要
SELECT max(movie_id)+1 into v_id from movies;
插入语句之前。
此外,由于 DML,您不能将此函数用作查询的一部分。
我有以下 table:
create table movie(
movie_id integer primary key,
title varchar(500) not null,
kind varchar(30),
year integer not null
);
我想创建一个函数:
addMovie(title, kind, year)
该函数必须在影片 table 中插入一个具有唯一性 movie_id 的新行,然后 return movie_id。
这是我第一次使用 PL/SQL,所以我现在有点迷茫 - 到目前为止找不到任何(好的)示例。
谢谢!
你的函数需要做 3 件事
- 生成唯一的电影 ID
- 插入 table
- Return生成的id
让我们一步一个脚印
生成唯一的电影 ID
最好的方法是使用一个序列,它会为您生成一个 ID。查找 sequences
插入 table
这是通过直接插入完成的。由于电影id是由序列生成的,所以我们在insert语句中使用sequence_name.nextval
。因此插入语句看起来像
INSERT INTO movie(movie_id, title, kind, year) values (movie_id_seq.nextval, title, kind, year)
Return 返回生成的id
你可以利用Returning clause in a DML将生成的idreturn放回一个变量中。然后使用 RETURN 语句将 return 的值返回。
这就是您的函数的样子
FUNCTION addmovie(p_title,
p_kind,
p_year)
RETURN NUMBER
IS
v_id movie.id%TYPE;
BEGIN
INSERT INTO movie
(
movie_id,
title,
kind,
year
)
VALUES
(
movie_id_seq.NEXTVAL,
p_title,
p_kind,
p_year
)
returning id
INTO v_id;
RETURN v_id;
END;
请注意,这是一个相当基本的功能,没有错误检查和异常处理 - 我将留给您。
请注意,就作业而言,max(movie_id)+1 不是最佳前进方式。你需要
SELECT max(movie_id)+1 into v_id from movies;
插入语句之前。
此外,由于 DML,您不能将此函数用作查询的一部分。