2014-06-13 3 views
0

이 배열을 'select from..where..in(YYY)' 문에 사용하고 싶습니다.SELECT 문에서 배열을 사용합니까?

배열 값을 반복하고 싶지 않습니다. 내 선택 문에 전체 을 사용하고 싶습니다.

1 declare 
    2 type array is table of varchar2(30) index by binary_integer; 
    3 a array; 
    4 procedure p(array_in array) 
    5 is 
    6 begin 
    7  for i in 1..array_in.count loop 
    8  dbms_output.put_line(array_in(i)); 
    9  end loop; 
10 end; 
11 begin 
12 a(1) := 'Apple'; 
13 a(2) := 'Banana'; 
14 a(3) := 'Pear'; 
15 p(a); 
16 end; 
17/
+0

질문의 배경은 무엇입니까? 달성하고자하는 것에 따라, 예를 들어 array_in.first의 forall과 같은 대량 작업을 사용하는 것과 같이 하나 또는 다른 것을 사용할 수 있습니다. array_in.last UPDATE sometable SET a = b WHERE a = array_in (i); – ErikL

+0

@ErikL 답변으로 작성하십시오. –

답변

0

당신은 당신의 배열을 반환하는 function를 작성하여이 작업을 수행 할 수 있습니다

불행하게도, 나는 그것을 반복하는 방법만을 발견했다. 외부 유형과 함수를 만듭니다


create or replace type t_array is table of varchar2(30); 

create or replace function list_of_fruits 
    return t_array 
    is 
    l_ t_array:=t_array(); 
    begin 
    l_.extend(); l_(l_.COUNT) := 'Apple'; 
    l_.extend(); l_(l_.COUNT) := 'Banana'; 
    l_.extend(); l_(l_.COUNT) := 'Pear'; 
    return l_; 
    end list_of_fruits; 
/
여기
  • 그리고 그것을 사용하는 방법
      가 : 그럼 당신은 선택에 사용할 수 있습니다

    select * from (
          select 'Peter' this_and_that from dual 
    union all select 'Joy'     from dual 
    union all select 'God'     from dual 
    union all select 'Pear'    from dual 
    union all select 'Man'     from dual 
    ) 
    where this_and_that in (
         select column_value from (table(list_of_fruits())) 
    ); 
    

    여기에있는 속임수는 함수를 사용하여 select에 대한 SQL 사용 가능 목록을 작성하는 것입니다. 저에게도 어려운 것은 그 이름을 발견하는 것이 었습니다. column_value ... 오라클의 내장 상수입니다 : 어떻게 생각하십니까?

  • 0

    오라클 정의 콜렉션을 사용하여이를 수행 할 수도 있습니다. 아래 및 예제를 참조하십시오.

    declare 
    
    a sys.odcivarchar2list; 
    
        begin 
        a := sys.odcivarchar2list('Apple','Banana','Pear'); 
    
        for r in (SELECT m.column_value m_value 
          FROM table(a) m) 
        loop 
         dbms_output.put_line (r.m_value); 
        end loop; 
    end;