alter语句在oracle上失败

zzwlnbp8  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(413)

我是oracle的新手(有sql server背景)。我正试图执行这个匿名块,但它与ora-06550失败。我觉得在一个匿名的街区里,我可能不明白什么是可以做的,什么是不可以做的。如果有人能这么好地教育我,我会很感激的。

BEGIN
     ALTER TABLE <SCHEMA_NAME>.<TABLE_1_NAME> MODIFY <FIELD_NAME> VARCHAR2(50);
     ALTER TABLE <SCHEMA_NAME>.<TABLE_2_NAME> MODIFY <FIELD_NAME> VARCHAR2(50);
     ALTER TABLE <SCHEMA_NAME>.<TABLE_3_NAME> MODIFY <FIELD_NAME> VARCHAR2(50);
END;

错误:
ora-06550:第2行,第1列:
pls-00103:遇到符号“alter”时,预期出现以下情况之一:
(begin case declare exit for goto if loop mod null pragma)
使用时升高返回选择更新
<<
继续关闭当前删除获取锁插入打开回滚
savepoint set sql execute commit for all merge pipe清除
json\存在json\值json\查询json\对象json\数组
在“alter”之前插入符号“lock”继续。
ora-06550:第2行,第49列:
pls-00103:预期出现以下情况之一时遇到符号“”:
,在
655000000-“行%s,列%s:\n%s”

  • 原因:通常是pl/sql编译错误。
  • 行动:
tpxzln5u

tpxzln5u1#

如果出于某种原因,它必须是pl/sql,那么您需要将is作为动态sql执行,使用 execute immediate . 例如:

SQL> desc test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 FNAME                                              VARCHAR2(10)     --> 10
 LNAME                                              VARCHAR2(10)

SQL> begin
  2    execute immediate 'alter table test modify fname varchar2(20)';
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> desc test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 FNAME                                              VARCHAR2(20)     --> 20
 LNAME                                              VARCHAR2(10)

SQL>
hsgswve4

hsgswve42#

您不能执行 DDL pl/sql块中的语句。拆下 BEGIN-END 语句,并以普通方式执行alter语句 SQL :

ALTER TABLE <SCHEMA_NAME>.<TABLE_1_NAME> MODIFY <FIELD_NAME> VARCHAR2(50);
ALTER TABLE <SCHEMA_NAME>.<TABLE_2_NAME> MODIFY <FIELD_NAME> VARCHAR2(50);
ALTER TABLE <SCHEMA_NAME>.<TABLE_3_NAME> MODIFY <FIELD_NAME> VARCHAR2(50);

作为最佳实践,您应该避免 PL/SQL 对于ddl语句。pl/sql是一种过程语言,而您不经常动态地创建/删除/修改对象。可能有一些特定的场景,您可能需要在pl/sql中作为脚本来执行,您可以使用 dynamic SQL 在pl/sql块中,正如@littlefoot所建议的那样。

相关问题