函数调用限制
1、sql语句中只能调用存储函数(服务器端),而不能调用客户端的函数
2、sql只能调用带有输入参数,不能带有输出,输入输出函数
3、sql不能使用pl/sql的特有数据类型(boolean,table,record等)
4、sql语句中调用的函数不能包含insert,update和delete语句
1.function函数的语法如下:
create or replace function function_name (
argu1 [mode1] datatype1, --定义参数变量
argu2 [mode2] datatype2 --定义参数变量
) return datatype --定义返回的数据类型
is
begin
end;
执行 var v1 varchar2(100)
exec :v1:=function_name
2.不带任何参数的定义
create or replace function get_user
return varchar2
is
result varchar2(50); --定义变量
begin
select username into result from user_users;
return(result); --返回值
end get_user;
3.带有in参数的
create or replace function get_sal(
empname in varchar2
) return number
is
result number;
begin
select sal into result from emp where ename=empname;
return(result);
end;
执行: sql> var sal number
sql> exec :sal:=get_sal('scott');
4.带out参数的
create or replace function get_info(
e_name varchar2,
job out varchar2
) return number
is
result number;
begin
select sal,job into result,job from emp where ename=e_name;
return(result);
end;
执行: sql> var job varchar2(20)
sql> var dname varchar2(20)
sql> exec :dname:=get_info('scott',:job)
5.带in out参数的
6.函数调用举例
create or replace function f_sys_getseqid(
v_seqname in varchar2,
v_provincecode in varchar2 --省编码
) return varchar2
is
iv_date varchar2(8);
iv_seqname varchar2(50);
iv_sqlstr varchar2(200);
iv_seq varchar2(8);
iv_seqid varchar2(16);
begin
iv_seqname := lower(trim(v_seqname));
iv_sqlstr := 'select '||iv_seqname||'.nextval from dual';
execute immediate iv_sqlstr into iv_seq;--执行动态的sql语句,执行相似的一组语句
if v_seqname = 'seq_funcrole_id' then
iv_seqid:= 'ess' || lpad(iv_seq,5,'0');
else
select substrb(v_provincecode,1,2)||to_char(sysdate,'yymmdd') into iv_date from dual;
iv_seqid:= iv_date || lpad(iv_seq,8,'0');
end if;
return iv_seqid;
exception
when others then
return null;
end;
调用方式如下:
select to_number(f_sys_getseqid('seq_termtrade_id', v_province_code)) into v_batch_id from dual;
execute immediate的说明:执行动态的sql语句。