[英]Oracle 12c: Can I invoke a function from a WITH clause which both takes and returns a table?
我想编写一个PL / SQL函数,该函数可用于各种查询,尤其是WITH子句的子查询。 棘手的部分是我希望函数同时接收和返回信息的单列表(或CURSOR)。
详细信息:假设此功能只是根据一些非常复杂的标准对员工ID列表进行排序。 我们有这个:
希望到目前为止一切顺利。
现在,我认为几乎可以在任何地方使用TABLE运算符使用函数的输出了; 例如:
WITH
wanted_emps AS (...), -- find employees we want, as table of emp_id
ranked_emps AS (
SELECT rownum() as rank, emp_id
FROM TABLE(SORT_EMPLOYEES(...???...))
),
...
问题是:如何从“ wanted_emps”获取雇员列表,并将其作为SORT_EMPLOYEES的输入? 上面的“ ... ??? ...”中有什么内容? 这有可能吗?
请注意 ,我希望在普通SQL中使用它,尤其是在如上所述的WITH子句的子查询中使用-而不是PL / SQL。 谢谢!
这是一个如何将值收集到一个集合中的示例,然后可以COLLECT
集合传递给返回另一个集合的FUNCTION
:
Oracle安装程序 :
CREATE TYPE numbers_table AS TABLE OF NUMBER;
CREATE TABLE test_data ( grp, value ) AS
SELECT 1, 1 FROM DUAL UNION ALL
SELECT 1, 2 FROM DUAL UNION ALL
SELECT 1, 3 FROM DUAL UNION ALL
SELECT 2, 4 FROM DUAL UNION ALL
SELECT 2, 5 FROM DUAL UNION ALL
SELECT 3, 6 FROM DUAL;
查询 :
WITH FUNCTION square( i_numbers IN numbers_table ) RETURN numbers_table
IS
p_numbers numbers_table := numbers_table();
p_count PLS_INTEGER;
BEGIN
IF i_numbers IS NULL THEN
p_count := 0;
ELSE
p_count := i_numbers.COUNT;
END IF;
p_numbers.EXTEND( p_count );
FOR i IN 1 .. p_count LOOP
p_numbers(i) := i_numbers(i) * i_numbers(i);
END LOOP;
RETURN p_numbers;
END;
collected_rows ( grp, grouped_values ) AS (
SELECT grp,
CAST(
COLLECT( value ORDER BY value )
AS numbers_table
)
FROM test_data
GROUP BY grp
)
SELECT c.grp,
t.COLUMN_VALUE AS squared_value
FROM collected_rows c
CROSS JOIN
TABLE( square( c.grouped_values ) ) t;
输出 :
\n 玻璃钢| SQUARED_VALUE\n -:| ------------:\n 1 | 1个\n 1 | 4\n 1 | 9\n 2 | 16\n 2 | 25\n 3 | 36\n
db <> 在这里拨弄
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.