-----------------参数类型
--sp或者fun的参数有自己的类型(不是说数据类型)
一共3中参数类型:IN / OUT / IN OUT
----------------------------IN类型:参数名 [IN] 数据类型
1、不写参数类型的时候,默认就是IN类型的参数
---------传值的方式
1、IN类型的参数,可以传一个具体的值,也可以通过变量传值
CREATE OR REPLACE PROCEDURE SP_IN(P_IN IN VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(P_IN);
END;
------------测试一下
--1、直接传一个值
BEGIN
SP_IN('HELLO WORLD');
END;
--2、通过变量来传值
DECLARE
V_HI VARCHAR2(20) := 'HELLO WORLD!';
BEGIN
SP_IN(V_HI);
END;
-----------赋值:在sp/fun程序体内部,对这个参数进行赋值操作(:= / INTO)
1、IN类型参数,不能再程序体对其赋值
CREATE OR REPLACE PROCEDURE SP_IN(P_IN IN VARCHAR2)
IS
BEGIN
P_IN := 'HELLO WORLD!!';
DBMS_OUTPUT.PUT_LINE(P_IN);
SELECT ENAME
INTO P_IN
FROM EMP
WHERE EMPNO = 7788;
DBMS_OUTPUT.PUT_LINE(P_IN);
END;
---------------------------OUT类型:参数名 OUT 数据类型
---------传值的方式
1、OUT类型的参数,不可以直接传一个具体的值,而是要通过变量来传入
2、OUT类型的参数,接收一个变量后,并不会使用这个变量的值
CREATE OR REPLACE PROCEDURE SP_OUT(P_OUT OUT VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(P_OUT);
END;
------------测试一下
--1、直接传一个值 -------- 报错
BEGIN
SP_OUT('HELLO WORLD');
END;
--2、通过变量来传值
DECLARE
V_HI VARCHAR2(20) := 'HELLO WORLD!';
BEGIN
SP_OUT(V_HI);
END;
-----------赋值:在sp/fun程序体内部,对这个参数进行赋值操作(:= / INTO)
1、可以被赋值,赋值之后可以使用该参数的值
CREATE OR REPLACE PROCEDURE SP_OUT(P_OUT OUT VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('打印传给OUT类型的参数的值');
DBMS_OUTPUT.PUT_LINE(P_OUT);
DBMS_OUTPUT.PUT_LINE('对OUT类型的参数赋值之后,打印该参数');
P_OUT := 'HELLO WORLD!!';
DBMS_OUTPUT.PUT_LINE(P_OUT);
DBMS_OUTPUT.PUT_LINE('对OUT类型的参数再次赋值之后,再次打印该参数');
SELECT ENAME
INTO P_OUT
FROM EMP
WHERE EMPNO = 7788;
DBMS_OUTPUT.PUT_LINE(P_OUT);
END;
------------测试一下
DECLARE
V_HI VARCHAR2(20) := 'abc';
BEGIN
SP_OUT(V_HI);
END;
----------------------------------IN OUT类型:参数名 IN OUT 数据类型
---------传值的方式
1、IN OUT类型的参数,既有IN类型的属性(可以接收传值,也可以使用该值),也有OUT的限制(只能通过变量来传值)
CREATE OR REPLACE PROCEDURE SP_INOUT(P_INOUT IN OUT VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(P_INOUT);
END;
------------测试一下
--1、直接传一个值 -----报错
BEGIN
SP_INOUT('HELLO WORLD');
END;
--2、通过变量来传值
DECLARE
V_HI VARCHAR2(20) := 'HELLO WORLD!';
BEGIN
SP_INOUT(V_HI);
END;
-----------赋值:在sp/fun程序体内部,对这个参数进行赋值操作(:= / INTO)
1、可以接收用户传入的值,也会使用该值
2、同时可以被赋值
CREATE OR REPLACE PROCEDURE SP_INOUT(P_INOUT IN OUT VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('打印传给IN OUT类型的参数的值');
DBMS_OUTPUT.PUT_LINE(P_INOUT);
DBMS_OUTPUT.PUT_LINE('对IN OUT类型的参数赋值之后,打印该参数');
P_INOUT := 'HELLO WORLD!!';
DBMS_OUTPUT.PUT_LINE(P_INOUT);
DBMS_OUTPUT.PUT_LINE('对IN OUT类型的参数再次赋值之后,再次打印该参数');
SELECT ENAME
INTO P_INOUT
FROM EMP
WHERE EMPNO = 7788;
DBMS_OUTPUT.PUT_LINE(P_INOUT);
END;
------------测试一下
DECLARE
V_HI VARCHAR2(20) := 'ABC!!';
BEGIN
SP_INOUT(V_HI);
END;
-------------总结一下:
1、用的最多的还是 IN 类型的
因为其他两种类型的参数完全可以用 变量 来替代
2、
参数类型 是否可以传值 是否可以被赋值 传值的方式
IN 是 否 可以传一个具体的值,也可以通过变量传入值
OUT 是(不会去使用这个值) 是 只能通过变量传入值,并且不会使用和这个值
IN OUT 是 是 只能通过变量传入值,可以使用这个值
----小练习一把:分别测试一下用三种参数类型来实现,创建一个sp,实现分别打印2个数字交换前后的值
------IN类型
CREATE OR REPLACE PROCEDURE SP_IN(X IN NUMBER,Y NUMBER)
IS
M NUMBER := X;
N NUMBER := Y;
Z NUMBER;
BEGIN
DBMS_OUTPUT.PUT_LINE('交换前:'||M ||' '||N);
Z := M;
M := N;
N := Z;
DBMS_OUTPUT.PUT_LINE('交换后:'||M ||' '||N);
END;
/
------OUT类型
CREATE OR REPLACE PROCEDURE SP_OUT(X OUT NUMBER,Y OUT NUMBER)
IS
Z NUMBER;
BEGIN
DBMS_OUTPUT.PUT_LINE('交换前:'||X ||' '||Y);
Z := X;
X := Y;
Y := Z;
DBMS_OUTPUT.PUT_LINE('交换后:'||X||' '||Y);
END;
/
------IN OUT类型
CREATE OR REPLACE PROCEDURE SP_INOUT(X IN OUT NUMBER,Y IN OUT NUMBER)
IS
Z NUMBER;
BEGIN
DBMS_OUTPUT.PUT_LINE('交换前:'||X||' '||Y);
Z := X;
X := Y;
Y := Z;
DBMS_OUTPUT.PUT_LINE('交换后:'||X ||' '||Y);
END;
/
--测试一下
DECLARE
X NUMBER := 1;
Y NUMBER := 9;
BEGIN
SP_IN(X, Y);
SP_INOUT(X, Y);
SP_OUT(X, Y);
END;
----如果同时跑多个sp/fun,那么每一个sp/fun可以用 “ / / ” 包起来