CREATE [OR REPLACE] PROCEDURE procedure_name [ (parameter_name [ IN | OUT | IN OUT] type [,.......] ) ]
{IS | AS}
BEGIN
procedure_body
END procedure_name;
OR REPLACE说明如果过程已经存在,就替换已有的过程。
procedure_name 表示存储过程的名称。
parameter_name 表示参数的名称,可以有多个。
IN | OUT | IN OUT 定义了参数的模式,每一个参数都可以选择下列模式之一:
- IN 是参数的默认模式。这种模式定义的参数在程序运行的时候必须具有值,在过程体中不能改变IN参数的值。
- OUT 模式定义的参数在过程体内部赋值。
- IN OUT 模式定义的参数在过程运行时可能已经具有值,并且在过程运行中也可以修改此值。
type 指定参数的类型。
procedure_body 包含过程的实际代码。
废话不多说,上个demo;
CREATE PROCEDURE update_product_price(p_product_id IN products.product_id%TYPE, p_factor IN NUMBER)
AS
v_product_count INTEGER;
BEGIN
SELECT COUNT(*) INTO v_product_count FROM products WHERE product_id = p_product_id;
IF v_product_count = 1 THEN
UPDATE products set price = price * p_factor WHERE product_id = p_product_id;
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END update_product_price;