从 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。 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 语句。原理是一样的,只是打字时间长一些。此外,我不完全清楚它如何适用于您更改这些列的数据类型的先前要求。
【讨论】:
谢谢..我用过那个..它工作得很好。非常感谢 如果您正在使用它并且它正在工作,那么请将答案标记为已接受(单击它左侧的大检查使其变为绿色。)【参考方案2】:您可以将查询生成为字符串并使用 'exec' 关键字执行。
【讨论】:
exec
是 SQL*Plus,而不是 PL/SQL
OP最初没有提到Oracle。有足够知识的人可以从user_tab_columns
的存在中推断出来,但这个回复是无辜的。
无辜,但不是很有帮助:)以上是关于从 SQL 存储过程创建/更改的主要内容,如果未能解决你的问题,请参考以下文章
如果存储过程尚不存在,则创建它,但不要更改也不要删除现有的存储过程