从 SQL 存储过程创建/更改

Posted

技术标签:

【中文标题】从 SQL 存储过程创建/更改【英文标题】:Create/alter from SQL stored procedure 【发布时间】:2010-01-04 13:14:44 【问题描述】:

我想从一个过程中调用 create table/alter table 命令。有可能吗?

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

谁能帮帮我?

【问题讨论】:

在 Oracle 中,无需即时创建临时表。您应该考虑使用全局临时表 - 它只创建一次,但每个会话都可以使用它,就好像他们有自己的私有副本一样(并且在会话结束时(或在提交时,自动清除其中的数据,如果你愿意))。 【参考方案1】:

我从对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;

请注意,通常的限制适用:新数据类型必须与现有数据类型兼容(除非列为空),并且对于某些特定的数据类型(如 CLOB)来说,事情会变得更加棘手。

编辑

我还没有解决 CREATE TABLE 语句。原理是一样的,只是打字时间长一些。此外,我不完全清楚它如何适用于您更改这些列的数据类型的先前要求。

【讨论】:

谢谢..我用过那个..它工作得很好。非常感谢 如果您正在使用它并且它正在工作,那么请将答案标记为已接受(单击它左侧的大检查使其变为绿色。)【参考方案2】:

您可以将查询生成为字符串并使用 'exec' 关键字执行。

【讨论】:

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

以上是关于从 SQL 存储过程创建/更改的主要内容,如果未能解决你的问题,请参考以下文章

如果存储过程尚不存在,则创建它,但不要更改也不要删除现有的存储过程

撤消对 SQL Server 2005 数据库的更改

用SQL创建存储过程的题目(SQL SERVER2000下)

需要将以下存储过程从 Oracle 转换为 SQL

慢速存储过程 - SQL Server

无法从 .sql 文件创建存储过程 - JDBC