【Oracle 11g】(七) 存储过程

Posted on 2021-08-31 14:27  MissRong  阅读(247)  评论(0)    收藏  举报

【Oracle 11g】(七) 存储过程

注:存储过程的变量定义前面没有 DECLARE

1、定义存储过程,给部门表插入两条数据80 财务部,81 市场部

--(1)创建存储过程
CREATE PROCEDURE myproc
AS
BEGIN
  DELETE FROM dept WHERE deptno IN (80, 81);
  INSERT INTO dept(deptno, dname) VALUES(80, '财务部');
  INSERT INTO dept(deptno, dname) VALUES(81, '市场部');
  COMMIT;
END;

 

2、执行存储过程

1)通过命令的方式--创建Command Windows

SQL> execute myproc;

PL/SQL procedure successfully completed

2)  PL/SQL的方式

--第二种方式:PL/SQL
BEGIN
  myproc;
END;

3、编译

如果语法有错误,编译不会成功,在存储过程上会有个小红点,可以右键选择“编辑“进行调试。

4、参数

1)IN(默认,可加也可不加)

创建存储过程:

CREATE OR REPLACE PROCEDURE find_emp(e_no IN NUMBER)
AS
/********************************************
     程序功能: 输入员工编号,打印员工姓名
     业务逻辑: 查询语句
     开发日期: 2021-08-31
     开发人员: xinRong
     源    表: emp
     目 标 表:
********************************************/
        v_ename VARCHAR2(40);
BEGIN
  SELECT ename INTO v_ename FROM emp WHERE empno = e_no;
  dbms_output.put_line(v_ename);

  EXCEPTION
    WHEN no_data_found THEN
      dbms_output.put_line('没有找到员工信息');
END;

执行存储过程:

--调用存储过程 PL/SQL
BEGIN
  find_emp(77);
END;

2)OUT

创建存储过程:

CREATE OR REPLACE PROCEDURE find_emp2(e_no NUMBER, p_ename OUT VARCHAR2)
--参数只有类型定义没有长度设置
AS
/********************************************
     程序功能: 根据输入的员工编号,返回员工姓名
     业务逻辑: 测试OUY参数的使用
     开发日期: 2021-08-31
     开发人员: xinRong
     源    表: emp
     目 标 表:
********************************************/
        v_ename emp.ename%TYPE;
BEGIN
  SELECT ename INTO v_ename FROM emp WHERE empno = e_no;
  p_ename := v_ename;

  EXCEPTION
    WHEN no_data_found THEN
      dbms_output.put_line('没有找到该员工信息');
END;

执行存储过程:

--调用存储过程 PL/SQL
BEGIN
  e_name VARCHAR2(40);
  find_emp2(7788, e_name);
  dbms_output.put_line(e_name);
END; 

3)IN OUT

创建存储过程:

CREATE OR REPLACE PROCEDURE mp(n1 IN OUT NUMBER, n2 IN OUT NUMBER)
--参数只有类型定义没有长度设置
AS
/********************************************
     程序功能: 将输入的两个参数互换值
     业务逻辑: 测试IN OUT参数的使用
     开发日期: 2021-08-31
     开发人员: xinRong
     源    表: emp
     目 标 表:
********************************************/
        temp NUMBER;
BEGIN
  temp:=n1;
  n1:=n2;
  n2:=temp;
END;

执行存储过程:

--调用存储过程
DECLARE
  a NUMBER := 10;
  b NUMBER := 20;
BEGIN
  mp(a, b); --既做输入也做输出
  dbms_output.put_line(a);
  dbms_output.put_line(b);
END;  

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3