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 FUNCTION
和WITH 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功能暂不支持多个存储过程/函数。
- 定义的函数的作用域为所在的查询表达式内。
- 定义的函数不能是外部函数。