U0000010: 动态SQL包含不支持项: [target database does not support INCREMENT for alter sequence.]
描述
对于Oracle PLSQL中的动态SQL语句,由于动态SQL包含不支持语法点,因此生成错误提示。
数据库类型与版本
- 源库类型与版本:UGO 支持的 Oracle 版本。
- 目标库类型与版本:UGO 支持的 GaussDB 版本。
语法示例
CREATE OR REPLACE PROCEDURE SEQ_PRO(v_sequence_name VARCHAR2,v_new_increment NUMBER ) AS
BEGIN
-- 直接修改序列步长
EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || v_sequence_name ||
' INCREMENT BY ' || v_new_increment;
DBMS_OUTPUT.PUT_LINE('序列 ' || v_sequence_name || ' 步长已改为 ' || v_new_increment);
END;
/
改造建议
无自动转换方案,可使用功能转换动态SQL中的内容。
如果“SQL语句转换”功能依然无法自动转换,需要人工修改动态SQL。
GaussDB修改后SQL:
--首先构造修改步长的函数
CREATE OR REPLACE FUNCTION alter_sequence_increment(seqname text, newincrement int)
RETURN void AS
currentval bigint;
v_sql text;
BEGIN
v_sql :='SELECT nextval(''' || seqname || ''') - 1';
execute immediate v_sql into currentval;
execute immediate 'drop sequence '||seqname;
execute immediate 'create sequence '|| seqname || ' increment by ' || newincrement || ' start with '|| currentval + newincrement ;
return ;
END;
/
---修改步长的procedure
CREATE OR REPLACE PROCEDURE SEQ_PRO(v_sequence_name VARCHAR2,v_new_increment NUMBER ) AS
BEGIN
-- 直接修改序列步长
--EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || v_sequence_name ||
-- ' INCREMENT BY ' || v_new_increment;
PERFORM alter_sequence_increment(v_sequence_name,v_new_increment);
DBE_OUTPUT.PRINT_LINE('序列 ' || v_sequence_name || ' 步长已改为 ' || v_new_increment);
END;
/