Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Oracle SQL中的存储过程将数据插入表中_Sql_Oracle_Plsql - Fatal编程技术网

使用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 
...