三种参数类型

-----------------参数类型
--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可以用 “ /  / ”  包起来 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值