我想从存储过程中调用创建表/修改表的命令,这是否可能?
我的要求是更改所有表中某列的数据类型。因此,我只从user_tab_cols
中获取列名。现在我想创建一个需要create语句的临时表,但我无法在存储过程中使用它。
有人能帮帮我吗?
我想从存储过程中调用创建表/修改表的命令,这是否可能?
我的要求是更改所有表中某列的数据类型。因此,我只从user_tab_cols
中获取列名。现在我想创建一个需要create语句的临时表,但我无法在存储过程中使用它。
有人能帮帮我吗?
我从提到USER_TAB_COLUMNS
的参考中推断这是Oracle数据库。 ALTER
和CREATE
语句是DDL(数据定义语言),我们无法在PL/SQL中直接执行它们。然而,有几种方法可以绕过此限制:EXECUTE IMMEDIATE
和DBMS_UTILITY.EXEC_DDL()
。下面的示例将使用EXECUTE IMMEDIATE
。
begin
for lrec in ( select table_name from user_tab_columns
where column_name = 'UNIVERSAL_COLUMN_NAME')
loop
execute immediate 'alter table '||lrec.table_name||
' modify UNIVERSAL_COLUMN_NAME varchar2(255)';
end loop;
end;
请注意,通常的限制仍然适用:新数据类型必须与现有数据类型兼容(除非该列为空),对于某些特定数据类型(如CLOBs)的处理会更加棘手。
编辑:
我没有涉及到CREATE TABLE语句。原则是相同的,只是输入更长而已。此外,我并不完全清楚它如何适用于您先前要求更改这些列的数据类型。
你可以将查询生成为字符串,并使用“exec”关键字执行它。
exec
是 SQL*Plus 命令,而不是 PL/SQL。 - Jeffrey Kempuser_tab_columns
的存在中推断出来,但这个回复是无辜的。 - Dan