使用Oracle SQL中的存储过程将数据插入表中
我正在完成一项家庭作业,却被存储过程的问题所困扰 我有以下表格:使用Oracle SQL中的存储过程将数据插入表中,sql,oracle,plsql,Sql,Oracle,Plsql,我正在完成一项家庭作业,却被存储过程的问题所困扰 我有以下表格: create table Restaurant(rID int, name varchar2(100), address varchar2(100), cuisine varchar2(100)); create table Reviewer(vID int, name varchar2(100)); create table Rating(rID int, vID int, stars int, ratingDate date)
create table Restaurant(rID int, name varchar2(100), address varchar2(100), cuisine varchar2(100));
create table Reviewer(vID int, name varchar2(100));
create table Rating(rID int, vID int, stars int, ratingDate date);
对于我需要创建的存储过程,我会输入餐厅名称(唯一)、审阅者名称(唯一)、星级和审阅日期。我需要用适当的信息更新评分表,如果表中以前不存在新的审阅者,则向审阅表中添加新的审阅者
为了启动存储过程,我想先创建一个名为newReview的新表,以获取存储在新表中的输入,然后再重写以更新现有表
这是新的回顾表
CREATE TABLE newReview(
RestaurantName VARCHAR(100),
UserName VARCHAR(100),
Stars Int,
RatingDate Date
)
这是我的AddNewReview程序,它编译成功:
CREATE OR REPLACE PROCEDURE AddNewReview(
RESTAURANTNAME IN VARCHAR2 (100)
, USERNAME IN VARCHAR2 (100)
, Stars IN NUMBER
, RATINGDATE IN DATE
) AS
BEGIN
INSERT INTO newReview VALUES (RestaurantName, UserName, Stars, RatingDate);
END AddNewReview;
;
但是,当我使用输入运行存储过程时
BEGIN
AddNewReview ('Rangoli', 'Sarah M.', 4, '2020-11-21');
END;
我得到以下错误:
Error starting at line : 20 in command -
BEGIN
AddNewReview ('Rangoli', 'Sarah M.', 4, '2020-11-21');
END;
Error report -
ORA-06550: line 2, column 5:
PLS-00905: object TOCONN22.ADDNEWREVIEW is invalid
ORA-06550: line 2, column 5:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
我尝试将日期输入定义为
date'2020-11-21'
,并将单引号切换为双引号。我哪里出错了,因为这是我正在编写的第一个存储过程。尝试将Stars数据类型从NUMBER更改为Int
作为:
到
您需要查找插入的ID:
CREATE OR REPLACE PROCEDURE AddNewReview (
in_RESTAURANTNAME IN VARCHAR2(100),
in_USERNAME IN VARCHAR2(100),
in_Stars IN NUMBER,
in_RATINGDATE IN DATE
) AS
BEGIN
INSERT INTO newReview (rid, vid, stars, RatingDate)
SELECT r.id, rr.id, in_stars, in_RatingDate
FROM restaurant r JOIN
reviewer rr
ON r.name = in_RestaurantName AND
rr.name = in_UserName
END AddNewReview;
这将连接到引用表以获取所需的ID。如果两个名称不匹配,则不会插入审阅。你的问题没有具体说明在这种情况下该怎么办,所以这似乎是合理的行为
请注意,参数已命名,因此它们不会与列名冲突。这列出了插入的所有列——这两个列都是最佳实践。参数仅按名称和数据类型定义,不包含大小规格。因此,您的程序需要:
create or replace procedure addnewreview(
restaurantname in varchar2
, username in varchar2
, stars in int
, ratingdate in date
...
在将Stars更改为INT类型后,不幸的是,我仍然得到相同的错误。
CREATE OR REPLACE PROCEDURE AddNewReview (
in_RESTAURANTNAME IN VARCHAR2(100),
in_USERNAME IN VARCHAR2(100),
in_Stars IN NUMBER,
in_RATINGDATE IN DATE
) AS
BEGIN
INSERT INTO newReview (rid, vid, stars, RatingDate)
SELECT r.id, rr.id, in_stars, in_RatingDate
FROM restaurant r JOIN
reviewer rr
ON r.name = in_RestaurantName AND
rr.name = in_UserName
END AddNewReview;
create or replace procedure addnewreview(
restaurantname in varchar2
, username in varchar2
, stars in int
, ratingdate in date
...