繁体   English   中英

pl SQL循环中的if / else

[英]if/else in pl SQL loop

我正在尝试使用IF.. ELSE更新存储的单位IF.. ELSE条件和声明,但是尝试运行时出现错误:

PLS-00103: Encountered the symbol "LOOP" when expecting one of the following:
    if

下面的代码,我正在循环运行它以吐出所有数据,直到用完为止:

DECLARE

--Declare cursor
 CURSOR part_cur
 IS 
 SELECT PARTNUMBER, PARTDESC, ITEMCLASS, UNITSONHAND, UNITSONHAND
 FROM PART
 ORDER BY UPPER(PARTNUMBER);

--Declare variables
 v_PartNumber PART.PARTNUMBER%TYPE;
 v_PartDesc PART.PARTDESC%TYPE;
 v_ItemClass PART.ITEMCLASS%TYPE;
 v_UnitsOnHand PART.UNITSONHAND%TYPE;
 v_nUnitsOnHand PART.UNITSONHAND%TYPE;

BEGIN
 OPEN part_cur;
 LOOP

--Initialise variables
  FETCH part_cur INTO v_PartNumber, v_PartDesc, v_ItemClass, v_UnitsOnHand, v_nUnitsOnHand;
        EXIT WHEN part_cur%NOTFOUND;

--Perform Calculations
    IF ITEMCLASS = 'AO' AND UNITSONHAND <20 THEN v_nUnitsOnHand := UNITSONHAND + 5;
ELSE IF ITEMCLASS = 'AO' AND UNITSONHAND <100 THEN v_nUnitsOnHand := UNITSONHAND + 10;
ELSE IF ITEMCLASS = 'AO' AND UNITSONHAND >=100 THEN v_nUnitsOnHand := UNITSONHAND + 25;
END IF;

--Format for output

--Output results
        DBMS_OUTPUT.PUT_LINE('Part ' || UPPER(v_PartNumber) || ' - ' || INITCAP(v_PartDesc) || ' of item class ' || UPPER(v_ItemClass) || ' had a total of ' || v_UnitsOnHand || ' units on hand, 
        and now has ' || v_nUnitsOnHand || ' units on hand after the database was updated.
        ');
 END LOOP;
 CLOSE part_cur;
END;

任何帮助或指示,将不胜感激,谢谢。

您的IF语句当前如下所示:

IF ITEMCLASS = 'AO' AND UNITSONHAND <20 THEN
    v_nUnitsOnHand := UNITSONHAND + 5;
ELSE
    IF ITEMCLASS = 'AO' AND UNITSONHAND <100 THEN
        v_nUnitsOnHand := UNITSONHAND + 10;
    ELSE
        IF ITEMCLASS = 'AO' AND UNITSONHAND >=100 THEN
            v_nUnitsOnHand := UNITSONHAND + 25;
        END IF;

因此缺少两个END IF 因此,当Oracle看到END LOOP ,就会抱怨,因为它希望使用END IF

要解决此问题,只需将两个ELSE IF替换为ELSIF ,这是专门用于此目的的特殊关键字:

IF ITEMCLASS = 'AO' AND UNITSONHAND <20 THEN
    v_nUnitsOnHand := UNITSONHAND + 5;
ELSIF ITEMCLASS = 'AO' AND UNITSONHAND <100 THEN
    v_nUnitsOnHand := UNITSONHAND + 10;
ELSIF ITEMCLASS = 'AO' AND UNITSONHAND >=100 THEN
    v_nUnitsOnHand := UNITSONHAND + 25;
END IF;

尝试这个:

FOR record_var in part_cur
LOOP
   {...statements...}
END LOOP;

之后,您可以编写:

record_var.v_PartNumber, etc

用于访问这些字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM