ORACLE:错误错误(6,3):PL/SQL:SQL 语句被忽略和错误(8,3):PL/SQL:ORA-00933:SQL 命令未在过程中正确结束

Posted

技术标签:

【中文标题】ORACLE:错误错误(6,3):PL/SQL:SQL 语句被忽略和错误(8,3):PL/SQL:ORA-00933:SQL 命令未在过程中正确结束【英文标题】:ORACLE : error Error(6,3): PL/SQL: SQL Statement ignored and Error(8,3): PL/SQL: ORA-00933: SQL command not properly ended in procedure 【发布时间】:2020-04-02 12:25:54 【问题描述】:

我想创建一个程序,但是当我编译这些程序时总是出错,我认为程序是对的,什么是错的。这是我的程序:

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;

得到一个错误 Error(8,3): PL/SQL: ORA-00933: SQL command not properly end

【问题讨论】:

对我来说,它工作正常。 (原样) 这很奇怪,每次我编译这些程序时都会遇到这些错误。 您在哪个工具中运行它? 【参考方案1】: 不要在光标中SELECT INTO 这是您的问题的原因

还有一些注意事项:

使用VARCHAR2,而不是VARCHAR 但不是在这里,因为无论如何您都不需要该变量 不要在 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;

【讨论】:

【参考方案2】:

您使用的是哪个版本的 Oracle? FETCH FIRST 等出现在 12c 中。如果您在 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

【讨论】:

嘿,对,我忘了检查版本,我在 11g 中运行查询,哈哈,我的错。谢谢

以上是关于ORACLE:错误错误(6,3):PL/SQL:SQL 语句被忽略和错误(8,3):PL/SQL:ORA-00933:SQL 命令未在过程中正确结束的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE PL/SQL 在查询 3 列信息时出现存储过程错误

PL/SQL Oracle 错误处理

ORACLE PL/SQL编程总结

声明变量的 PL/SQL 编译错误

Oracle 终止会话过程

使用pl/sql的导入表工具导入dmp文件时,导入报错:遇到ORACLE错误 12546,请问怎么解决阿