Skip to content

WITH FUNCTION

功能描述

WITH FUNCTION子句用于在SQL语句中临时声明并定义存储函数,这些存储函数可以在其作用域内被引用。相比模式对象中的存储函数,通过WITH FUNCTION定义的存储函数在对象名解析时拥有更高的优先级。WITH FUNCTION定义的存储函数对象也不会存储到系统表中,且只在当前SQL语句内有效。

语法格式

sql
WITH
 FUNCTION[PROCEDURE] <name_function[name_procedure]>
 BEGIN
 ... 
 END;
SELECT <name_function[name_procedure]> FROM <TABLE>;

参数说明

name_function[name_procedure]:临时声明并定义的存储函数/过程。

示例

使用WITH FUNCTIONWITH PROCEDURE定义临时函数和临时过程:

sql
SQL> CREATE TABLE T_with_tab(id INT,name VARCHAR(20));  

SQL> INSERT INTO T_with_tab VALUES(1,'aa');

-- WITH FUNCTION
SQL> WITH FUNCTION with_function(p_id IN NUMBER) RETURN NUMBER IS BEGIN RETURN p_id;END;SELECT with_function(id) FROM T_with_tab WHERE rownum = 1;

EXPR1 | 
------------------------------------------------------------------------------
1|

-- WITH PROCEDURE
SQL> WITH PROCEDURE with_procedure(p_id IN NUMBER) IS BEGIN DBMS_OUTPUT.put_line('p_id='||p_id); END;SELECT id FROM T_with_tab WHERE rownum = 1;

ID | 
------------------------------------------------------------------------------
1 |

使用动态SQL调用WITH FUNCTION

sql
SQL> CREATE TABLE test_with_function_1(id INT,name VARCHAR(20)); 

SQL> INSERT INTO test_with_function_1 VALUES(1,'AB');   

SQL> DECLARE
    l_sql VARCHAR2(32767);
    l_cursor SYS_REFCURSOR;
    l_value NUMBER;
BEGIN
    l_sql := 'WITH
              FUNCTION with_function(p_id IN NUMBER) RETURN NUMBER IS
              BEGIN
                  RETURN p_id;
              END;
              SELECT with_function(id)
              FROM TEST_WITH_FUNCTION_1
              WHERE rownum = 1';
    OPEN l_cursor FOR l_sql;
    FETCH l_cursor INTO l_value;
    DBMS_OUTPUT.PUT_LINE('输出:l_value=' || l_value);
    CLOSE l_cursor;
END;
/
输出:l_value=1

注意:

  • WITH FUNCTION功能暂不支持多个存储过程/函数。
  • 定义的函数的作用域为所在的查询表达式内。
  • 定义的函数不能是外部函数。