这个答案是我另一个答案的替代品。另一个答案是一个更好的解决方案,假设返回类型没有任何问题。
此解决方案可以与任何可以对数据库进行SQL调用的语言一起使用。因此,即使您使用的应用程序语言不支持调用PL/SQL函数,您仍然可以获得所需的内容。
如果无法从Oracle数据库中获取某些内容,例如自定义类型或复杂数据集,则可以编写pipelined table function。在
流水线表函数允许您在pl/sql端执行所需的任何操作,并以您选择的表格格式格式化/返回结果。在
然后在应用程序层,您可以从这个函数中选择,就像它是一个表一样。在
我已经a post here解释了如何在NodeJS调用中使用它,但是我修改了这个示例以使用Python。在
在PL/SQL中:
(这不一定要在包中,这只是我使用的示例)/* defined in package spec */
TYPE SearchType IS RECORD (
member_id NUMBER,
dino_name VARCHAR2(400) );
TYPE SearchTypeSet IS TABLE OF SearchType;
/* defined in package body */
FUNCTION text_only(
member_id_p IN INTEGER,
search_string IN VARCHAR2)
RETURN SearchTypeSet PIPELINED
IS
retSet SearchType;
BEGIN
FOR v_rec IN (
SELECT member_id,
dino_name
FROM dd_members
WHERE contains (about_yourself,
search_string) > 0
AND member_id != member_id_p) LOOP
retSet.dino_name := v_rec.dino_name;
retSet.member_id := v_rec.member_id;
pipe ROW (retSet);
END LOOP;
RETURN;
END;
之后,它是一个简单的从应用程序中选择语句。在
在Python中:
^{pr2}$
对于您的特定问题,您可以将对dbms_datapump.get_status的调用包装在一个流水线函数中,而不是在示例中使用select。在