【问题标题】: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(带有关于动态代码的常见警告)。

标签: oracle plsql


【解决方案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 这么多。我从你那里学到了一些知识
猜你喜欢
  • 2021-06-07
  • 2014-06-05
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
相关资源
最近更新 更多