存储函数的语法
与存储过程类似,不同之处是有返回值。
给返回值(RETURN)指定的数据类型,不可指定长度。
例)
× return char(2)
○ return char
函数可以作为SQL函数从SQL中调用,但是有以下限制:
△ 不可改变数据库表。
△ 经由数据库连接的访问以及并行执行的场合,
不可对包变量的值进行读写操作(针对存储包内部的函数)。
示例1 以参数[v_dept_id]为键值,从表[dept]中取得列值[dept_name]并返回。
示例2 把示例1的存储函数作为SQL函数而调用。
示例3 从匿名块中调用示例1中的存储函数。
- CREATE OR REPLACE FUNCTION 函数名
- [ (参数变量1 [ IN | OUT | INT OUT ] 数据类型,
- :
- 参数变量n [ IN | OUT | INT OUT ] 数据类型) ]
- RETURN 数据类型 { AS | IS }
- /* 声明部分 */
- BEGIN
- /* 可执行部分 */
- EXCEPTION
- /* 异常处理部分 */
- END [ 函数名 ];
与存储过程类似,不同之处是有返回值。
给返回值(RETURN)指定的数据类型,不可指定长度。
例)
× return char(2)
○ return char
函数可以作为SQL函数从SQL中调用,但是有以下限制:
△ 不可改变数据库表。
△ 经由数据库连接的访问以及并行执行的场合,
不可对包变量的值进行读写操作(针对存储包内部的函数)。
示例1 以参数[v_dept_id]为键值,从表[dept]中取得列值[dept_name]并返回。
- create or replace function get_dept(
- v_dept_id in char)
- return varchar2 as
- v_dept_name varchar2(10);
- begin
- select dept_name into v_dept_name from dept
- where dept_id = v_dept_id;
- return v_dept_name;
- end get_dept;
示例2 把示例1的存储函数作为SQL函数而调用。
- SQL> select get_dept('D01') from dual;
- GET_DEPT('D01')
- -----------------------------------------
- 总务
- SQL>
示例3 从匿名块中调用示例1中的存储函数。
- declare
- dept_name varchar2(10);
- begin
- dept_name := get_dept(v_dept_id => 'D01');
- dbms_output.put_line(dept_name);
- end;