oracle 函数,解释变量的使用和调用,本人菜鸟刚学oracle,看不懂函数间的使用,越详细越好
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 函数,解释变量的使用和调用,本人菜鸟刚学oracle,看不懂函数间的使用,越详细越好相关的知识,希望对你有一定的参考价值。
v_num,v_sum 尤其是这两个变量怎么来的啊
函数
CREATE OR REPLACE
FUNCTION get_salary(
Dept_no NUMBER,
Emp_count OUT NUMBER)
RETURN NUMBER
IS
V_sum NUMBER;
BEGIN
SELECT SUM(SALARY), count(*) INTO V_sum, emp_count
FROM EMPLOYEES WHERE DEPARTMENT_ID=dept_no;
RETURN v_sum;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END get_salary;
调用
DECLARE
V_num NUMBER;
V_sum NUMBER;
BEGIN
V_sum :=get_salary(10, v_num);
DBMS_OUTPUT.PUT_LINE('部门号为:10的工资总和:'||v_sum||',人数为:'||v_num);
END;
v_sum,v_num 是变量名,被声明为number类型。
函数get_salary()声明了两个变量,一个返回值。
oracle的参数有两种属性,in,out。一般默认为in,就是传值的,out类型可以理解为c里面的形参,传地址一类的,声明为OUT属性的参数,可以把函数对参数的修改带出来。
比如下面:
CREATE OR REPLACE
FUNCTION test(
v_var1 NUMBER,
v_var2 OUT NUMBER)
RETURN NUMBER IS
v_var1:=v_var1+1;
v_var2:=v_var2+1;
return v_var1;
调用
DECLARE
v_var1 NUMBER;
v_var2 NUMBER;
v_var3 NUMBER;
BEGIN
v_var1:=1;
v_var2:=1;
v_var3 :=test(v_var1, v_var2);
DBMS_OUTPUT.PUT_LINE('v_var1='||v_var1||'\nv_var2='||v_var2||'\nv_var3='||v_var3);
END;
那么输出应该是
v_var1=1
v_var2=2
v_var3=2
理解了out的含义,再看你的代码就容易了
因为函数申明emp_count为out,所以他将带出在函数中的变化。
函数里有select count(*) into emp_count from .........样子的语句。所以函数执行完成后这个变量的值其实是该部门的人数。
写了这么长了啊。。。。
不知道讲清楚了没。
exption我就不解释了吧。有其他问题请追问。
个人对oracle也比较感兴趣,但现在的工作和这个不相关了,希望能一起进步。有类似oracle的问题可以直接找我。其实我不是大拿,要是想神马问题都马上得到答案请忽略这段话。我汗!! 参考技术A CREATE OR REPLACE
FUNCTION get_salary(//函数
Dept_no NUMBER,//输入参数
Emp_count OUT NUMBER)//输出参数
RETURN NUMBER //返回参数
IS
V_sum NUMBER;//这是声明函数的局部变量
BEGIN
SELECT SUM(SALARY), count(*) INTO V_sum, emp_count//这里用到形参,emp_count是output类型的参数,会返回
FROM EMPLOYEES WHERE DEPARTMENT_ID=dept_no;
RETURN v_sum;//返回v_sum的值
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END get_salary;
调用
DECLARE//这里是调用时声明变量
V_num NUMBER;
V_sum NUMBER;
BEGIN
V_sum :=get_salary(10, v_num);//v_num,v_sum这两个变量调用函数得到值,v_num是emp_count得到的值,v_sum是函数里return的v_sum的值
DBMS_OUTPUT.PUT_LINE('部门号为:10的工资总和:'||v_sum||',人数为:'||v_num);
END;追问
问题好多啊
RETURN NUMBER 返回的是
Dept_no NUMBER,还是
Emp_count OUT NUMBER
还有V_sum NUMBER 是否可以放入定义函数的位置,也就是变量是不是能当参数用
RETURN NUMBER 指的是返回一个NUMBER类型的变量,也就是后面 RETURN v_sum;中的v_sum,假设函数sum=f(no,count),这里的v_sum相当于sum,就是函数执行后得到的值,Dept_no 没有out修饰,是一般类型的参数,只是传值,在后来调用函数 V_sum :=get_salary(10, v_num);时,传入了10,而 Emp_count 有out修饰,所以在函数执行后会把值保留下来,可以在外面调用,类似引用传递。V_sum 是定义的NUMBER 类型变量,用于返回函数得到的结果,他不是参数。不知道这样解释你能不能明白?
本回答被提问者采纳 参考技术B call GetPY(@str varchar(500)) 就可以了sql2005中是exec GetPY(@str varchar(500)) 。
ORACLE存储过程里可以声明过程和函数吗
ORACLE存储过程和函数:
1. 返回值的区别:函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有
2.调用的区别:函数可以在查询语句中直接调用,而存储过程必须单独调用.
3.用途:函数一般情况下是用来计算并返回一个计算结果而存储过程一般是用来完成特定的数据操作(比如修改、插入数据库表或执行某些DDL语句等等)
存储过程可以调用函数:
1.因为函数有返回值,可以用函数给变量赋值。例如,变量名 变量类型 := 包名.函数名(参数);
2.也可以在sql语句里直接调用函数。例如,select 包名.函数名(字段名) into 变量1 from 表名;
参考技术A这个是可以实现的,不过一切只能通过动态sql来实现:
你只能用动态sql来实现创建
如果你想调用,那么因为你的过程或者函数在你当前存储过程创建时并不存在,故也只能通过动态sql来调用函数或者过程。
2、调用函数时注意要有接受函数返回值的参数,最好在存储过程开头预先定义
希望能帮到你 参考技术D procedure可以调用procedure和function ,package里可以定义procedure和function
以上是关于oracle 函数,解释变量的使用和调用,本人菜鸟刚学oracle,看不懂函数间的使用,越详细越好的主要内容,如果未能解决你的问题,请参考以下文章