step01 需要创建一个package;
例如:
create or replace package package_name is
end package_name ;
这一步只是创建一个package。
step02: 为创建好的package创建包体
例如:
create or replace package body package_name is
end package_name ;
step03: 开始创建存储过程,在上面的包体里面写。
create or replace package body package_name is
procdure pro_1 as
– 声明变量–
begin
–这里写过程的内容
end pro_1 ;
end package_name ;
过程中遇到的一些细节—
- 1 避免重复插入
给表中插入数据时,先清除表中的内容:execute immediate ‘truncte table table_name drop storage’
按字段_1的取值来清空: execute immediate 'truncte table table_name where 字段_1 = ’ || 给定条件 ‘drop storage’
按照分区来清空: execute immediate ‘alter table table_name tuncate partition 分区名 drop storage’ - 自定义数组格式
eg:
type type_array is table of varchar(20) index by binary_integer;
其中,‘type’表示声明,‘type_array’ 为自定义的数组类型名称
‘varchar(20)’是数组元素的类型,
‘index by binary_integer’表示数组内的索引
-声明数组
使用上面自定义的数组类型,开始声明一个数组变量
eg:m_array type_array; - 查询结果并赋值给该数组
eg:select equid bulk collect into m_array from tb_equipment;
第二个关键字段,表示把结果封装成集合赋值给数组。
4接着就可以使用for循环遍历数组了
eg:
for i in 1..m_array.count loop
...
end loop;
**参考博客:https://blog.csdn.net/weishaoqi2/article/details/81225455**
5 变量的命名
- 直接法
:=
如:v_flag := 0; - select into
如:假设变量名为v_flag,select count(*) into v_flag from students;
- execute immediate 变量名(一般是sql的select语句) into 变量名
如:v_sqlfalg := ‘select count(*) from user_tables where table_name=’‘’||v_tablename || ‘’‘’;
execute immediate v_sqlfalg into v_flag;
其中,v_tablename也是变量
在存储过程中,是不能直接写select语句的。
原文:https://blog.csdn.net/drbing/article/details/51821262
6 变量的声明
6-1 声明一个Number类型的变量n_num: n_num NUMBER;
6-2 声明一个和某张表中某个字段同一类型的变量
eg: tmp_ym table_namex.ym%type;
6-3 如果声明一个变量和表中的一条记录类型相同: tmp_row table_namex%rowtype;
给tmp_row 的各个字段进行赋值的方式: tmp_row.字段1 := ‘xxxxx’
如果声明一个临时变量供循环中使用,应指明该变量的类型。
7 在存储过程中调用其他过程
包名.过程名(参数)