gpt4 book ai didi

sql - 函数从具有特定列的 sql 返回 sys_refcursor 调用

转载 作者:行者123 更新时间:2023-12-04 22:14:19 25 4
gpt4 key购买 nike

这可能有点傻,但我想知道这是否可能。

我有一个返回 sys_refcursor 的函数

CREATE OR REPLACE FUNCTION get_employee_details(p_emp_no IN EMP.EMPNO%TYPE)
RETURN SYS_REFCURSOR
AS
o_cursor SYS_REFCURSOR;
BEGIN
OPEN o_cursor FOR
SELECT EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO
FROM emp
WHERE EMPNO = p_emp_no;

RETURN o_cursor;
-- exception part
END;
/

我可以使用得到结果
select  get_employee_details('7369') from dual;

是否可以通过指定列名从上述函数中获取结果?
例如。如果我想获得 ename 或工资,我如何在不使用 plsql 块的情况下在 sql 语句中指定?
就像是
select  get_employee_details('7369') <specific column> from dual;

最佳答案

为此,您可能需要查看 PIPELINED职能。但是,您必须在 PL/SQL 级别声明显式类型。该部分将设置输出列名称:

CREATE OR REPLACE TYPE my_rec AS OBJECT (
c CHAR,
n NUMBER(1)
);

CREATE OR REPLACE TYPE my_tbl AS TABLE OF my_rec;

现在,最大的优势是您不仅可以“重命名”列,还可以即时修改光标中的记录。例如:
CREATE OR REPLACE FUNCTION my_fct
RETURN my_tbl PIPELINED
AS
-- dummy data - use your own cursor here
CURSOR data IS
SELECT 'a' as A, 1 AS B FROM DUAL UNION
SELECT 'b', 2 FROM DUAL UNION
SELECT 'c', 3 FROM DUAL UNION
SELECT 'd', 4 FROM DUAL;
BEGIN
FOR the_row IN data
LOOP
PIPE ROW(my_rec(the_row.a, the_row.b*2));
-- ^^
-- Change data on the fly
END LOOP;
END

用法:
SELECT * FROM TABLE(my_fct())
-- ^^^^^^^^^^^^^^^
-- Use this "virtual" table like any
-- other table. Supporting `WHERE` clause
-- or any other SELECT clause you want

生产:
C   N
a 2
b 4
c 6
d 8

关于sql - 函数从具有特定列的 sql 返回 sys_refcursor 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13690110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com