如何在PL/SQL包中通过函数传递变量给存储过程实现循环插入
问题解决思路与修正代码
核心问题分析
原代码里函数f1的var是局部变量,只有f1执行的时候才存在,同包的p1根本访问不到。要实现需求,得把var改成包级变量,让同包里的函数、过程都能共享这个变量。
修正后的完整代码
1. 先写包规范
得先定义包的对外接口,把包级变量、函数和过程的签名声明好:
create or replace package test2 as -- 包级变量,同包内所有子程序都能访问 var number; function f1(no number) return number; procedure p1; end test2; /
2. 再写包体实现逻辑
这部分写具体的函数和过程代码,现在var是包级变量,f1可以给它赋值,p1能直接用:
create or replace package body test2 as function f1(no number) return number is Begin if no > 0 and no < 20 Then var := no; -- 给包级变量赋值 return 0; else dbms_output.put_line('输入不符合要求(得大于0且小于20)'); return 1; end if; end f1; procedure p1 is number1 number; begin -- 加个检查,防止没调用f1直接跑p1出问题 if var is null or var <=0 then dbms_output.put_line('先调用f1传个符合要求的数再说'); return; end if; for number1 in 1..var loop -- sysdate本身就是日期类型,不用多此一举转格式 insert into val_insert(value, cur_date) values('ramji', sysdate); end loop; -- 按需提交事务,根据实际场景调整 commit; end p1; end test2; /
怎么用
按下面步骤操作就能实现需求:
- 先调用
f1传入5:
declare result number; begin result := test2.f1(5); end; /
- 再调用
p1,这时候就会往val_insert表里插5条数据:
begin test2.p1; end; /
额外提醒
- 包级变量的有效期和当前数据库会话一致,会话结束后变量值就重置了。要是需要长期存这个值,得用表来存。
- 原代码里
TO_DATE(sysdate, 'dd/mm/yyyy hh24:mi:ss')是错的,sysdate本身就是日期类型,直接用就行。
内容的提问来源于stack exchange,提问作者Karthiga
相关产品推荐
相关产品推荐

