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

ny6fqffe  于 2023-08-03  发布在  Oracle
关注(0)|答案(5)|浏览(92)

我正在完成一项家庭作业,被一个存储过程的问题卡住了。
我有以下表格:

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

vm0i2vca

vm0i2vca1#

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

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

mctunoxg

mctunoxg2#

您需要查找插入的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。如果两个名称不匹配,则不会插入评论。你的问题没有具体说明在这种情况下该怎么做,所以这似乎是合理的行为。
请注意,参数的命名方式使它们不会与列名冲突。这里列出了插入的所有列--这两个都是最佳实践。

ogsagwnx

ogsagwnx3#

参数仅按名称和数据类型定义,它们不包含大小规范。因此,您的程序需要:

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

字符串

xpcnnkqh

xpcnnkqh4#

在调用存储过程时需要使用To_Date函数,如下所示

BEGIN
    AddNewReview ('Rangoli', 'Sarah M.', 4, TO_DATE('2020-11-21','YYYY-MM-DD'));
 END;

字符串

33qvvth1

33qvvth15#

The code below might be of some help:

--Create a function (procedure)
    create or replace procedure ADD_NEW_JOB
is
    v_jid jobs.job_id%type;
    v_jtitle jobs.Job_title%type;
begin
    v_jid := 'IT_DBA';
    v_jtitle := 'Database Administrator';
insert into jobs (job_id, job_title) values (v_jid, v_jtitle);
dbms_output.put_line('Inserted '||SQL%ROWCOUNT||' row');
end;
/

--Execute
exec AD_JOB;
select * from jobs;

字符串

相关问题