作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<分区>
存在一个共享包,它定义了一个学生记录类型和一个返回学生的函数:
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 中选择/操作结果的最直接方法是什么?
我是一名优秀的程序员,十分优秀!