PL / SQL函数用于正确的送货地址

时间:2014-03-18 22:40:05

标签: sql oracle

我正在尝试制作一个PL / SQL函数,当给定客户编号时,查看订单是否已发送到客户地址。如果客户的地址与订单地址匹配,则该功能需要返回True。这就是我提出的,但我不能让它发挥作用。任何帮助将不胜感激。

CREATE OR REPLACE Function CorrectAddress
(aCustNo IN Customer.CustNo%TYPE) RETURN VARCHAR IS
 aCustStreet Customer.CustStreet%TYPE;
 aCustCity   Customer.CustCity%TYPE;
 aCustState Customer.CustState%TYPE;
 aOrdStreet OrderTbl.OrdStreet%TYPE;
 aOrdCity   OrderTbl.OrdCity%TYPE;
 aOrdState OrderTbl.OrdState%TYPE;
 RightAdd VARCHAR;

 BEGIN
 SELECT Customer.CustStreet, Customer.CustCity, Customer.CustState OrderTbl.OrdStreet, OrderTbl.OrdCity, OrderTbl.OrdState
 INTO aCustStreet, aCustCity, aCustState, aOrdStreet, aOrdCity, aOrdState
 FROM Customer, OrdertTbl
 WHERE Customer.CustNo = OrderTbl.CustNo;

 IF aCustStreet = aOrdStreet AND aCustCity = aOrdCity AND aCustState = aOrdState THEN RightAdd := True;
 ELSE RightAdd := False;
 END IF;

 END;

2 个答案:

答案 0 :(得分:0)

试试这个,为什么要返回'varchar',这是你的自定义类型吗?如果你想返回true / false你必须带'boolean',你还需要检查表中是否有行,因为你需要放置异常处理程序

`CREATE OR REPLACE Function CorrectAddress
  (aCustNo IN Customer.CustNo%TYPE) RETURN boolean IS
   aCustStreet Customer.CustStreet%TYPE;
   aCustCity   Customer.CustCity%TYPE;
   aCustState Customer.CustState%TYPE;
   aOrdStreet OrderTbl.OrdStreet%TYPE;
   aOrdCity   OrderTbl.OrdCity%TYPE;
   aOrdState OrderTbl.OrdState%TYPE;

  `BEGIN
    SELECT 
    Customer.CustStreet, 
    Customer.CustCity, 
    Customer.CustState,
    OrderTbl.OrdStreet, 
    OrderTbl.OrdCity, 
    OrderTbl.OrdState
    INTO 
    aCustStreet, 
    aCustCity, 
    aCustState, 
    aOrdStreet, 
    aOrdCity, 
    aOrdState
    FROM 
   Customer, 
   OrdertTbl
   WHERE Customer.CustNo = OrderTbl.CustNo;`

  `IF aCustStreet = aOrdStreet AND aCustCity = aOrdCity AND aCustState = aOrdState THEN   
    return true;
   ELSE 
    return false;
   END IF;`

   `Exception 
     when no_data_found then
          return false;`

  `END;`

答案 1 :(得分:0)

为什么不在这些行中做一些事情,阅读更清晰,为什么在不需要时使用所有这些字段(没有测试过plsql块,但是对于下面的一般想法检查);

    declare
      V_COUNTER number := 0;
      V_RESULT boolean;
    begin
        select
          count('x')
        into 
          V_COUNTER
        from 
          Order o
          inner join Customer c on c.Street = o.Street and
                                   c.City = o.City and  
                                   c.State = o.State
        where
          o.Orderid = 100100;


      if V_COUNTER = 0 then
        V_RESULT := False;
      else
        V_RESULT := True;
      end if;   
    end;