oraclefunction用法
- 格式:pdf
- 大小:45.66 KB
- 文档页数:2
oraclefunction⽤法
函数调⽤限制
1、SQL语句中只能调⽤存储函数(服务器端),⽽不能调⽤客户端的函数
2、SQL只能调⽤带有输⼊参数,不能带有输出,输⼊输出函数
3、SQL不能使⽤PL/SQL的特有数据类型(boolean,table,record等)
4、SQL语句中调⽤的函数不能包含INSERT,UPDATE和DELETE语句
1.function函数的语法如下:
1 create or replace function function_name (
2 argu1 [mode1] datatype1, --定义参数变量
3 argu2 [mode2] datatype2 --定义参数变量
4 ) return datatype --定义返回的数据类型
5 is
6
7 begin
8
9 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语句。
函数中使⽤游标
create or replace function getcustprodinstaddr(in_CustId in number,in_area_code in number)
return varchar2
is
Result varchar2(4000);
v_acc_nbr varchar2(400);
tempCount number:=1;
type ref_cursor is ref cursor;
v_cursor ref_cursor;
begin
Result:='';
open v_cursor for
'select install_addr from tb_prd_prd_inst_'||to_char(in_area_code)||
' where PRD_INST_STAS_ID not in(''1003'',''1101'',''1401'',''1102'')
and own_cust_id='||to_char(in_CustId)||' order by install_date desc';
loop
fetch v_cursor into v_acc_nbr;
exit when v_cursor%notfound;
if(tempCount>8) then
goto label_end;
end if;
Result:=v_acc_nbr||','||Result;
tempCount := tempCount +1;
end loop;
<
close v_cursor;
return(Result);
exception
when others then
if(v_cursor%isopen) then
close v_cursor;
end if;
return '';
end getcustprodinstaddr;