Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单独执行时起作用的Oracle SQL命令在一起执行时不起作用。为什么?_Sql_Oracle_Oracle11g - Fatal编程技术网

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

单独执行时起作用的Oracle SQL命令在一起执行时不起作用。为什么?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,这是关于迁移脚本的。所需的迁移可以通过使用4个单独的SQL命令来完成。但是,当它们结合起来作为脚本运行时,我得到了PLS-00103:遇到了符号错误 这些是我用来进行迁移的SQL命令。该表将有一个PK,它是表中3列的复合键。首先,我需要删除约束,然后向该表添加一个名为ID的新列,通过添加序列使其自动递增,然后使其成为表的新主键 当我一个接一个地执行这些命令时,下面的命令会起作用并完成确切的工作 BEGIN FOR item IN ( SELECT * FROM all_

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

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

当我一个接一个地执行这些命令时,下面的命令会起作用并完成确切的工作

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语句?