问题描述
嗨,汤姆 (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)) ------------
[英语不是我的母语,所以请原谅我可以用更好的方式]
感谢你们通过这个伟大的网站向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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




