ORACLE:错误 Error(6,3): PL/SQL: SQL Statement ignored and Error(8,3): PL/SQL: ORA-00933: SQL command not properly ended在程序中
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
我想创建一个程序,但是当我编译这些程序时总是出错,我认为程序是对的,哪里错了。这是我的程序:
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 命令未正确结束
- 不要
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;
您使用的是哪个版本的 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
我想创建一个程序,但是当我编译这些程序时总是出错,我认为程序是对的,哪里错了。这是我的程序:
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 命令未正确结束
- 不要
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;
您使用的是哪个版本的 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