ошибка SQL - PullRequest
       28

ошибка SQL

0 голосов
/ 26 июня 2018

Erreur Начало в строке: 254 команды -

Сообщение об ошибке:

ORA-06550: Линия 2, колонна 21: PLS-00103: Символ «ЗАЯВИТЬ» rencontré à la place d'un des symboles suivants:

начало функции прагма тип процедуры подтип
текущее удаление курсора существует предыдущий символ "начать" замену "объявить" для продолжения. ORA-06550: Ligne 66, колонна 34: PLS-00103: Символ "(" rencontré à la place d'un des symboles suivants:

ORA-06550: Ligne 68, колонна 34: PLS-00103: Символ "(" rencontré à la place d'un des symboles suivants:

ORA-06550: Ligne 71, колонна 27: PLS-00103: Символ "Конец файла" Rencontré à la Place D'un Des Symboles Suivants:

(начинайте регистр, объявляйте завершение исключения конца для goto if mod mod
null Pragma Повышение Возврат Выберите Обновление в то время как с << продолжить закрыть текущий удалить выборку заблокировать вставить открытый набор точек сохранения отката sql execute commit чистка канала слияния json_exists json_value json_query json_object json_array 06550. 00000 - «строка% s, столбец% s: \ n% s» * Причина: обычно ошибка компиляции PL / SQL. * Действие: </p>

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Вы не можете открыть КУРСОР в части объявления, ошибка относится к этому. Вам не нужно использовать DECLARE для каждого объявления, оно должно быть только один раз для каждого блока. Здесь я переместил курсор ОТКРЫТЬ в части выполнения, теперь он должен работать.

DECLARE
CUR_ID_AUTORISATION NUMERIC;
CUR_OPERATION VARCHAR;

CURSOR CURAUTORISATIONS IS 
SELECT  AUT.ID_AUTORISATION 
FROM   PP3_AUTORISATION AUT
WHERE AUT.ID_PLAN IN
        ( SELECT  PDP.ID_PLAN
            FROM   PP3_PLAN_DE_PREVENTION PDP
            WHERE  PDP.ID_PLAN = 3059     )
 AND    AUT.NUM_REVISION_PLAN = 
        (  SELECT MAX(NUM_REVISION_PLAN)       
             FROM  PP3_AUTORISATION 
             WHERE  ID_PLAN = 3059 );
CURSOR CUROPERATIONS IS
     SELECT  OPE.OPERATION 
        FROM PP4_OPERATION ope 
        WHERE ID_AUTORISATION IN
        (select id_autorisation 
            from pp3_autorisation AUT 
            WHERE AUT.ID_PLAN = 3059 
            AND AUT.NUM_REVISION_PLAN =   (
                             SELECT   MAX(NUM_REVISION_PLAN) - 1      
                             FROM pp3_autorisation
                             WHERE ID_PLAN = 3059) );    
BEGIN       
    OPEN CURAUTORISATIONS; 
    OPEN CUR_OPERATION;

   LOOP
        FETCH CURAUTORISATIONS INTO CUR_ID_AUTORISATION;
        EXIT WHEN CURAUTORISATIONS%NOTFOUND;
        FETCH CUROPERATIONS INTO CUR_OPERATION;
        EXIT WHEN CUROPERATIONS%NOTFOUND;

        INSERT INTO PP4_OPERATION 
        VALUES ( SEQ2_Operation.NextVal ,
                 CUR_OPERATION , 
                 CUR_ID_AUTORISATION );
    END LOOP;

    CLOSE CURAUTORISATIONS ;
    CLOSE CUROPERATIONS ;    
END;
0 голосов
/ 26 июня 2018

Я заметил, что вы используете некоторый синтаксис сервера sql (например, числовой, varchar, deallocate), я исправил их и добавил несколько комментариев. Я также пишу курсор по-другому. пожалуйста, проверьте код и скажите мне, если выдают ошибку.

DECLARE
  CUR_ID_AUTORISATION NUMBER(2); -- it should be number instead and specific the size of the datatype
  CUR_OPERATION       VARCHAR(100); -- it should be varchar2 instead and specific the size 

  CURSOR CURAUTORISATIONS IS
    SELECT AUT.ID_AUTORISATION
      FROM PP3_AUTORISATION AUT
     WHERE AUT.ID_PLAN IN (SELECT PDP.ID_PLAN
                             FROM PP3_PLAN_DE_PREVENTION PDP
                            WHERE PDP.ID_PLAN = 3059)
       AND AUT.NUM_REVISION_PLAN =
           (SELECT MAX(NUM_REVISION_PLAN)
              FROM PP3_AUTORISATION
             WHERE ID_PLAN = 3059);

  CURSOR CUROPERATIONS IS
    SELECT OPE.OPERATION
      FROM PP4_OPERATION ope
     WHERE ID_AUTORISATION IN
           (select id_autorisation
              from pp3_autorisation AUT
             WHERE AUT.ID_PLAN = 3059
               AND AUT.NUM_REVISION_PLAN =
                   (SELECT MAX(NUM_REVISION_PLAN) - 1
                      FROM pp3_autorisation
                     WHERE ID_PLAN = 3059));

  -- OPEN CURAUTORISATIONS;
  -- OPEN CUR_OPERATION;
  --BEGIN

BEGIN
  -- Open first cursor
  for CUR_ID_AUTORISATION in CURAUTORISATIONS -- USING for loop cursor loop instead of open, and here you already fetched the data.
   LOOP
      EXIT WHEN CUROPERATIONS%NOTFOUND; 

    dbms_output.put_line('Hi');
    -- Open second cursor
    for CUR_OPERATION in CUROPERATIONS LOOP
      dbms_output.put_line('Hi second time');
      -- remove the comment.
          INSERT INTO PP4_OPERATION
           VALUES
             (1, CUR_OPERATION.OPERATION, CUR_ID_AUTORISATION.ID_AUTORISATION);

    end loop;
    --close CURAUTORISATIONS;
  --close CUROPERATIONS;
  --DEALLOCATE(CURAUTORISATIONS); -- there is not deallocate in oracle 
  --DEALLOCATE(CUROPERATIONS); -- there is not deallocate in oracle 

  end loop;

end;
/
0 голосов
/ 26 июня 2018

DECLARE в PL / SQL - это целый блок, в отличие, например, от в T-SQL. Вы не можете иметь несколько операторов DECLARE, но объявляете несколько переменных в этом блоке, предшествующем BEGIN ... END.

DECLARE
  CUR_ID_AUTORISATION NUMERIC;
  CUR_OPERATION VARCHAR;
BEGIN
  ...
END;
...