我想从过程中调用 create table/alter table 命令。是否可以?
我的要求是更改所有表中列的数据类型。所以,我只是从 user_tab_cols
获取列名.现在我想创建一个需要 create 语句的临时表 .. 但我无法在 proc 中使用它。
任何人都可以帮我吗?
最佳答案
我从对 USER_TAB_COLUMNS
的引用推测这是甲骨文。 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;
请注意,通常的限制适用:新数据类型必须与现有数据类型兼容(除非该列为空),并且对于某些特定的数据类型(如 CLOB),事情会更加棘手。
编辑
我还没有提到 CREATE TABLE 语句。原理是一样的,就是打出来的时间长了点。此外,我并不完全清楚它如何适用于您之前更改这些列的数据类型的要求。
关于sql - 从 SQL 存储过程创建/更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1999460/