Oracle中调用带有返回参数的存储过程

--创建测试表

create table EMP (EMPNO number , ENAME varchar2(32) );

insert into EMP (EMPNO ,ENAME) values (10,'张三');

insert into EMP (EMPNO ,ENAME) values (20,'小马');

insert into EMP (EMPNO ,ENAME) values (30,'小米');

insert into EMP (EMPNO ,ENAME) values (40,'小明');


--创建存储过程

 CREATE OR REPLACE PROCEDURE PROC_TEST(V_STR      IN VARCHAR,
                                      UPD_ROWS   OUT NUMBER,
                                      INSET_ROWS OUT NUMBER) IS

  UPDATE_ROWS NUMBER(10) := 0;
  INSERT_ROWS NUMBER(10) := 0;
  CURSOR CURSOR_EMP IS
    SELECT EMPNO, ENAME FROM EMP;
  CUR_EMP_OBJ CURSOR_EMP%ROWTYPE;
BEGIN
  ---循环的第一种写法
  FOR CUR_EMP_OBJ IN CURSOR_EMP LOOP
 
    UPDATE EMP E
       SET E.ENAME = E.ENAME || '1'
     WHERE E.EMPNO = CUR_EMP_OBJ.EMPNO;
     
    UPDATE_ROWS := UPDATE_ROWS + 1;
  END LOOP;

  UPD_ROWS   := UPDATE_ROWS;--返回更新的条数
  INSET_ROWS := 10; --返回插入的条数

  DBMS_OUTPUT.PUT_LINE('UPDATE_ROWS:' || UPDATE_ROWS);
  COMMIT;
  --异常处理
EXCEPTION
  WHEN OTHERS THEN
    BEGIN
      ROLLBACK;
      RAISE_APPLICATION_ERROR(-20002,
                              '执行异常:' || SQLCODE || '],原始错误信息是[' || SQLERRM || '].');
    END;
END;

--调用测试存储过程方法一在commnd 窗口中执行

SQL> set serveroutput on
SQL> var return_up_rows number;
SQL> var return_inset_rows number;
SQL> exec  PROC_TEST('AAAA',:return_up_rows,:return_inset_rows);

--调用测试存储过程方法二

DECLARE
  V_STR             VARCHAR2(10) := 'AAA';
  RETURN_UP_ROWS NUMBER(10);
  RETURN_INSET_ROWS NUMBER(10);
BEGIN

  PROC_TEST(V_STR,RETURN_UP_ROWS, RETURN_INSET_ROWS);
 
  DBMS_OUTPUT.PUT_LINE('更新条数:' || RETURN_UP_ROWS);
  DBMS_OUTPUT.PUT_LINE('插入条数:' || RETURN_INSET_ROWS);
END;


你可能感兴趣的:(oracle知识点)