创建/修改SQL存储过程

3

我想从存储过程中调用创建表/修改表的命令,这是否可能?

我的要求是更改所有表中某列的数据类型。因此,我只从user_tab_cols中获取列名。现在我想创建一个需要create语句的临时表,但我无法在存储过程中使用它。

有人能帮帮我吗?


在Oracle中,无需即时创建临时表。您应该考虑使用全局临时表 - 它只会被创建一次,但每个会话都可以像拥有自己的私有副本一样使用它(其中的数据在会话结束时(或在提交时,如果您愿意)会自动清除)。 - Jeffrey Kemp
2个回答

11

我从提到USER_TAB_COLUMNS的参考中推断这是Oracle数据库。 ALTERCREATE语句是DDL(数据定义语言),我们无法在PL/SQL中直接执行它们。然而,有几种方法可以绕过此限制:EXECUTE IMMEDIATEDBMS_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语句。原则是相同的,只是输入更长而已。此外,我并不完全清楚它如何适用于您先前要求更改这些列的数据类型。


1
谢谢,我用了那个,而且它完美地运行了。 非常感谢。 - M.J.

0

你可以将查询生成为字符串,并使用“exec”关键字执行它。


exec 是 SQL*Plus 命令,而不是 PL/SQL。 - Jeffrey Kemp
OP最初没有提到Oracle。一个足够有知识的人可以从user_tab_columns的存在中推断出来,但这个回复是无辜的。 - Dan
无辜,但不是很有帮助 :) - Jeffrey Kemp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接