在 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 中使用存储过程将数据插入表中的主要内容,如果未能解决你的问题,请参考以下文章