ORACLE: ошибка Ошибка (6,3): PL / SQL: SQL Оператор игнорируется и ошибка (8,3): PL / SQL: ORA-00933: SQL команда не завершена должным образом в процедуре - PullRequest
0 голосов
/ 02 апреля 2020

Я хочу создать процедуру, но когда я компилирую эту процедуру, всегда выдается ошибка, я думаю, что процедура правильная, а что нет. Это моя процедура:

create or replace PROCEDURE            "DROP_PART_USER" 
AS
H VARCHAR(50); 

BEGIN
    FOR cc IN
    (   
        select PARTITION_NAME INTO H FROM all_tab_partitions 
        WHERE table_name = 'MOB_TRACK_USER' AND partition_name <> 'OLD_DATA_USER' ORDER BY PARTITION_POSITION ASC
        FETCH NEXT 1 ROWS ONLY
    ) LOOP

        --drop partitions older than specified retention preriod
        EXECUTE IMMEDIATE 'ALTER TABLE ' || 'APP_MOBILE_TRACKING' ||'.'||'MOB_TRACK_USER '
             || ' DROP PARTITION ' || cc.partition_name || ' UPDATE GLOBAL INDEXES';       
    END LOOP;

END;

получена ошибка Ошибка (8,3): PL / SQL: ORA-00933: SQL команда не завершена должным образом

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020
  • Не SELECT INTO в курсоре
    • это причина ваших проблем

Еще несколько замечаний:

  • использовать VARCHAR2, а не VARCHAR
    • , но не здесь, так как эта переменная вам все равно не нужна
  • не используйте double цитаты в Oracle

Должны быть

CREATE OR REPLACE PROCEDURE drop_part_user
AS
BEGIN
   FOR cc IN (    SELECT PARTITION_NAME
                    FROM all_tab_partitions
                   WHERE     table_name = 'MOB_TRACK_USER'
                         AND partition_name <> 'OLD_DATA_USER'
                ORDER BY PARTITION_POSITION ASC
              FETCH NEXT 1 ROWS ONLY)
   LOOP
      --drop partitions older than specified retention preriod
      EXECUTE IMMEDIATE
            'ALTER TABLE '
         || 'APP_MOBILE_TRACKING'
         || '.'
         || 'MOB_TRACK_USER '
         || ' DROP PARTITION '
         || cc.partition_name
         || ' UPDATE GLOBAL INDEXES';
   END LOOP;
END;
1 голос
/ 02 апреля 2020

В какой версии Oracle вы находитесь? FETCH FIRST et c появился в 12 c. Если вы используете 11, то этот синтаксис не будет работать, и вы получите ошибку, которую вы указали. Ваш запрос должен быть:

select * from (
SELECT PARTITION_NAME
                    FROM all_tab_partitions
                   WHERE     table_name = 'MOB_TRACK_USER'
                         AND partition_name <> 'OLD_DATA_USER'
                ORDER BY PARTITION_POSITION ASC
)
where rownum = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...