【问题标题】:Dynamic table name in pl/sqlpl/sql 中的动态表名
【发布时间】:2012-11-22 12:39:13
【问题描述】:

我需要从表 Table_A 中选择列,但是还有另一个表具有相同的模式 Table_B。查询应动态确定来自表。例如。如果 Table_A 有更多行,则使用 Table_A,否则使用 Table_B。

查询类似的内容 从(条件计算行数并选择表)表中选择员工、工资、id;

这是否可能不使用游标和 EXECUTE IMMEDIATE??。

【问题讨论】:

  • 不,没有 dbms_sql,在 PL/SQL 中执行立即数或游标都是不可能的。

标签: oracle plsql dynamic-sql


【解决方案1】:

通常,您会为这类事情使用动态 SQL。这将涉及使用DBMS_SQL 包、EXECUTE IMMEDIATE 或执行OPEN <<cursor>> FOR <<SQL statement string>>

如果您真的想使用静态 SQL,您可以查询两个表并只返回一组结果。我无法想象这种情况会真正有意义,但你当然可以做到

创建一个FOO 和一个FOO2 表。 FOO2 有两行到FOO 的一行

SQL> create table foo( col1 number );

Table created.

SQL> create table foo2( col1 number );

Table created.

SQL> insert into foo values( 1 );

1 row created.

SQL> insert into foo2 values( 1 );

1 row created.

SQL> insert into foo2 values( 2 );

1 row created.

运行查询。这将返回来自FOO2的所有数据

SQL> ed
Wrote file afiedt.buf

  1  select col1
  2    from (select the_union.*,
  3                 max(cnt) over () max_cnt
  4            from (select col1, count(*) over () cnt from foo
  5                  union all
  6                  select col1, count(*) over () from foo2) the_union)
  7*  where cnt = max_cnt
SQL> /

      COL1
----------
         1
         2

FOO 中插入更多行。现在同样的查询将返回来自FOO的所有数据

SQL> insert into foo values( 3 );

1 row created.

SQL> insert into foo values( 5 );

1 row created.

SQL> commit;

Commit complete.

SQL> select col1
  2    from (select the_union.*,
  3                 max(cnt) over () max_cnt
  4            from (select col1, count(*) over () cnt from foo
  5                  union all
  6                  select col1, count(*) over () from foo2) the_union)
  7   where cnt = max_cnt;

      COL1
----------
         1
         3
         5

不过,正如我所说,我无法理解这样做实际上有意义的情况。

【讨论】:

  • 感谢您的询问。我在内联视图中使用此查询,这是创建视图的大选择语句的一部分。非常感谢任何动态创建视图的建议。
  • @user1876832 - 我不确定我是否理解这个问题。您可以在视图中使用我上面概述的方法。如果您不想在每次运行查询时都同时访问这两个表,则需要使用动态 SQL(DBMS_SQLEXECUTE IMMEDIATEOPEN cursor FOR query)。但是,如果您谈论的是 DDL 语句 (CREATE VIEW),那么动态 SQL 就更没有意义了——因为您应该只在安装时发出 DDL,您希望视图访问不同的表似乎非常不寻常,具体取决于脚本运行时的数据状态。
【解决方案2】:

我完全猜测您真正想要做什么,但我认为您想使用同义词。我猜当您应该使用 TableA 与 TableB 时,会触发某种事件。创建一个指向 TableA 的同义词“my_table”并让您的视图从“my_table”中选择。然后,当您希望视图指向 TableB 时,只需将同义词切换为指向 TableB,您无需对视图执行任何操作。

欲了解更多信息,read about synonyms in the Concepts Guide

【讨论】:

  • 在不使用 dbms_sql 的情况下,您无法在 PL/SQL 中切换同义词、执行立即游标或构造游标,因此这个建议没有什么意义,因为 OP 仍然需要做同样的事情。
  • @Ben - 我明白这一点,但我仍然猜测这确实是 OP 想要做的。我认为需求列表是错误的,OP 只是因为他们想将表引用放在视图中,而不是说他们不能在过程中的任何时候立即使用执行。但同样,这只是模糊问题描述的猜测。
猜你喜欢
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 2017-03-17
相关资源
最近更新 更多