单独执行时有效的Oracle SQL命令在一起执行时不起作用。为什么?

时间:2019-08-01 06:35:19

标签: sql oracle oracle11g

这与迁移脚本有关。可以通过使用4个单独的SQL命令来完成所需的迁移。但是,当它们组合起来作为脚本运行时,我会收到 PLS-00103:遇到符号错误。

这些是我用来进行迁移的SQL命令。该表将具有一个PK,它是表中3列的组合键。首先,我需要删除约束,然后向该表添加一个名为ID的新列,通过添加一个序列使其自动递增,然后使其成为该表的新PK。

当我一个接一个地执行命令时,以下命令将起作用并完成确切的工作。

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" 

我在这里做什么错了?

1 个答案:

答案 0 :(得分:2)

我不知道您如何将它们组合在一起,但是应该是:

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;