Oracle中命名块之存储过程的详解及使用方法 |
|
一、匿名块和命名块 ◆PL/SQL块分为良好总:命名块和匿名块 。 ◆匿名块:以declare或begin开始,每次执行匿名块都要通过客户端工具将其发送给Oracle,经过语法分析、编译然后执行 。 ◆命名块:具有名称的PL/SQL块,这些命名块被存储在Oracle中,编译一次,以后只可调用就可多次执行 。如:存储过程、存储函数、包、触发器等、 存储过程:无返回值; ◆匿名块和命名块的区别: 匿名块:能够动态地创建和执行过程代码的PL/SQL结构,每次执行匿名块时就会自动的将该块数据通过文本的形式发送给Oracle,然后执行,反馈给用户,每次执行都需发送和编译! 二、存储过程: 存储过程是具有名称、完整特定功能和无返回值的PL/SQL块,只需发送调用命令即可执行该过程,能够实现代码的重用,不能在SQL语句当中调用! ◆创建存储过程:
格式:create[or replace] procedure proc_name
[(para1[int|out|in out]type,...)]
{is|AS}
prdc_body
proc_name表示存储过程名; 注意:参数列表是可选的 ◆调用存储过程:(存储过程创建的时候会自动的保存在Oracle中,在执行储存过程的时候,PL/SQL块只需调用即可!) (1)如果在PL/SQL块中调用,直接使用proc_name(...); 【示例】创建一个无参数的存储过程(显示所有员工的信息)
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 模式 【示例】创建一个有参数传递默认的存储过程
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;
注意:(1)在创建存储过程时,形参类型不能指定具体的长度,字符类型就为 varchar2,数字类型就是number;默认和实参类型的长度等同 (2)使用 in 模式,形参接受实参的值,默认形参为常量,在存储过程当中不能被修改,否则出错! 感谢 阅读,希望能帮助到大家,谢谢大家对本站的支持! |