2012-12-04 77 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