在 Oracle SQL 中使用存储过程将数据插入表中

Posted

技术标签:

【中文标题】在 Oracle SQL 中使用存储过程将数据插入表中【英文标题】:Insert Data Into Table with Stored Procedure in Oracle SQL 【发布时间】:2020-11-22 04:23:33 【问题描述】:

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

我有以下表格:

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

【问题讨论】:

【参考方案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 
...

【讨论】:

以上是关于在 Oracle SQL 中使用存储过程将数据插入表中的主要内容,如果未能解决你的问题,请参考以下文章

mysql存储过程实现数据查询与插入

oracle存储过程查找表数据插入另一个表中。。

Oracle 12 PL/SQL 在触发器中检索存储过程名称

oracle 存储过程中多线程执行另一个存储过程

oracle存储过程效率问题,处理1500w的数据插入

用oracle存储过程将一张表的数据查出插入另一张表