-ORA-06550:第9行,第12列:PLS-00103:在预期以下情况之一时遇到了符号“ FETCH”:

时间:2020-04-15 11:57:56

标签: oracle plsql

@C:\Users\4\Desktop\dbdrop;
@C:\Users\4\Desktop\dbcreate;
SET SERVEROUTPUT ON;
DECLARE
   ORDER_ID     ORDERS.ODID%TYPE;
   COMPANY_NAME ORDERS.CNAME%TYPE;
   ORDER_DATE   ORDERS.ODATE%TYPE;
   CURSOR ord_cursor IS 
        SELECT ODID, CNAME, ODATE
            FROM ORDERS
            WHERE ODER_DATE< TRUNC(SYSDATE);
           FETCH FIRST 5 ROWS ONLY;
BEGIN
   OPEN ord_cursor;
   LOOP
     FETCH ord_cursor into ORDER_ID, COMPANY_NAME, ORDER_DATE;
     DBMS_OUTPUT.PUT_LINE('           ');
     DBMS_OUTPUT.PUT_LINE('ODER ID: '|| TO_CHAR(Order_Id));
     DBMS_OUTPUT.PUT_LINE( 'ODER DATE: ' || ORDER_DATE );
     DBMS_OUTPUT.PUT_LINE('COMPANY NAME: '||  COMPANY_NAME );
     DBMS_OUTPUT.PUT_LINE( '------------');
     DBMS_OUTPUT.PUT_LINE( '------------');
     IF ord_cursor%NOTFOUND THEN 
        EXIT;
      END IF;
    END LOOP;
    CLOSE ord_cursor;
EXCEPTION 
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;

错误报告- ORA-06550:第9行,第12列: PLS-00103:预期以下情况之一时遇到符号“ FETCH”:

开始函数编译指示过程子类型类型 当前光标删除 优先存在 06550。00000-“%s行,%s列:\ n%s” *原因:通常是PL / SQL编译错误。 *动作:

2 个答案:

答案 0 :(得分:1)

此:

       WHERE ODER_DATE< TRUNC(SYSDATE);
       FETCH FIRST 5 ROWS ONLY;

是错误的;要么在第一行中删除分号(如果您的数据库支持FETCH子句),要么在第二行中删除整个分机。


更短的代码版本是这样的(我没有您的表,所以我根据Scott的EMP表制作了一个表):

SQL> create table orders as
  2  select empno ordid, ename cname, hiredate odate
  3  from emp
  4  where deptno = 10;

Table created.

代码本身:

SQL> set serveroutput on
SQL> begin
  2    for cur_r in
  3      (select ordid, cname, odate
  4       from orders
  5       where odate < trunc(sysdate)
  6         and rownum <= 5
  7      )
  8    loop
  9      dbms_output.put_line('------------');
 10      dbms_output.put_line('Order ID   = ' || cur_r.ordid);
 11      dbms_output.put_line('Order date = ' || to_char(cur_r.odate, 'dd.mm.yyyy'));
 12      dbms_output.put_line('Company    = ' || cur_r.cname);
 13    end loop;
 14  end;
 15  /
------------
Order ID   = 7782
Order date = 09.06.1981
Company    = CLARK
------------
Order ID   = 7839
Order date = 17.11.1981
Company    = KING
------------
Order ID   = 7934
Order date = 23.01.1982
Company    = MILLER

PL/SQL procedure successfully completed.

SQL>

答案 1 :(得分:0)

您的查询在FETCH子句之前结束,这就是问题所在。

您可以使用简单的FOR loop和字符串连接,如下所示:

BEGIN
   FOR CUR IN (SELECT 'ODER ID: '|| TO_CHAR(ODID) || CHR(10)
                      || 'ODER DATE: ' || ODATE || CHR(10)
                      || 'COMPANY NAME: ' ||  CNAME || CHR(10)
                      || '------------' AS STR
                 FROM ORDERS
                WHERE ODER_DATE< TRUNC(SYSDATE)
                FETCH FIRST 5 ROWS ONLY)
    LOOP
     DBMS_OUTPUT.PUT_LINE(CUR.STR);
    END LOOP;
EXCEPTION 
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/