在PL/SQL块中使用函数
在Oracle中,引入了12c。简单地说:在PL/SQL块中使用函数,sql,oracle,common-table-expression,oracle12c,sql-function,Sql,Oracle,Common Table Expression,Oracle12c,Sql Function,在Oracle中,引入了12c。简单地说: WITH FUNCTION f_double(i IN INT) RETURN INT AS BEGIN RETURN i*2; END; SELECT f_double(t.c) FROM(SELECT 10 AS c FROM dual UNION SELECT 20 FROM dual) t; -- output: 20 40 现在,如果我尝试在PL/SQL块中使用它: DECLARE TYPE t_i IS TABLE OF IN
WITH FUNCTION f_double(i IN INT) RETURN INT
AS
BEGIN
RETURN i*2;
END;
SELECT f_double(t.c)
FROM(SELECT 10 AS c FROM dual UNION SELECT 20 FROM dual) t;
-- output:
20
40
现在,如果我尝试在PL/SQL块中使用它:
DECLARE
TYPE t_i IS TABLE OF INT;
v_i t_i;
BEGIN
WITH FUNCTION f_double(i IN INT) RETURN INT
AS
BEGIN
RETURN i*2;
END;
SELECT f_double(t.c)
BULK COLLECT INTO v_i
FROM(SELECT 10 AS c FROM dual UNION SELECT 20 FROM dual) t;
FOR i IN v_i.FIRST..v_i.LAST LOOP
DBMS_OUTPUT.put_line('v_i => ' || v_i(i));
END LOOP;
END;
它将以错误结束:
当然,我可以使用动态SQL的简单技巧使其工作:
DECLARE
TYPE t_i IS TABLE OF INT;
v_i t_i;
BEGIN
EXECUTE IMMEDIATE q'{
WITH FUNCTION f_double(i IN INT) RETURN INT
AS
BEGIN
RETURN i*2;
END;
SELECT f_double(t.c)
FROM(SELECT 10 AS c FROM dual UNION SELECT 20 FROM dual) t
}' BULK COLLECT INTO v_i;
FOR i IN v_i.FIRST..v_i.LAST LOOP
DBMS_OUTPUT.put_line('v_i => ' || v_i(i));
END LOOP;
END;
输出:
v_i => 20
v_i => 40
现在我想知道为什么第二个示例不起作用(使用公共表表达式WITH子句
可以正常工作)。也许我遗漏了一些非常明显的东西,或者这是函数的局限性
欢迎参考官方文档。不是官方文档,但这里有一个链接,显示问题以前已经“记录”过。可能找不到这方面的文件;Oracle通常不会记录什么不起作用(如果它本来就不打算起作用的话)。@lad2025。。有问题的链接说PL/SQL不支持该功能<代码>此功能似乎没有任何PL/SQL支持。任何使用它的尝试都会导致编译错误
@mathguy VamsiPrabhala谜团已解决:)@VamsiPrabhala请将其作为答案发布,以便我可以接受:)
v_i => 20
v_i => 40