pl / sql中的动态表名

时间:2012-12-04 19:34:06

标签: oracle plsql dynamic-sql

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

查询这样的内容  从(条件计算行并选择表)表中选择员工,工资,身份证;

这可以不使用游标和EXECUTE IMMEDIATE吗?

2 个答案:

答案 0 :(得分:2)

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

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

创建FOOFOO2表。 FOO2FOO

的一行有两行
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

正如我所说,我无法理解这样做的实际情况。

答案 1 :(得分:0)

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

有关详细信息,请read about synonyms in the Concepts Guide