Search code examples
sqloracleoracle11goracle-sqldeveloper

Get table does not exist error, when trying to insert into table from a trigger


I'm attempting to use a trigger to fill values of another table. The trigger watches for insert on table ratings and updates the values of another table, top5restaurants. I haven't figured out how to maintain only the top 5 in top5restaurants, I don't know how to limit a table to a certain number of entries. But right now I can't seem to do anything to top5restaurants from within the trigger.

drop view top_rest;

create view top_rest (rid, rat) 
as
    (select distinct rid, max(stars) 
     from rating
     group by rid);

drop table top5restaurants;

create table top5restaurants(rid int);

insert into top5restaurants(rid)
    select rid from top_rest
    where rownum <= 5
    order by rat asc;

create or replace trigger top5_trigger
after insert on ratings
for each row
    declare top5 top5restaurants%rowtype;

    cursor top5_cursor is
    select rid from top_rest
    where rownum <=5
    order by rat;
    begin
    for record in top5_cursor
    loop

        fetch top5_cursor into top5; 
        insert into top5restaurants values(top5);
    end loop;
    end;
    /
--    
--
begin
update_reviews('Jade Court','Sarah M.', 4, '08/17/2017');
update_reviews('Shanghai Terrace','Cameron J.', 5, '08/17/2017');
update_reviews('Rangoli','Vivek T.',3,'09/17/2017');
update_reviews('Shanghai Inn','Audrey M.',2,'07/08/2017');
update_reviews('Cumin','Cameron J.', 2, '09/17/2017');
end;
/    
select * from top5restaurants;
insert into top5restaurants values(184);

However, the table does exist and I can run queries on it and it returns the data I inserted when I created the table. I can also insert values. Not sure why I get table not found error when using a trigger.


Solution

  • Apart from the difference in table names(answer by Littlefoot) in the trigger and view, You have not used the rowtype collection properly while inserting the data.

    you must remove the brackets:

    replace

    insert into top5restaurants values(top5);
    

    with

    insert into top5restaurants values top5;