查看: 6616|回复: 12

[PL/SQL] 【大话IT】需要判断存储过程参数的个人 高手进

[复制链接]
论坛徽章:
1
优秀写手
日期:2014-11-07 06:00:13
发表于 2015-2-4 14:39 | 显示全部楼层 |阅读模式
create or replace procedure TESTXXX
(p1  date ,
p2    date,
v_procname in  varchar2)
is
p3 date ;
v_proc varchar2(70);
begin
--  p3 := to_date(p3,'YYYY-MM-DD');
  p3  := p1;
  while  p3 <= p2 loop
     v_proc :=  'begin  '||v_procname||'(date '''||p3||'''); end;' ;
      execute immediate  V_PROC;
     p3 := p3 + 1;
  end loop;
end ;

先说明一下,我们的库 有两种存储过程,A 一种是一个参数的,B 一种是三个参数的,都需要传入日期来执行当天的任务
现在我想写一个存储过程调用A 类  和 B类 的存储过程,我写的如上,意思大家都能看懂,就是从某一天 一直到 某一天 重复调用 你输入的存储过程
但是问题出现了。。。如果我这样写 只支持A类 就是 一个日期参数。。B类的三个参数 需要在声明 两个变量 放置传出参数,如下
但是这样就会造成跑A类过程的时候 会提示 参数个数出错。。。请问怎么改 能让A类和B类参数都兼容??

create or replace procedure TESTXXX
(p1  date ,
p2    date,
v_procname in  varchar2)
is
p3 date ;
v_proc varchar2(70);
begin
--  p3 := to_date(p3,'YYYY-MM-DD');
  p3  := p1;
  while  p3 <= p2 loop
     v_proc :=  'declare  abc varchar2(20);def varchar2(20) ; begin  '||v_procname||'(date '''||p3||'''||,abc,def); end;' ;
      execute immediate  V_PROC;
     p3 := p3 + 1;
  end loop;
end ;


论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
发表于 2015-2-4 14:56 | 显示全部楼层
从dba_arguments里面把参数个数查出来

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
发表于 2015-2-4 15:01 | 显示全部楼层
如果你很确定知道就两个sp,而且参数个数都很明确,那么 ref:
SELECT COUNT(1) INTO v_count FROM DBA_ARGUMENTS T WHERE T.OBJECT_NAME = 'v_procname';
IF v_count >1 CALL v_procname(v1,v2,v2);
  
ELSE
  CALL  v_procname(v1)
  END IF;

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-11-07 06:00:13
 楼主| 发表于 2015-2-4 15:10 | 显示全部楼层
oracle_cj 发表于 2015-2-4 15:01
如果你很确定知道就两个sp,而且参数个数都很明确,那么 ref:
SELECT COUNT(1) INTO v_count FROM DBA_AR ...

确实 是 一个参数 和 三个参数 的 两类

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
11
ITPUB社区千里马徽章
日期:2013-06-09 10:15:34懒羊羊
日期:2015-03-04 14:52:11懒羊羊
日期:2015-02-10 13:36:05马上有对象
日期:2015-02-02 12:29:02红宝石
日期:2015-01-19 09:44:10马上有车
日期:2014-11-11 14:16:07马上有车
日期:2014-03-27 15:59:39优秀写手
日期:2014-03-12 06:00:13马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09
发表于 2015-2-4 15:13 | 显示全部楼层
没看懂需求

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-11-07 06:00:13
 楼主| 发表于 2015-2-4 15:14 | 显示全部楼层
oracle_cj 发表于 2015-2-4 15:01
如果你很确定知道就两个sp,而且参数个数都很明确,那么 ref:
SELECT COUNT(1) INTO v_count FROM DBA_AR ...

要的就是这种效果,3Q

使用道具 举报

回复
论坛徽章:
55
优秀写手
日期:2015-02-12 06:00:13秀才
日期:2016-02-18 10:07:49秀才
日期:2016-02-18 10:08:142016猴年福章
日期:2016-02-23 09:58:34猴赛雷
日期:2016-02-23 10:04:24紫水晶
日期:2016-04-01 12:19:28双子座
日期:2016-04-28 10:19:29秀才
日期:2016-06-23 14:15:06奥运会纪念徽章:曲棍球
日期:2016-08-30 13:12:24奥运会纪念徽章:体操
日期:2016-09-26 11:24:37
发表于 2015-2-4 16:07 | 显示全部楼层
这种写法比较复杂    给你说一种简单的
create or replace procedure(
入参
) is
v_sql   varchar2(10000);
begin
v_sql   :='       你要进行的查询或者操作        '
if。。。。。(这里拼接上输入参数,以及条件)


end 。。。;

使用道具 举报

回复
论坛徽章:
533
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2015-2-5 03:40 | 显示全部楼层
过程名只有两个的话,不要用动态SQL, 用IF ELSE。
否则就用各种办法去判断参数个数,比如小龙说的办法,或者过程名字是否有某种规律。

使用道具 举报

回复
论坛徽章:
17
2013年新春福章
日期:2013-02-25 14:51:242015年新春福章
日期:2015-03-04 14:53:16马上加薪
日期:2014-12-18 01:09:30祖国65周年纪念徽章
日期:2014-09-27 08:49:22马上有房
日期:2014-07-16 11:59:32优秀写手
日期:2014-07-10 06:00:12马上加薪
日期:2014-04-20 23:04:51马上有对象
日期:2014-04-19 23:32:33马上有车
日期:2014-03-29 23:05:24问答徽章
日期:2014-01-17 15:19:03
发表于 2015-2-5 21:38 | 显示全部楼层
这个看存储过程命名统一不统一了,不统一就用上面的,统一的可以用正则 if else 判断一下

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-11-07 06:00:13
 楼主| 发表于 2015-2-6 16:34 | 显示全部楼层
AnddyHua 发表于 2015-2-5 21:38
这个看存储过程命名统一不统一了,不统一就用上面的,统一的可以用正则 if else 判断一下

截取 过程名字?

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表