首页 > 数据库 > Oracle > 数据库开发---常用对象-函数
数据库开发---常用对象-函数,存储过程,游标,触发器,包
----函数
1>函数和存数过程的区别:
存储过程 函数
---------------------------------- -------------------------------
不能被作为表达式调用 只能作为表达式被调用
声明头部关键字为procedure 声明头部关键字为function
声明头部不包含return关键字来描述返回类型 头部必须包含return关键字,且PL/SQL块中至少包含一个有效的return语句
可以通过out,in out返回零个或多个值 通过return语句返回一个与头部声明中类型一致的值,也可使用in,in out返回值
SQL语句中不可调用存储过程 SQL语句可以调用函数
多用于数据库中完成特定的操作,如删除,更新,插入等DML操作 多用于特定的数据如选择等
---创建语句
create or replace function test_func_1 return varchar2 is
begin
dbms_output.put_line('hello world!');
return 1;
end;
---函数的执行
create or replace function get_user return varchar2 is
v_user varchar2(10);
begin
select username into v_user from user_users;
return v_user;
end;
/
1、使用变量接收。
SQL> var current_user varchar2(10)
SQL> exec :current_user:=get_user
2、使用SQL
select get_user from dual;
3、使用exec调用
execute
exec
SQL> set serveroutput on
4、call
call dbms_output.put_line('当前登录的用户是: '||get_user);
5、块中调用(匿名块中或函数存储过程中都可以)
begin
dbms_output.put_line('当前登录的用户是: ' || get_user);
end;
/ declare v_user varchar2(10);
begin
v_user := get_user;
end;
/
select get_user from dual;
2>常用的查询函数相关定义的语句:
select owner,object_name,object_type from dba_objects where object_name='GET_INFO';
select text from user_source where name='TEST_FUNC_1';--查出函数定义信息
1.得到一个表或索引的ddl语句
SELECT DBMS_METADATA.GET_DDL('TABLE','DEPT','SCOTT') FROM DUAL;
select dbms_metadata.get_ddl('INDEX','PK_DEPT','SCOTT') from dual;
2.得到一个用户下的所有表,索引,存储过程的ddl
SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, u.object_name)
FROM USER_OBJECTS u
where U.OBJECT_TYPE IN ('TABLE','INDEX','PROCEDURE');
3.得到所有表空间的ddl语句
SELECT DBMS_METADATA.GET_DDL('TABLESPACE', TS.tablespace_name)
FROM DBA_TABLESPACES TS;
4.得到所有创建用户的ddl
SELECT DBMS_METADATA.GET_DDL('USER',U.username)
FROM DBA_USERS U;
3>函数中传入传出参数的用法
create or replace function get_sal(name IN varchar2) -----IN 即是传入的变量
return number as
v_sal emp.sal%type;
begin
select sal into v_sal from emp where ename = NAME;
return v_sal;
end;
SELECT GET_SAL('SCOTT') FROM DUAL;
create or replace function get_sal(name out varchar2) -----IN 即是传入的变量,不能作为赋值目标
return number as
v_sal emp.sal%type;
begin
select sal into v_sal from emp where ename = name;
name := 'SCOTT';
return v_sal;
end;
create or replace function get_info(name in varchar2,
ejob out varchar2) return varchar2 as
v_dname dept.dname%type;
begin
select e.job, d.dname
into ejob, v_dname
from emp e, dept d
where e.deptno = d.deptno
and e.ename = name;
return v_dname;
end;
/
declare
----v_job用来接收需要传出的值,而in参数则不能接受传入参数! v_dname接收的是传入的的值
v_job varchar2(20) := 'abc';
v_dname varchar2(20);
begin
dbms_output.put_line(v_job);
v_dname := get_info('JAMES', v_job);
dbms_output.put_line('部门:' || v_dname || ' 职位:' || v_job);
end;
/
----传值的方式
v_dname:=get_info(name =>'JAMES',ejob => v_job);
v_dname:=get_info('JAMES',ejob => v_job);
4>函数的语法结构
create or replace function func_name return type is/as
begin
;
end;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30018455/viewspace-1399244/ ,如需转载,请注明出处,否则将追究法律责任。