oracle中存储过程小结

1.创建或替换一个存储过程(PROCEDURE)

CREATE [OR REPLACE] PROCEDURE procedure_name
    [ (parameter [,parameter]) ]

IS
    [declaration_section]

BEGIN
    executable_section

[EXCEPTION
    exception_section]

END [procedure_name];

具体的例子

CREATE OR REPLACE PROCEDURE update_emp
AS
BEGIN 
  UPDATE emp e
  SET e.ename='JUSHISI'
  WHERE e.ename='KING' ;
COMMIT;
  DBMS_OUTPUT.put_line('king -> jushisi ');
END update_emp;
--调用存储过程
CALL update_emp();

2.参数类型分为三种:in,out,in out

in 类型不能被赋值,

out,只能接收赋值,不能给其他变量赋值

in out 类型可以接收赋值,也可以给其他变量赋值

首先看 in 类型,注意看下面例子中的注释

CREATE OR REPLACE PROCEDURE update_emp
(
--声明参数
  uname IN NVARCHAR2,
  ujob IN NVARCHAR2
)
AS
BEGIN 
  UPDATE emp e
  SET e.job=ujob
  WHERE e.ename=uname;
  DBMS_OUTPUT.put_line('传进来的 uname '||uname);  
--COMMIT 不加不会真的保存到数据库中
COMMIT; 
--IN 类型的参数不能赋值
--uname:='jss'; 如果有这行,则会使这个存储过程无效
  DBMS_OUTPUT.put_line('赋值后的 uname '||uname);
END update_emp;


--执行
BEGIN
  update_emp(uname=>'KING',ujob=>'KING');
END;

OUT 类型

CREATE OR REPLACE PROCEDURE show_sal
(
  max_sal OUT emp.sal%TYPE,
  min_sal OUT emp.sal%TYPE,
  avg_sal OUT emp.sal%TYPE,
  comment_sal IN VARCHAR2
)
IS
BEGIN 
  SELECT MAX(sal) INTO max_sal FROM emp;
  SELECT MIN(sal) INTO min_sal FROM emp;
  SELECT AVG(sal) INTO avg_sal FROM emp;
  --尽管不报错 但在这 OUT 类型给其它变量赋值是没有作用的
  --comment_sal:=max_sal;
END show_sal;

 
DECLARE 
  max_s emp.sal%TYPE;
  min_s emp.sal%TYPE;
  avg_s emp.sal%TYPE; 
  comm VARCHAR2(100);
BEGIN
  --此时max_s未赋值
  DBMS_OUTPUT.put_line(' comm '||comm);
  --执行
  show_sal(max_s,min_s,avg_s,comment_sal=>'comment !');
  DBMS_OUTPUT.put_line('max '||max_s||' min '||min_s||' avg '||avg_s||' comm '||comm);
  --此时max_s已经赋值完
  comm:=max_s; 
  DBMS_OUTPUT.put_line(' comm '||comm);
END;

IN OUT 

可以算是IN,OUT两者之间的结合,可以赋值给其它变量,也可以被赋值

CREATE OR REPLACE PROCEDURE fruit
  (
    apple IN OUT NUMBER
  )
IS
BEGIN
  dbms_output.put_line('apple '||apple);
  apple:='100';
  dbms_output.put_line('apple after '||apple);
END fruit;


DECLARE 
  apple_n NUMBER(3);
BEGIN 
  apple_n:=123;
  fruit(apple_n);
  dbms_output.put_line('apple_n '||apple_n);
END;
  

猜你喜欢

转载自blog.csdn.net/qq_34120430/article/details/82153697