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;