存储过程函数

时间:2017-05-23 17:23:35

标签: sql oracle plsql oracle11g

我有两张桌子 设备(equipmentid,equipname,equipstatus,maxrentdurationdays) EquipmentID Equipment_Hire(equipmentID,pickupdate,dropoffdate,clientNo) 我需要创建一个存储函数,将clientNo作为输入,如果equipment_hire表的dropoffdate-pickupdate>每天增加20美元。 MaxRentDurationdays

我在oracle 11g中执行此操作时遇到错误。

CREATE OR REPLACE FUNCTION Fines
(P_ClientNo Equipment_Hire.ClientNo%TYPE)
RETURN VARCHAR2 IS
V_ClientNo INTEGER;
V_DURATIONDEFD INTEGER;
V_TOTALFINE INTEGER;
BEGIN   SELECT ClientNo, MAXDURATIONDAYS
INTO V_FName, V_LName, V_TotalSalary
FROM Equipment, Equipment_hire
WHERE P_CLientNo = Equipment_Hire.ClientNo;
IF Equipment_hire.dropoffdate-equipment_hire.pickupdate > 
equipment.maxdurationdays THEN
Equipment_hire.dropoffdate-equipment_hire.pickupdate*20
RETURN Equipment_hire.dropoffdate-equipment_hire.pickupdate*20; ELSE
RETURN 'Date UNSPECIFIED';
END IF; END Fines;

数据:https://www.mediafire.com/?chl6fdcl9cs817w

你只能使用两个表设备,equipment_hire。

1 个答案:

答案 0 :(得分:0)

格式化代码有助于:

CREATE OR REPLACE FUNCTION Fines(P_ClientNo Equipment_Hire.ClientNo%TYPE)
RETURN VARCHAR2 IS
  V_ClientNo INTEGER;
  V_DURATIONDEFD INTEGER;
  V_TOTALFINE INTEGER;
BEGIN
  SELECT ClientNo, MAXDURATIONDAYS
  INTO V_FName, V_LName, V_TotalSalary
  FROM Equipment, Equipment_hire
  WHERE P_CLientNo = Equipment_Hire.ClientNo;

  IF Equipment_hire.dropoffdate - equipment_hire.pickupdate > equipment.maxdurationdays THEN
    Equipment_hire.dropoffdate - equipment_hire.pickupdate * 20
    RETURN Equipment_hire.dropoffdate - equipment_hire.pickupdate * 20; 
  ELSE 
    RETURN 'Date UNSPECIFIED';
  END IF;
END Fines;

快速浏览一下:

  • 您选择了两列,但您的INTO子句包含三个变量。
  • 您正在交叉加入表格。谁曾告诉过你使用这个过时的连接语法呢?
  • 交叉连接会导致多个结果行无法读入简单变量。
  • IF应该做的第一行是什么?
  • 您正在查询之外使用表名和列。
  • 乘法优先于减法(或应该有)。所以你要约会,将它乘以20并从另一个约会中减去结果。
  • 您似乎认为您只需要处理一个设备租赁,但用户是否可以雇佣多名员工?