暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 使用表值作为参数的流水线函数

askTom 2017-07-07
316

问题描述

嗨,汤姆 (Oracle大师),

感谢你们通过这个伟大的网站向Oracle社区提供的伟大指导!

我有一个关于Oracle流水线功能的问题。

我已经创建了一个简单的测试用例供您检查。

LiveSQL测试用例链接:https://livesql.oracle.com/apex/livesql/s/e8qpecu5vvr40oh9dklh68lcq

我创建了一个流水线函数,它接受一个参数 (假设类型为DATE),并返回一个PL/SQL表作为resultset。

当我用一些日期作为参数执行该函数时 (即直接用该日期参数调用该函数),它工作正常。

从表中选择 * (MY_FUNC(SYSDATE))

我想知道是否有任何方法可以使此参数在调用过程中不进行硬编码,例如从表单元格获取。示例: 我在测试用例中创建了一个小表SOURCE_DATA,其中包含日期列 (ST_DATE)。是否可以执行流水线函数,它将接受SOURCE_DATA表 (ST_DATE列) 中的单元格值,而不是我手动传递DATE参数?

我在努力实现这样的目标

T为 (从SOURCE_DATA中选择ST_DATE,其中ID = 1)
从表中选择 * (MY_FUNC(T.ST_DATE)) ------------

[英语不是我的母语,所以请原谅我可以用更好的方式]


专家解答

是的,一个函数可以将光标作为输入,因此

SQL> CREATE OR REPLACE FUNCTION MY_FUNC (rc sys_refcursor) RETURN MY_TAB PIPELINED IS
  2    type date_list is table of date index by pls_integer;
  3    l_date_tab date_list;
  4  BEGIN
  5    loop
  6    fetch rc bulk collect into l_date_tab limit 100;
  7      for i in 1 .. l_date_tab.count LOOP
  8        PIPE ROW (MY_OBJECT(i,l_date_tab(i),'Row '||i));
  9      END LOOP;
 10      exit when rc%notfound;
 11    end loop;
 12    RETURN;
 13  END;
 14
 15  /

Function created.

SQL> select *
  2  from table(my_func(cursor(select st_date from SOURCE_DATA)));

         A B         C
---------- --------- -------------------------
         1 01-JUL-17 Row 1
         2 02-JUL-17 Row 2
         3 03-JUL-17 Row 3
         4 04-JUL-17 Row 4
         5 05-JUL-17 Row 5
         6 06-JUL-17 Row 6
         7 07-JUL-17 Row 7
         8 08-JUL-17 Row 8

8 rows selected.


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论