0

パラメータに基づいてさまざまなテーブルを選択することに挑戦しました。私の質問はこれとほとんど同じですが、私の場合は次のとおりです。

フロントエンド [1,2,3,4] からのパラメーター リストがあるとします。

このパラメーターに基づいて、SQL のさまざまなテーブルを選択するにはどうすればよいですか?

Java では、次のことができます。

StringBuffer sql = new StringBuffer();
if ( parameter == 1)
    sql.append("Select * from TABLEA");
else if  ( parameter == 2)
    sql.append("Select * from TABLEB");
else if  ( parameter == 3)
    sql.append("Select * from TABLEC");
else if  ( parameter == 4)
    sql.append("Select * from TABLED");

SQL自体でこれを行うにはどうすればよいですか?

4

2 に答える 2

1

ではOracle PLSQL、次のように行うことができます。

PROCEDURE TEST(
        o_retcd OUT NUMBER,
        o_errmsg OUT VARCHAR2,
        o_currStatus IN OUT SYS_REFCURSOR,
        i_type IN VARRAY --your parameters
              ) 
BEGIN

FOR i IN i_type.FIRST..i_type.LAST
    LOOP
         if i_type(i) = 1 then
          OPEN o_currStatus FOR
            select * from TABLEA;
         elsif i_type(i) = 2 then
          OPEN o_currStatus FOR
            select * from TABLEB;
         elsif i_type(i) = 3 then
          OPEN o_currStatus FOR
            select * from TABLEC;
         elsif i_type(i) = 4 then
          OPEN o_currStatus FOR
            select * from TABLED;
         end if;
    END LOOP;

  EXCEPTION
 --Exception handling
  WHEN OTHERS THEN
      o_retcd := 100;

END;
于 2012-10-11T02:09:52.780 に答える
0

についてお読みくださいDynamic SQL

基本的に、それは次のようなものになります

  l_query :=    'select * from ' 
             || case l_param 
                when 1 then 'table1'
                when 2 then 'table2'
                end;

次に、この文字列を使用してカーソルを開きます。クエリの実際の動作に応じて、これを行うためのいくつかのオプションがあります。

あなたの質問を注意深く読んでいませんでした。純粋な sqlソリューションが必要な場合は、おそらく何もありません。おそらくunion all、異なるテーブルからの結果セットを連結するためにのみ使用し (構造が似ていると仮定)、パラメーター値でフィルター処理するだけです。

update : 別のオプションは次のようなものです-XMLを生成してクエリしますが、それが良い習慣であるかどうかは完全にはわかりません:)

10:54:40 SYSTEM@dwh-prod> l                                    
  1  select *                                                  
  2    from xmltable(                                          
  3       '/ROWSET/*'                                          
  4       passing xmltype(                                     
  5          dbms_xmlgen.getxml(                               
  6            'select * from '                                
  7            || case :param                                  
  8               when 1 then 'all_objects'                    
  9               when 2 then 'user_objects'                   
 10               else 'dba_objects'                           
 11               end                                          
 12            ||'  where rownum < 10'                         
 13           )                                                
 14       )                                                    
 15       columns                                              
 16       object_name varchar2(100) path '//ROW/OBJECT_NAME',  
 17       object_type varchar2(100) path '//ROW/OBJECT_TYPE',  
 18       status      varchar2(100) path '//ROW/STATUS'        
 19*    )                                                      
10:54:40 SYSTEM@dwh-prod> exec :param := 1;                    

PL/SQL procedure successfully completed.                       

Elapsed: 00:00:00.01                                           
10:55:00 SYSTEM@dwh-prod> /                                    

OBJECT_NAME          OBJECT_TYPE          STATUS               
-------------------- -------------------- -------------------- 
CON$                 TABLE                VALID                
I_COL2               INDEX                VALID                
I_USER#              INDEX                VALID                
C_TS#                CLUSTER              VALID                
I_OBJ#               INDEX                VALID                
I_CON2               INDEX                VALID                
I_OBJ5               INDEX                VALID                
IND$                 TABLE                VALID                
BOOTSTRAP$           TABLE                VALID                

9 rows selected.                                               

Elapsed: 00:00:00.04                                           
10:55:01 SYSTEM@dwh-prod> exec :param := 2;                    

PL/SQL procedure successfully completed.                       

Elapsed: 00:00:00.00                                           
10:55:06 SYSTEM@dwh-prod> /                                    

OBJECT_NAME          OBJECT_TYPE          STATUS               
-------------------- -------------------- -------------------- 
AQ$DEF$_AQCALL       VIEW                 VALID                
AQ$DEF$_AQERROR      VIEW                 VALID                
AQ$_DEF$_AQCALL_E    QUEUE                VALID                
AQ$_DEF$_AQCALL_F    VIEW                 VALID                
AQ$_DEF$_AQERROR_E   QUEUE                VALID                
AQ$_DEF$_AQERROR_F   VIEW                 VALID                
AQ$_INTERNET_AGENTS  TABLE                VALID                
AQ$_INTERNET_AGENT_P TABLE                VALID                
AQ$_QUEUES           TABLE                VALID

9 rows selected.                               

Elapsed: 00:00:00.04                           
于 2012-10-11T02:21:32.263 に答える