函数调用限制
1、sql语句中只能调用存储函数(服务器端),而不能调用客户端的函数
2、sql只能调用带有输入参数,不能带有输出,输入输出函数
3、sql不能使用PL/sql的特有数据类型(boolean,table,record等)
4、sql语句中调用的函数不能包含INSERT,UPDATE和DELETE语句
1.function函数的语法如下:
- createorreplacefunctionfunction_name(
- argu1[mode1]datatype1,--定义参数变量
- argu2[mode2]datatype2--定义参数变量
- )returndatatype--定义返回的数据类型
- is
- begin
- end;
执行:
varv1varchar2(100)
exec:v1:=function_name
2.不带任何参数的定义
createorreplacefunctionget_user
returnvarchar2
Resultvarchar2(50);--定义变量
selectusernameintoResultfromuser_users;
return(Result);--返回值
endget_user;
createorreplacefunctionget_sal(
4.带out参数的
createorreplacefunctionget_info(
e_namevarchar2,
joboutvarchar2
)returnnumber
Is
Resultnumber;
selectsal,jobintoResult,jobfromempwhereename=e_name;
return(Result);
end;
执行:
5.带in out参数的
createorreplacefunctionf_sys_getseqid(
v_seqnameINVARCHAR2,
v_provincecodeINVARCHAR2--省编码
)returnVarchar2
IS
iv_dateVARCHAR2(8);
iv_seqnameVARCHAR2(50);
iv_sqlstrVARCHAR2(200);
iv_seqVARCHAR2(8);
iv_seqidVARCHAR2(16);
BEGIN
iv_seqname:=LOWER(TRIM(v_seqname));
iv_sqlstr:='SELECT'||iv_seqname||'.nextvalFROMDUAL';
EXECUTEIMMEDIATEiv_sqlstrINTOiv_seq;--执行动态的sql语句,执行相似的一组语句
IFv_seqname='SEQ_FUNCROLE_ID'THEN
iv_seqid:='ESS'||LPAD(iv_seq,5,'0');
ELSE
SELECTsubstrb(v_provincecode,1,2)||TO_CHAR(SYSDATE,'yymmdd')INTOiv_dateFROMDUAL;
iv_seqid:=iv_date||LPAD(iv_seq,8,'0');
ENDIF;
RETURNiv_seqid;
EXCEPTION
WHENOTHERSTHEN
RETURNNULL;
END;
调用方式如下:
SELECTTO_NUMBER(F_SYS_GETSEQID('SEQ_TERMTRADE_ID',V_PROVINCE_CODE))INTOV_BATCH_IDFROMDUAL;
EXECUTE IMMEDIATE的说明:执行动态的sql语句。
转载自:http://www.blogjava.NET/stevenjohn/archive/2012/08/12/385324.html