Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PL/SQL块中使用函数_Sql_Oracle_Common Table Expression_Oracle12c_Sql Function - Fatal编程技术网

在PL/SQL块中使用函数

在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

在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 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