3 回答
TA贡献1856条经验 获得超5个赞
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;
TA贡献1775条经验 获得超11个赞
declare 是定义的关键字,说明下面的部分是定义部分,一直到begin结束,begin到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 .........样子的语句。所以函数执行完成后这个变量的值其实是该部门的人数。
- 3 回答
- 0 关注
- 490 浏览
添加回答
举报