2017-04-24 1 views
0
SELECT CAST(MULTISET(SELECT * 
          FROM TABLE(table_a) 
         ORDER BY loc_sort_column DESC 
         ) as table_a_type 
       ) 
    INTO table_b 
    FROM dual; 

정렬 후 다른 중첩 테이블로 1 데이터 컬렉션을 버리는이 문은 있습니다.중첩 테이블 by by variable 값

내가 겪고있는 문제는 정렬되지 않는다는 것입니다. 변수 loc_sort_column이 있는데이 경우 1에서 11 사이의 정수/숫자로 열을 선택하지만 작동하지 않습니다.

나는 거기에 하나를 부착하고 그것을 잘 작동하지만이 작동 또는 무언가의 순서 1.

을 포함하는 변수를 좋아하지 않는 것?

답변

0

당신이하고있는 일은 상수로 주문하는 것입니다. AskTom 다음 : - | < 서수 위치에 따라 단지 VALUE

순서>

가 동적으로 열 위치를 반환 할 수 없습니다, 당신은 동적으로 상수 숫자, 상수 값을 반환 < 표현식>

수식이 아닌 표현식이 반환됩니다.

DECODE 함수를 사용하여 열 위치를 실제 열로 디코딩 할 수 있습니다. 내 코드 샘플을 확인하십시오 :

CREATE OR REPLACE TYPE my_type FORCE AS OBJECT 
(
    col_1 NUMBER 
    ,col_2 NUMBER 
); 
/
CREATE OR REPLACE TYPE my_nested_table AS TABLE of my_type; 
/
DECLARE 
    l_table_a  my_nested_table := my_nested_table(); 
    l_table_b  my_nested_table := my_nested_table(); 
    l_sort_column NUMBER := 2; 
BEGIN 
    l_table_a.extend(100); 
    FOR l_i IN 1..l_table_a.COUNT LOOP 
    l_table_a(l_i) := my_type(ROUND(DBMS_RANDOM.RANDOM,0), ROUND(DBMS_RANDOM.RANDOM,0)); 
    END LOOP; 

    SELECT CAST(
      MULTISET(
       SELECT * 
       FROM TABLE(l_table_a) 
       ORDER BY DECODE(l_sort_column, 1, col_1 
              , 2, col_2) DESC 
      ) AS my_nested_table 
     ) 
     INTO l_table_b 
     FROM dual; 

    DBMS_OUTPUT.PUT_LINE('col_1 col_2'); 
    FOR l_i IN 1..l_table_b.COUNT LOOP 
    DBMS_OUTPUT.PUT_LINE(l_table_b(l_i).col_1 || ' ' || l_table_b(l_i).col_2); 
    END LOOP; 
END; 
/
+0

이것은 여전히 ​​내 시나리오에서 작동하지 않습니다. 저는 성명서에서 파생되지 않은 값을 도입하려고 시도하고 있기 때문에 이것이 동적 성명이 될 수 있고 그것을 사용하려고 시도했지만 여전히 문제가 있다는 것을 깨달았습니다 – programmerNOOB

+0

그래서 당신의 시나리오는 무엇입니까? 왜냐하면 그것은 당신이 요구 한 것과 정확히 일치하기 때문입니다. – kpater87