gpt4 book ai didi

sql - 如何在 SQL 中检索 PL/SQL 记录类型?

转载 作者:行者123 更新时间:2023-12-01 13:25:31 25 4
gpt4 key购买 nike

<分区>

存在一个共享包,它定义了一个学生记录类型和一个返回学生的函数:

CREATE OR REPLACE PACKAGE shared.student_utils IS
--aggregates related data from several tables
TYPE student_rec IS RECORD (
id student.id%TYPE,
username student.username%TYPE,
name student.name%TYPE,
phone phone.phone%TYPE
/*etc.*/
);

FUNCTION get_student(student_id IN student.id%TYPE) RETURN student_rec;
END;

现在,我正在编写一个包,为 Apex 应用程序提供 API 以供使用。特别是,我需要以可以通过 SQL 选择的格式提供学生记录和其他相关数据(并显示在 Apex 的报告页面中。)

到目前为止,我一直在努力寻找在 SQL 中选择数据的最直接方法。显然,记录类型不能在 SQL 中使用,所以我的快速而肮脏的想法是在我的包规范中定义一个表类型,并在我的包规范/主体中定义一个 PIPELINED 函数:

CREATE OR REPLACE PACKAGE my_schema.api IS
TYPE student_tab IS TABLE OF shared.student_utils.student_rec;

FUNCTION get_all_student_data(student_id IN student.id%TYPE) RETURN student_tab PIPELINED;
END;
/
CREATE OR REPLACE PACKAGE BODY my_schema.api IS
FUNCTION get_all_student_data(student_id IN student.id%TYPE) RETURN student_tab PIPELINED IS
BEGIN
PIPE ROW(shared.student_utils.get_student(student_id));
END;
END;

...这让我可以这样选择它:

SELECT * FROM TABLE(my_schema.api.get_all_student_data(1234));

这行得通,但是只为一行构建流水线表太过分了,而且 Oracle 的解释计划似乎也同意。

据说在 Oracle 12c 中,应该有更多可用的选项:

More PL/SQL-Only Data Types Can Cross PL/SQL-to-SQL Interface

...但我似乎无法在我的场景中弄明白。将函数更改为:

FUNCTION get_all_student_data RETURN student_tab IS
r_student_tab student_tab;
BEGIN
r_student_tab(1) := shared.student_utils.get_student(student_id);

RETURN r_student_tab;
END;

...将编译,但我不能像以前那样从中SELECT

好吧,废话少说,这是我的实际问题 - 调用返回记录类型的 PL/SQL 函数并在 SQL 中选择/操作结果的最直接方法是什么?

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