2017-04-24 81 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个数据集合扔到另一个嵌套表中。通过嵌套表顺序排列没有考虑变量值

我遇到的问题是它没有排序。我有一个变量loc_sort_column,在这种情况下,将是1到11之间的整数/数字,选择列但它不起作用。

我已经在那里停留1和它的作品不错,但它似乎不喜欢它包含1

这是操作什么的顺序变量?

回答

0

你正在做的是按常数排序。继AskTom

不能动态返回列位置,您可以动态 返回的常量,一个数字,一个恒定值 - 只是一个值

为了通过<顺序位置> | <表达式>

您正在返回表达式 - 而不是序数位置。

您可以做的是使用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