2012-10-11 3 views
0

매개 변수를 기반으로 다른 테이블을 선택할 때 어려움을 겪었습니다. ,SQL 매개 변수를 기반으로 여러 테이블 선택

내가 프런트 엔드이 매개 변수를 기반으로 [1,2,3,4]

그리고에서 매개 변수 목록을 말해봐 : 내 질문은 여기 this에 거의 유사하지만 것입니다 내 경우입니다 SQL에서 다른 테이블을 선택하려면 어떻게해야합니까?

자바에서 내가 할 수있는 :

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 자체에 할 수 있습니까?

답변

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; 
+0

흠이다 완전히 확실하지 않다 당신이해야 할 일 : i_type.FIRST..i_type.LAST에 대한 i? –

+0

그래서'i_type' 배열을 반복 할 수 있습니다. [1,2,3,4]를 매개 변수'i_type'로 전달할 수 있습니다. –

+0

드롭 다운 목록에서 매개 변수로 전달할 것이므로 for 루프도 계속 적용 할 수 있습니까? –

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 [email protected]> 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 [email protected]> exec :param := 1;      

PL/SQL procedure successfully completed.      

Elapsed: 00:00:00.01           
10:55:00 [email protected]>/         

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 [email protected]> exec :param := 2;      

PL/SQL procedure successfully completed.      

Elapsed: 00:00:00.00           
10:55:06 [email protected]>/         

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       
+0

그럼 선택을하기 위해 절차를 사용해야합니까? –

+0

나는 프로 시저를 사용 하겠지만, 반드시 그런 것은 아니다 - 내 업데이트를 확인하라. –

+0

아. 내 상반부가 XML을 사용하기를 원할 것이라고 생각하지 않습니다. 절차가 잘되어야합니다. 감사. –

관련 문제