Oracle - 在另一个存储过程的循环中调用存储过程

时间:2016-07-24 17:09:53

标签: oracle stored-procedures

我查看了类似查询的答案,但继续得到另一个错误,似乎无法通过在架构中添加proc来创建。

这是我试图运行的代码:

create or replace procedure prcReturnDVD
-- define the parameters that this proc will accept
(memberid_in integer, dvd_in integer)
 is
 -- Define local variables
  vNumRem number(2);
BEGIN
-- Update the rental table with the current date
  update rental set rentalreturneddate = current_date where memberid = memberid_in and dvdid = dvd_in;
-- update DVD quantityonhand to reflect the return
  update dvd set dvdquantityonhand = dvdquantityonhand + 1 where dvdid = dvd_in;
-- Check to see how many DVDs are available for rent for this member
  select get_rentalsremaining(memberid_in) into vNumRem from dual;
-- Evaluate the next action depending on number of remaining DVD rentals available
  if vNumRem >= 1 then
  -- need to write a for loop in order to cycle through the DVDs that need to be shipped out
    while vNumRem >= 0 
    loop
      SYSTEM.prcShipNextDVD(memberid_in);
      vNumRem := vNumRem - 1;
    end loop;
  elsif vNumRem = 0 then
  -- message that no rentals are allowed
    dbms_output.put_line('No more rentals allowed.');
  end if;

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    dbms_output.put_line('No Data Returned, process failed.');
  WHEN TOO_MANY_ROWS THEN
    dbms_output.put_line('Too many rows returned into variable, check data and try again.');
  WHEN OTHERS THEN
    dbms_output.put_line('An unidentified error has occured. Please research issue with procedure.');
END;
/

在LOOP语句中,我试图调用同一用户之前编写的另一个过程(我只使用SYSTEM,因为它只是一个家庭作业,它简化了权限):

create or replace procedure prcShipNextDVD
-- define the parameters that this proc will accept
(memberid_in integer)
 is
 -- Define local variables
  vCountOut number(2);
  vAllowedOut number(2);
  vNextDvd number(16);
  vAddedInQueue date;
  vPlaceInQueue number(5);
BEGIN
-- ensure the member is eligible to take out another DVD at this time
-- See how many movies the member currently has out
  select count(*) into vCountOut from rental where memberid = memberid_in and rentalreturneddate is null;
-- See how many movies the member is allowed to have out
  select membershiplimitpermonth into vAllowedOut from membership m, member p where m.membershipid = p.membershipid and p.memberid = memberid_in;
  IF vCountOut < vAllowedOut then
    -- If the number out currently is less than the number allowed out currently
    -- Get next DVD in queue available for shipment
    select get_nextdvd(memberid_in) into vNextDVD, datedaddedinqueue into vAddedInQueue, rentalpriority into vPlaceInQueue from rentalqueue where memberid = memberid_in;
    -- create new record in rental table for this shipment
    insert into rental (rentalid, memberid, dvdid, rentalrequestdate, rentalshippeddate) values (rental_seq.nextval, memberid_in, vNextDVD, vAddedInQueue, current_date);
    -- decrement dvdquantityon hand in dvd table
    update dvd set quantityonhand = quantityonhand - 1 where dvdid = vNextDVD;
    -- remove dvd from queue 
    delete from rentalqueue where memberid = memberid_in and dvdid = vNextDVD ;
    -- manage remaining rentalpriority records by decrementing them properly (like in 2.1)
    update rentalqueue set rentalpriority = rentalpriority - 1 where memberid = memberid_in and rentalpriority >= vPlaceInQueue;
  ELSE
    -- If the member already has the maximum number of movies out at this time
    RAISE_APPLICATION_ERROR(-20101, 'Maximum number of movies out reached. You are not allowed to check out another movie at this time.');
  END IF;

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    dbms_output.put_line('No Data Returned, process failed.');
  WHEN TOO_MANY_ROWS THEN
    dbms_output.put_line('Too many rows returned into variable, check data and try again.');
  WHEN OTHERS THEN
    dbms_output.put_line('An unidentified error has occured. Please research issue with procedure.');
END;
/

即使将过程名称添加到过程调用后,我也会收到以下错误。我也试过用“执行”和“调用”运行它,但知道那些不能正常工作。

PROCEDURE PRCRETURNDVD compiled 
Errors: check compiler log 
19/7  PL/SQL: Statement ignored 
19/14 PLS-00905: object SYSTEM.PRCSHIPNEXTDVD is invalid

关于我在这个问题上做错了什么的任何其他建议?

我正在调用的程序存在问题,但它确实正在编译。

1 个答案:

答案 0 :(得分:0)

(如评论中所述)

修复prcShipNextDVD中的编译错误。

然后来自其他存储过程的调用将起作用。