- ORA-06550: строка 9, столбец 12: PLS-00103: Обнаружен символ «FETCH» при ожидании одного из следующего: - PullRequest
0 голосов
/ 15 апреля 2020
@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» при ожидании одного из следующих действий:

Функция начала Прагма Тип подтипа Тип текущий курсор delete существует до 06550. 00000 - «строка% s, столбец% s: \ n% s» * Причина: обычно ошибка компиляции PL / SQL. * Действие:

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Это:

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

неверно; либо удалите точку с запятой в первой строке (если ваша база данных поддерживает предложение FETCH), либо всю вторую строку.


Укороченная версия вашего кода выглядит примерно так (у меня нет вашей таблицы, так что я изготовил одну, основываясь на таблице 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>
0 голосов
/ 15 апреля 2020

Ваш запрос заканчивается перед предложением 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;
/
...