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_OUTPUTPUT_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的问题可以直接找我。其实我不是大拿,要是想神马问题都马上得到答案请忽略这段话。我汗!!pro5_out本来就是一个存储过程,所以你直接调用就可以了,另外你下面调用的时候写的是一个pl/sql块,所以需要参照pl/sql块的写法,不然的话就会出现value3没有声明的情况,可以参照上面的declare那一段就可以了。IN主要用于传入参数,可以是变量,常量,表达式,在子程序内部不能改变其值
复制代码
代码如下:
DECLARE
n
NUMBER
:=
10;
PROCEDURE
do_something
(
n1
IN
NUMBER)
IS
BEGIN
dbms_outputput_line(n1);
--
prints
10
--n1:=20;
--illegal
assignment
END;
BEGIN
do_something(n);
do_something(20);
END;
OUT模式用于返回值,必须传入变量调用,变量的初始的值不会传给形式参数,如<<1>>所示
形参的值在子程序返回时(不是在形式参数改变时)才copy给实参,
,如<<2>>所示,如果在
返回之前发生异常,实际参数的值不会被改变
复制代码
代码如下:
DECLARE
n
NUMBER
:=
10;
PROCEDURE
do_something
(
n1
OUT
NUMBER)
IS
BEGIN
dbms_outputput_line('before
assign:
'
||
n1);
--
prints
none
<<1>>
n1:=20;
dbms_outputput_line('before
return:
'
||
n);
--
prints
10
<<2>>
END;
BEGIN
do_something(n);
dbms_outputput_line('after
return:
'
||
n);
--
prints
20
END;
NOCOPY模式用于限定OUT模式在调用时是不是以传引用的方式进行(它只是一个编译器暗示,不一定总是起作用),默认情况下,OUT模式的参数是以传值的方式进行调用的
IN主要用于传入参数的,虽然n2
:=
20被调用,但是要到返回的时候才生效如<<1>>所示
NOCOPY是传引用,会在赋值的时候立即生效
,如<<2>>所示,如果在
返回之前发生异常,实际参数的值也会被改变
由于OUT参数在
子程序返回的时候会将值copy到实际参数,所以调用完后n的值为20,如<<3>>所示
复制代码
代码如下:
DECLARE
n
NUMBER
:=
10;
PROCEDURE
do_something
(
n1
IN
NUMBER,
n2
IN
OUT
NUMBER,
n3
IN
OUT
NOCOPY
NUMBER)
IS
BEGIN
n2
:=
20;
dbms_outputput_line(n1);
--
prints
10<<1>>
n3
:=
30;
dbms_outputput_line(n1);
--
prints
30
<<2>>
END;
BEGIN
do_something(n,
n,
n);
dbms_outputput_line(n);
--
prints
20
<<3>>
END;p_user_name的IN,表示这个参数是传入参数。
p_out_val的OUT,表示这个是传出参数。也就是JAVA中return的值。
p_inoutval的IN OUT,表示这个既是传入、又是传出参数。也就是说,你可以利用它传入该存储过程,然后接到处理后的这个参数。一个参数搞定了2项功能(传入,传出)CREATE OR REPLACE PROCEDURE sap_po_test(id IN NUMBER,
p_message OUT VARCHAR2) AS
mycount number(4) := 0;
BEGIN
SELECT COUNT()
INTO mycount
FROM 表
WHERE id = p_id;
IF mycount > 0 THEN
p_message := 'S';
ELSE
p_message := 'E';
END IF;
RETURN;
END;
( ⊙ o ⊙ )啊!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)