单独执行时起作用的Oracle SQL命令在一起执行时不起作用。为什么?
这是关于迁移脚本的。所需的迁移可以通过使用4个单独的SQL命令来完成。但是,当它们结合起来作为脚本运行时,我得到了PLS-00103:遇到了符号错误 这些是我用来进行迁移的SQL命令。该表将有一个PK,它是表中3列的复合键。首先,我需要删除约束,然后向该表添加一个名为ID的新列,通过添加序列使其自动递增,然后使其成为表的新主键 当我一个接一个地执行这些命令时,下面的命令会起作用并完成确切的工作单独执行时起作用的Oracle SQL命令在一起执行时不起作用。为什么?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,这是关于迁移脚本的。所需的迁移可以通过使用4个单独的SQL命令来完成。但是,当它们结合起来作为脚本运行时,我得到了PLS-00103:遇到了符号错误 这些是我用来进行迁移的SQL命令。该表将有一个PK,它是表中3列的复合键。首先,我需要删除约束,然后向该表添加一个名为ID的新列,通过添加序列使其自动递增,然后使其成为表的新主键 当我一个接一个地执行这些命令时,下面的命令会起作用并完成确切的工作 BEGIN FOR item IN ( SELECT * FROM all_
BEGIN
FOR item IN (
SELECT *
FROM all_constraints
WHERE table_name = 'TEST_DB_CHANGE'
)
LOOP
EXECUTE immediate 'ALTER TABLE TEST_DB_CHANGE DROP CONSTRAINT ' || item.CONSTRAINT_NAME;
END LOOP;
END;
/
BEGIN
EXECUTE IMMEDIATE 'CREATE SEQUENCE TEST_DB_CHANGE_SEQUENCE START WITH 1 INCREMENT BY 1 nomaxvalue';
END;
/
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE TEST_DB_CHANGE ADD (ID NUMBER DEFAULT TEST_DB_CHANGE_SEQUENCE.nextval)';
END;
/
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE TEST_DB_CHANGE ADD CONSTRAINT TEST_DB_CHANGE_PK PRIMARY KEY (ID)';
END;
但是当它们一起执行时,我得到以下错误。
*查询执行失败
Reason:
SQL Error [6550] [65000]: ORA-06550: line 11, column 1:
PLS-00103: Encountered the symbol "/" *
我试着从那一行,从每一行,从每一行,除了最后一行,删除“/”,但没有一个解决问题。然后错误将更改为:
Reason:
SQL Error [6550] [65000]: ORA-06550: line 12, column 1:
PLS-00103: Encountered the symbol "BEGIN"
我做错了什么?我不知道您是如何组合它们的,但应该是:
BEGIN
FOR item IN (
SELECT *
FROM all_constraints
WHERE table_name = 'TEST_DB_CHANGE'
)
LOOP
EXECUTE immediate 'ALTER TABLE TEST_DB_CHANGE DROP CONSTRAINT ' || item.CONSTRAINT_NAME;
END LOOP;
EXECUTE IMMEDIATE 'CREATE SEQUENCE TEST_DB_CHANGE_SEQUENCE START WITH 1 INCREMENT BY 1 nomaxvalue';
EXECUTE IMMEDIATE 'ALTER TABLE TEST_DB_CHANGE ADD (ID NUMBER DEFAULT TEST_DB_CHANGE_SEQUENCE.nextval)';
EXECUTE IMMEDIATE 'ALTER TABLE TEST_DB_CHANGE ADD CONSTRAINT TEST_DB_CHANGE_PK PRIMARY KEY (ID)';
END;
我不知道您是如何将它们组合在一起的,但应该是:
BEGIN
FOR item IN (
SELECT *
FROM all_constraints
WHERE table_name = 'TEST_DB_CHANGE'
)
LOOP
EXECUTE immediate 'ALTER TABLE TEST_DB_CHANGE DROP CONSTRAINT ' || item.CONSTRAINT_NAME;
END LOOP;
EXECUTE IMMEDIATE 'CREATE SEQUENCE TEST_DB_CHANGE_SEQUENCE START WITH 1 INCREMENT BY 1 nomaxvalue';
EXECUTE IMMEDIATE 'ALTER TABLE TEST_DB_CHANGE ADD (ID NUMBER DEFAULT TEST_DB_CHANGE_SEQUENCE.nextval)';
EXECUTE IMMEDIATE 'ALTER TABLE TEST_DB_CHANGE ADD CONSTRAINT TEST_DB_CHANGE_PK PRIMARY KEY (ID)';
END;
删除脚本上的“/”删除脚本中的所有
/
,并在整个脚本的末尾只放一个/
<代码>/表示脚本结束。删除/
没有帮助。然后它将给出相同的错误,但带有'BEGIN'关键字_PLS-00103:遇到符号“开始”\u为什么每个语句都在单独的块中?您在哪里运行?在SQL*Plus中?蟾蜍?PL/SQL开发人员?SQL开发人员?还有别的吗?另外,为什么要使用PL/SQL来执行DDL而不是只运行DDL语句?请删除脚本上的“/”从脚本中删除所有/
,并在整个脚本的末尾只放一个/
<代码>/表示脚本结束。删除/
没有帮助。然后它将给出相同的错误,但带有'BEGIN'关键字_PLS-00103:遇到符号“开始”\u为什么每个语句都在单独的块中?您在哪里运行?在SQL*Plus中?蟾蜍?PL/SQL开发人员?SQL开发人员?还有别的吗?另外,为什么要使用PL/SQL来执行DDL,而不仅仅是运行DDL语句?