在pl / sql程序中创建和调用函数

我创建了一个返回租用ID的函数,然后将其用于匿名PL / SQL程序,该程序在给定租用工具的价格和租用时间单位的情况下计算租用的总成本。 (例如,租用了4个小时的工具$ 5 =总共需要支付$ 20)。

创建函数的代码是:

create or replace function return_rentalID (rental_id rental.rid%type)
     return integer is
     returned_rentalID integer;

begin
     select rid
     into returned_rentalID
     from rental
     where rental_id = rental.rid;
     return returned_rentalID;
exception
     when NO_DATA_FOUND
         then dbms_output.put_line('Rental ID Not Found');
         return -1;
end;

调用该函数的代码是:

declare
     returned_rentalID integer;
     units rental.num_unit%type;
     unit_price tool_price.price%type;
     rental_id rental.rid%type;

begin
     returned_rentalID := return_count(1);

     if returned_rentalID > 0 then

         select num_unit
         into units
         from rental
         where rid = returned_rentalID;

         select tp.price
         into unit_price
         from tool_price tp,rental r
         where tp.tid = r.tid
         and tp.tuid = r.tuid
         and rid = returned_rentalID;

         dbms_output.put_line('The Total Cost of this rental is $' || unit_price * units);

     else dbms_output.put_line('Rental ID Not Found');
     end if;
end;

如果我使用出租ID 1作为参数或任何不存在的出租ID,则程序可以正常工作;但是,对于所有其他有效的租金ID,通过租金ID 1时,我仍然得到相同的总数。

有人知道这是什么原因吗?我知道使用函数来返回租金ID(returned_rentalID)是多余的,没有必要;但是,这是使您习惯于创建和调用函数的练习,因此这是必需的。

我真的非常感谢您提供的任何见解!

以下是我正在使用的表的一些示例代码:

create table tool_price
(tid int,--- too id 
tuid int,--- time unit id
price number,primary key(tid,tuid),foreign key(tid) references tool,foreign key(tuid) references time_unit
);

--- mower,$20 per 4 hours. $30 per day 
insert into tool_price values(1,1,5.00);
insert into tool_price values(1,2,30);
insert into tool_price values(1,3,120);

insert into tool_price values(2,7.00);
insert into tool_price values(2,40);
insert into tool_price values(2,160);

insert into tool_price values(3,6.00);
insert into tool_price values(3,32);
insert into tool_price values(3,125);

insert into tool_price values(4,7.00);
insert into tool_price values(4,40);
insert into tool_price values(4,160);

create table rental 
(
rid int,--- rental id 
cid int,--- customer id 
tid int,--- tool id
tuid int,--- time unit id
num_unit int,--- number of units,if unit = 1 hour,num_unit = 5 means 5 hours. 
start_time timestamp,-- rental start time 
end_time timestamp,--- suppose rental end_time 
return_time timestamp,--- actual return time 
credit_card varchar(20),total number,--- total charge 
primary key (rid),foreign key(cid) references cust,foreign key(tuid) references time_unit
);
-- John rented a mower for 4 hours,insert into rental values(1,4,timestamp '2019-08-01 
10:00:00.00',null,'123456789',null);

-- susan rented a small carpet cleaner for one day 
insert into rental values(2,timestamp '2019-08-11 
10:00:00.00',null);

--susan also rented a small mower for 5 hours,before 8 am case  
insert into rental values(3,5,timestamp '2019-08-12 
21:00:00.00',null);

--david also rented a small carpet cleaner for 4 hours,after 10 pm case
insert into rental values(4,timestamp '2019-08-13 
19:00:00.00','12222828828',null);
penglaoda 回答:在pl / sql程序中创建和调用函数

首先,感谢您提供示例数据。我将第二个选择语句更改为ANSI连接,并获得了1,2,and3的不同值:

   SELECT tp.price
      INTO unit_price
      FROM tool_price  tp
           INNER JOIN rental r ON tp.tid = r.tid AND tp.tuid = r.tuid
     WHERE rid = returned_rentalid;

由于您的示例中没有return_count函数,因此我无法完全复制您的结果。

,

编写一个单独的函数来检查id的存在可能是一个过大的杀伤力,您可能想简化代码块并通过以下操作摆脱该功能

declare
     v_total number(10,2);   
begin
     select tp.price * r.num_unit into v_total  
     from rental r
     join tool_price tp on (tp.tid = r.tid and tp.tuid = r.tuid)
     where r.rid = p_rental_id;  -- rental_id for total is to be calculated

     dbms_output.put_line('The Total Cost of this rental is $' || v_total);
exception 
    when NO_DATA_FOUND then
        dbms_output.put_line('No data found');
    when others then    
        raise;
end 

关于数据,请检查表中的内容,如果需要,可以从任何客户端直接运行sql(通过删除into子句)。

注意::我没有数据库可以方便地运行和检查,语法可能会有轻微错误,但是概念和构造是有效的。

本文链接:https://www.f2er.com/3141280.html

大家都在问