Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Sql 在oracle上失败的alter语句_Sql_Oracle_Ddl - Fatal编程技术网

Sql 在oracle上失败的alter语句

Sql 在oracle上失败的alter语句,sql,oracle,ddl,Sql,Oracle,Ddl,我是Oracle的新手(有SQL Server背景)。我正在尝试执行此匿名块,但ORA-06550失败。我觉得我可能不明白在匿名区块中可以做什么和不可以做什么。如果有人能如此好心地教育我,我将不胜感激 BEGIN ALTER TABLE <SCHEMA_NAME>.<TABLE_1_NAME> MODIFY <FIELD_NAME> VARCHAR2(50); ALTER TABLE <SCHEMA_NAME>.<TABL

我是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;
开始
改变桌子。修改VARCHAR2(50);
改变桌子。修改VARCHAR2(50);
改变桌子。修改VARCHAR2(50);
结束;
错误:

ORA-06550:第2行第1列:
PLS-00103:在预期以下情况时遇到符号“ALTER”:

(如果循环mod null pragma,则开始案例为goto声明退出
使用

不能在PL/SQL块内执行
DDL
语句。请删除
BEGIN-END
语句,然后在纯
SQL
中执行alter语句:

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);
ALTER TABLE.修改VARCHAR2(50);
修改表格。修改VARCHAR2(50);
修改表格。修改VARCHAR2(50);

作为一种最佳实践,您应该避免对DDL语句使用
PL/SQL
。PL/SQL是一种过程性语言,而您不会定期动态地创建/删除/修改对象。在某些特定的情况下,您可能必须将其作为脚本在PL/SQL中执行,您可以在PL/SQL块中使用
动态SQL
,作为sugg@Littlefoot.

如果出于某种原因,它必须是PL/SQL,则需要使用
executeimmediate
以动态SQL的形式执行。例如:

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>

您不能在PL/SQL中运行DDL语句当然,您可以使用动态SQL(立即执行)。