返回更改PL / SQL的程序

时间:2017-10-11 07:37:28

标签: sql if-statement plsql oracle10g

我正在尝试创建一个程序,它返回20,10,5和1美元钞票的变化(所有用户值和输入都是整数)。

例如:

exec Change(15, 200); 

9 Twenty Dollar Bill
1 Five Dollar Bill

到目前为止我所拥有的:

CREATE or REPLACE Procedure Change(
  p_MoneyDue number, p_Paid number
) as

p_Change number := p_MoneyDue - p_Paid;

BEGIN

  IF (p_Change = 0) THEN
    dbms_output.put_line ('You just gave me exact change! Thank you!');
  ELSIF p_MoneyDue > p_Paid THEN
    dmbs_output.put_line ('You need to give me more money!');
  ELSIF p_Change >= 100 THEN

    dbms_output.put_line ('Twenty dollar bill')
  ELSIF p_Change <= 100 THEN

    dbms_output.put_line ('10 dollar bill')
  ELSIF p_Change  THEN

    dbms_output.put_line ('5 dollar bill')

  ELSE p_Change  THEN

    dbms_output.put_line ('1 dollar bill')
  END IF;

END;
/

2 个答案:

答案 0 :(得分:3)

DECLARE
PROCEDURE CHANGE(
        p_moneydue NUMBER,
        p_paid     NUMBER )
AS
    p_change NUMBER := p_paid - p_moneydue;
    -- 20 10 5 1
    bill_20 NUMBER := 0;
    bill_10 NUMBER := 0;
    bill_5  NUMBER := 0;
    bill_1  NUMBER := 0;
BEGIN
    IF (p_change = 0) THEN
        dbms_output.put_line ('You just gave me exact change! Thank you!');
    elsif p_moneydue > p_paid THEN
        dbms_output.put_line ('You need to give me more money!');
    END IF;
    IF (p_change   > 0 ) THEN
        bill_20   := TRUNC(p_change / 20);
        p_change  := p_change - (20 * bill_20);
        bill_10   := TRUNC(p_change / 10);
        p_change  := p_change - (10 * bill_10);
        bill_5    := TRUNC(p_change / 5);
        p_change  := p_change - (5 * bill_5);
        bill_1    := p_change;
        IF(bill_20 > 0) THEN
            dbms_output.put_line(bill_20 ||' Twenty Dollar Bill');
        END IF;
        IF(bill_10 > 0) THEN
            dbms_output.put_line(bill_10 ||' Ten Dollar Bill');
        END IF;
        IF(bill_5 > 0) THEN
            dbms_output.put_line(bill_5 ||' Five Dollar Bill');
        END IF;
        IF(bill_1 > 0) THEN
            dbms_output.put_line(bill_1 ||' One Dollar Bill');
        END IF;
    END IF;
END;
BEGIN
    CHANGE( 15, 200);
END;
/

答案 1 :(得分:1)

你的代码犯了很多错误。你试过编译吗?正确的程序如下:

create or replace Procedure Change(
  p_MoneyDue number, p_Paid number
) as

   p_Change number := p_Paid - p_MoneyDue;
   p_twenty number := 0;
   p_ten number := 0;
   p_five number := 0;   
   p_one number := 0;   
BEGIN

  IF (p_Change = 0) THEN
    dbms_output.put_line ('You just gave me exact change! Thank you!');
  ELSIF p_MoneyDue > p_Paid THEN
    dbms_output.put_line ('You need to give me more money!');
  END IF;

  WHILE p_change > 0 
  LOOP
    IF p_Change >= 20 THEN
      p_twenty := p_twenty + 1;
      p_Change := p_Change - 20;
    ELSIF p_Change >= 10 
    THEN
      p_ten := p_ten + 1;
      p_Change := p_Change - 10;
    ELSIF p_Change >= 5  THEN
      p_five := p_five + 1;
      p_Change := p_Change - 5;
    ELSE
      p_one := p_one + 1;
      p_Change := p_Change - 1;
    END IF;
  END LOOP;

  if p_twenty > 0 then 
     dbms_output.put_line (p_twenty || ' Twenty Dollar Bill');
  END IF;
  if p_ten > 0 then 
     dbms_output.put_line (p_ten || ' Ten Dollar Bill');
  END IF;
  if p_five > 0 then 
     dbms_output.put_line (p_five || ' Five Dollar Bill');
  END IF;
  if p_one > 0 then 
     dbms_output.put_line (p_one || ' One Dollar Bill');
  END IF;
END;
/