PL/SQL 存储过程

编程入门 行业动态 更新时间:2024-10-20 13:40:50

PL/SQL <a href=https://www.elefans.com/category/jswz/34/1764414.html style=存储过程"/>

PL/SQL 存储过程

一.存储过程

1.存储过程
存储过程是一个要被预编译的代码块,一次编译,多次调用
由于调用的代码较少,减少了网络流量,降低了网络负担

2.存储过程的类型
存储过程分为有参和无参两种
有参又分为 in、out、in out 三种 分别代表传递给储存过程,从储存过程传出,以及对存储过程传入和传出
 

二.存储过程1.无参存储过程

--创建
CREATE OR REPLACE PROCEDURE SP_NO_VAR
ISBEGINDBMS_OUTPUT.PUT_LINE('LOW CHINA');
END;
--调用
CALL SP_NO_VAR();--没有参数
--存储过程相当于只是调用了一些PL/SQL语句 PL/SQL包括很多 例如游标
--存储过程也可以调用存储过程


2.有参存储过程

--创建
--根据参数的值打印员工的姓名
CREATE OR REPLACE PROCEDURE SP_VAR(V_EMPNO NUMBER)
IS
V_EMP EMP%ROWTYPE;--直接定义 不需要写DECLARE
BEGINSELECT * INTO V_EMP FROM EMP WHERE EMPNO=V_EMPNO;DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);
END;
CALL SP_VAR(7369);--存储过程调用PL/SQL打印语句

2.1有参、存储过程调用存储过程

--写一个存储过程 能够通过员工的薪资输出员工薪资等级
CREATE OR REPLACE PROCEDURE SP_BD(V_SAL NUMBER)
IS
V_GRADE SALGRADE.GRADE%TYPE;
BEGIN SELECT GRADE INTO V_GRADE FROM EMP E JOIN SALGRADE S ON (E.SAL BETWEEN LOSAL AND HISAL) WHERE E.SAL=V_SAL; DBMS_OUTPUT.PUT_LINE(V_GRADE);
END;CREATE OR REPLACE PROCEDURE SP_DU(V_MGR NUMBER)
IS 
V_EMP EMP%ROWTYPE;
BEGINSP_BD(800);SELECT * INTO V_EMP FROM EMP WHERE MGR=V_MGR;DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);
END;
CALL SP_DU(7902);--通过两个存储过程,让一个调用另一个--在这些存储过程的实现中,都有一个特点 参数是隐式定义的 in类型,即向存储过程输入类型
接下来我们看看out类型和in out类型


3.OUT 类型
--不是有效函数或过程名
3.1

CREATE OR REPLACE PROCEDURE SP_OUT(V_EMPNO IN NUMBER,V_SAL OUT NUMBER)--通过同时输入来获得输出
IS
BEGINSELECT SAL INTO V_SAL FROM EMP WHERE EMPNO=V_EMPNO;DBMS_OUTPUT.PUT_LINE(V_SAL);
END;CALL SP_OUT(7369,SAL);--ERRORDECLARE
SAL NUMBER(4);
BEGIN
SP_OUT(7369,SAL);--不能写CALL
END;

3.2

CREATE OR REPLACE PROCEDURE SP_AVG(V_SAL OUT NUMBER)--只输出
IS
BEGINSELECT AVG(SAL) INTO V_SAL FROM EMP ;DBMS_OUTPUT.PUT_LINE(V_SAL);
END;DECLARE
SAL NUMBER(4);
BEGIN
SP_AVG(SAL);--不能写CALL
END;


3.3 IN OUT类型--同时满足向存储过程输入和存储过程向外输出

CREATE OR REPLACE PROCEDURE SP_IN_OUT(V_MIXTURE IN OUT DEPT%ROWTYPE) ISBEGINSELECT * INTO V_MIXTURE FROM DEPT WHERE DNAME=V_MIXTURE.DNAME; DBMS_OUTPUT.PUT_LINE(V_MIXTURE.DEPTNO);END;DECLARE
V_IN DEPT%ROWTYPE;
BEGINV_IN.DNAME:=&DNAME;SP_IN_OUT(V_IN);
END;

4.存储过程调用游标

CREATE OR REPLACE PROCEDURE SP_CUR(V_EMPNO NUMBER,CUR OUT SYS_REFCURSOR) IS--游标类型的参数
--之前就说 SYS_REFCURSOR是游标的一种数据类型
--什么东西会有数据类型?:语言 语言会涉及到基础和复杂数据类型
--但是CUR也有数据类型 为SYS_REFCURSOR

BEGIN
  --游标永远无法避免涉及到 打开 遍历 关闭
  --ref由于无法使用for循环,必须手动打开和关闭游标
 OPEN CUR FOR SELECT * FROM EMP WHERE EMPNO=V_EMPNO;
  
END;
--错误:PLS-00361: 无法用 OPEN 命令打开 IN 游标 'CUR'

CREATE OR REPLACE PROCEDURE SP_CUR(V_EMPNO NUMBER,CUR OUT SYS_REFCURSOR) IS
V_EMP EMP%ROWTYPE;
BEGINOPEN CUR FOR SELECT * FROM EMP WHERE EMPNO=V_EMPNO;--存储过程可以不全部写完游标的过程:打开 遍历 关闭LOOPEXIT WHEN CUR%NOTFOUND;FETCH CUR INTO V_EMP;END LOOP;DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);
CLOSE CUR;
END;DECLARE
C SYS_REFCURSOR;--游标类型要一一对应
BEGIN
SP_CUR(7369,C);
END;CREATE OR REPLACE PROCEDURE SP_C(V_EMPNO NUMBER,CUR OUT SYS_REFCURSOR) IS
BEGIN
OPEN CUR FOR SELECT * FROM EMP WHERE EMPNO=V_EMPNO;
END;DECLARE
C SYS_REFCURSOR;
V_EMP EMP%ROWTYPE;
BEGINSP_C(7369,C);
LOOPEXIT WHEN C%NOTFOUND;FETCH C INTO V_EMP;DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);END LOOP;
CLOSE C;END;

更多推荐

PL/SQL 存储过程

本文发布于:2024-02-25 16:36:19,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1699625.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:存储过程   PL   SQL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!