我可以一次在程序中创建具有不同名称的表吗[关闭]
Posted
技术标签:
【中文标题】我可以一次在程序中创建具有不同名称的表吗[关闭]【英文标题】:Can I create tables with different names at a time into procedure [closed] 【发布时间】:2018-07-15 14:25:46 【问题描述】:我写的
create or replace procedure crab
(no in number, name in varchar2, marks in number)
as
begin
create table customer (no number(6),name varchar2 (12),marks number (3));
end;
【问题讨论】:
程序参数和表中的列有什么关系?你期望得到什么? 还有谁能告诉我如何使用游标或过程在 plsql 中一次创建 5 个表 是的,我正在尝试使用这些列创建一个表 这里非常适合 Ryan Reynolds 的“但为什么”模因。使用过程实现 DDL 语句被认为是“不好的做法”——您应该避免这种方法。如果您在运行时需要一些临时数据结构 - oracle 提供了大量的 PL/SQL 集合类型选项。 试试execute immediate
(带有关于动态代码的常见警告)。
【参考方案1】:
虽然你可以这样做,但你很可能不应该这样做。你为什么要?这就是您问题下的 cmets 所建议的。在 Oracle 中,您通常不会动态地创建表,除非有非常好的理由这样做。你的理由是什么?
不管怎样,这里有一个例子来说明如何做到这一点。
SQL> create or replace procedure crab as
2 begin
3 execute immediate 'create table tab1 (no number(6), name varchar2(12))';
4 execute immediate 'create table tab2 (no number(6), name varchar2(12))';
5 -- etc.
6 end;
7 /
Procedure created.
SQL> begin
2 crab;
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> select * from tab where tname in ('TAB1', 'TAB2');
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
TAB1 TABLE
TAB2 TABLE
SQL>
【讨论】:
这个问题其实是面试官提出的。所以,我只想知道答案。反正tq这么多 嗯,这是答案 - 动态 SQL。所以,不客气。【参考方案2】:如果您需要在过程中执行 DDL,则需要动态 SQL。
例如:
...
Begin
execute immediate 'Create table customer (no number(6),name varchar2(12),marks number(3))';
End;
无论输入参数如何,这都会创建一个列名和类型为动态 DDL 的表。
【讨论】:
Tq 这么多。我从你那里学到了一些知识以上是关于我可以一次在程序中创建具有不同名称的表吗[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在 MS SQL Server 中创建作为保留字/关键字的表名 [关闭]