create or replace procedure pr_show_employee
is
--进入块的声明部分(无需编写declare关键字)
--定义游标
cursor v_emp_cursor is select * from employees;
--定义游标类型的记录型行变量
v_emp_record v_emp_cursor%rowtype;
begin
for v_emp_record in v_emp_cursor loop
dbms_output.put_line(v_emp_record.employee_id||','||v_emp_record.first_name||','||
v_emp_record.last_name||','||v_emp_record.salary);
end loop;
end pr_show_employee ;
--调用存储过程(在一个匿名块中执行)
begin
pr_show_employee();
end;
【示例】存储过程的参数接受产品类别编号,输出该类所有产品的信息
create or replace procedure pr_show_product(
product_type products.product_type_id%type)
as
--定义游标
cursor v_prd_cursor is select * from products p where product_type = p.product_type_id;
--定义游标的行类型变量
v_prd_record v_prd_cursor%rowtype;
begin
for v_prd_record in v_prd_cursor loop
dbms_output.put_line(v_prd_record.product_id||','||v_prd_record||','||product_type_id||','||v_prd_record.description||','
||v_prd_record.
name||','||v_prd_record.price);
end loop;
end pr_show_product;
--调用存储过程(执行)
declare
--定义编号变量的类型
v_prd_type_id products.product_type_id%type := 1;
begin
pr_show_product(v_prd_type_id);
end;
◆参数的传递模式:
参数传递有三种模式:in、out、in out
in:过程调用时,实参的值会传递给形参。形参被看作是常量,在过程内部不能被修改。
out:过程调用时,实参的值被忽略,形参为null值,在过程内部形参变量可以读写。过程结束时,形参的值赋值给实参!
in out:过程调用时,实参的值传递给形参,在过程内部形参变量可读可写,过程结束时,形参的值赋值给实参。
注意:如果在定义存储过程时,没有指明参数传递模式,则默认为 in 模式
【示例】创建一个有参数传递默认的存储过程
create or replace procedure pr_test(p_1 in out varchar2)
is
begin
dbms_output.put_line('p_1='||p_1);
p_1 := 'abc';
dbms_output.put_line('p_1='||p_1);
end pr_test;
--调用存储过程
declare
v_1 varchar2(5) := 'wwww';
begin
pr_test(v_1);
dbms_output.put_line('v_1='||v_1);
end;
(2)使用 in 模式,形参接受实参的值,默认形参为常量,在存储过程当中不能被修改,否则出错!
(3)使用 out 模式,实参的值被忽略,但必须是变量,用来接收存储过程执行完形参的值;而形参是可读可写的。
(4)使用 in out 模式,实参的值传递给形参,也必须是变量,形参可读可写,最后执行完存储过程形参的值传递给实参!
(5)参数传递,实参的值和长度或精度约束会传递给形参,因此,形参不能有长度或精度的约束。在过程中给形参赋值时,要注意它的长度或精度的限制!
感谢 阅读,希望能帮助到大家,谢谢大家对本站的支持!