【问题标题】:Insert Data Into Table with Stored Procedure in Oracle SQL在 Oracle SQL 中使用存储过程将数据插入表中
【发布时间】:2026-01-20 13:30:02
【问题描述】:

我正在完成一项家庭作业,但遇到了存储过程的问题。

我有以下表格:

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);

对于我需要创建的存储过程,我输入了餐厅名称(唯一)、评论者姓名(唯一)、星级和评论日期。我需要使用正确的信息更新 Rating 表,如果之前不存在于表中,则将新的评论者添加到 Review 表中。

为了启动我的存储过程,我想首先创建一个名为 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',并将单引号切换为双引号。我哪里出错了,因为这是我写的第一个存储过程。

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    尝试将 Stars 数据类型从 NUMBER 更改为 Int

    作为:

    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;
    ;
    

    CREATE OR REPLACE PROCEDURE AddNewReview(
      RESTAURANTNAME IN VARCHAR2 (100)
    , USERNAME IN VARCHAR2 (100)
    , Stars IN Int
    , RATINGDATE IN DATE 
    ) AS 
    BEGIN
      INSERT INTO newReview VALUES (RestaurantName, UserName, Stars, RatingDate);
    END AddNewReview;
    ;
    

    【讨论】:

    • 将 Stars 更改为 INT 类型后,不幸的是,我仍然遇到同样的错误。
    【解决方案2】:

    您需要查找插入的 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。如果任一名称不匹配,它将不会插入评论。您的问题没有具体说明在这种情况下该怎么做,所以这似乎是合理的行为。

    请注意,参数已命名,因此它们不会与列名冲突。这已经列出了插入的所有列——两者都是最佳实践。

    【讨论】:

      【解决方案3】:

      参数仅由名称和数据类型定义,它们不包含大小规范。所以你的程序需要:

      create or replace procedure addnewreview(
        restaurantname in varchar2 
      , username       in varchar2
      , stars          in int
      , ratingdate     in date 
      ...
      

      【讨论】:

        最近更新 更多