2012-12-04 80 views
1

我需要从表Table_A中选择列,但是还有另一个表具有相同的架构Table_B。查询应该动态地确定从表。例如。如果Table_A有更多的行,那么使用Table_A或者使用Table_B。pl/sql中的动态表名称

查询这样的内容 select employee,salary,id from(condition to count rows and select the table)table;

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

+1

不,如果没有dbms_sql,在PL/SQL中执行立即数或游标是不可能的。 – Ben

回答

2

通常情况下,您会使用动态SQL来处理这类事情。这将涉及使用DBMS_SQL程序包,EXECUTE IMMEDIATE或执行OPEN <<cursor>> FOR <<SQL statement string>>

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

创建一个FOOFOO2表。 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 

返回所有的数据正如我所说的,虽然我不能完全理解的情况下,将真正意义做到这一点。

+0

谢谢您的查询。我在内联视图中使用这个查询,这是创建视图的大选择语句的一部分。任何建议动态做它创建一个视图是高度赞赏。 – user1876832

+1

@ user1876832 - 我不确定我是否理解这个问题。您可以在视图中使用上面概述的方法。如果你不想在每次运行查询时都敲两个表,你需要使用动态SQL('DBMS_SQL','EXECUTE IMMEDIATE'或'OPEN cursor FOR query')。但是,如果您正在讨论DDL语句('CREATE VIEW'),那么动态SQL的意义就更小了 - 因为您应该只在安装时发布DDL,看起来非常不寻常的是您希望视图碰到不同的表取决于脚本运行时的数据状态。 –

0

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

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

+0

您不能在不使用dbms_sql的情况下在PL/SQL中切换同义词,执行immediate或构造的游标,因此这个建议中没有什么意义,因为OP仍然需要做同样的事情。 – Ben

+0

@Ben - 我明白,但我仍然猜测这真的是OP想要做的。我认为需求列表是错误的,OP只是说这是因为他们希望将表引用放在视图中,而不是说他们不能在流程中的任何位置立即使用执行。但是,这一切都只是从模糊的问题描述中猜测出来的。 – Craig