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 命令未在过程中正确结束的主要内容,如果未能解决你的问题,请参考以下文章