你正在做的是按常数排序。继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;
/
这仍然不适用于我的方案。我已经意识到,因为我试图引入并非来自声明的价值观,这可能是一个动态声明,并已切换尝试使用,但仍然有问题 – programmerNOOB
那么你的情况是什么?因为它完全符合你的要求。 – kpater87