我正在完成一项家庭作业,被一个存储过程的问题卡住了。
我有以下表格:
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的新表,以获取存储在新表中的输入,然后重写以更新现有表。
这是新的Review表
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'
,并将单引号切换为双引号。这是我编写的第一个存储过程,我哪里出错了?
5条答案
按热度按时间vm0i2vca1#
尝试将Stars数据类型从NUMBER更改为Int
AS:
字符串
至
型
mctunoxg2#
您需要查找插入的id:
字符串
这将连接到引用表以获得所需的id。如果两个名称不匹配,则不会插入评论。你的问题没有具体说明在这种情况下该怎么做,所以这似乎是合理的行为。
请注意,参数的命名方式使它们不会与列名冲突。这里列出了插入的所有列--这两个都是最佳实践。
ogsagwnx3#
参数仅按名称和数据类型定义,它们不包含大小规范。因此,您的程序需要:
字符串
xpcnnkqh4#
在调用存储过程时需要使用To_Date函数,如下所示
字符串
33qvvth15#
字符串