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用于连接来自不同表的结果集(假设它们具有相似的结构),然后根据您的参数值对其进行过滤。

更新:另一种选择是这样的 - 生成 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 回答