我可以一次在程序中创建具有不同名称的表吗[关闭]

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 中创建作为保留字/关键字的表名 [关闭]

Sql Server 视图可以引用不同数据库中的表吗?

如何在mysql程序中创建临时表并生成不同的名称?

我可以从带有标题的csv文件中自动在PostgreSQL中创建一个表吗?

我可以在 RedShift 中创建快速插入暂存表吗?

有没有办法一次在 BigQuery 中创建多个表?