oracle存储过程如何动态修改表名关联查询

夏末冬初 2012-10-22 10:32:56
想请问下各位,我现在有个表前面是以'sms_dx_demo_'开头的,每天的记录会根据每天的日期存放在一张表里,比如今天22号,就会放在sms_dx_demo_22表中,现在我这边有个存储过程,我需要每天跑一次,然后每天这个表名都会动态变化,请问横线表名部分怎么拼装,谢谢!


day varchar2(2); ------日期
---- 短信表后缀
select to_char(sysdate-1,'dd') into day from dual;

------ 统计xxxx成功量
select sum(sms.send_count) into sa_send_cnt from core_school sc
inner join sms_mt_send sms on sc.school_id = sms.school_id
inner join 'sms_mt_send_detail'||day detail on sms.mt_send_id = detail.mt_send_id
where sms.data_src in (1,2,3) and (detail.errorcode = '0' or detail.errorcode is null) ;
...全文
251 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
book523 2012-10-23
  • 打赏
  • 举报
回复
简单吧,搞定后有没有一点成就感?我觉得做软件最大的乐趣就是搞定一个问题后的那种喜悦和一点点成就。
夏末冬初 2012-10-23
  • 打赏
  • 举报
回复
搞定了,多谢各位!
declare 
p_sql varchar2(5000);
school_id number(10);
sa_send_cnt number(10);
p_day varchar2(2);
begin

select to_char(sysdate-1,'dd') into p_day from dual;
dbms_output.put_line(p_day);
select school_id into school_id from core_school where ec_code = '791910076970';
dbms_output.put_line(school_id);
p_sql := 'select nvl(sum(sms.send_count),0) from core_school sc
inner join sms_mt_send sms on sc.school_id = sms.school_id
inner join sms_mt_send_detail'||p_day||' detail on sms.mt_send_id = detail.mt_send_id
where sms.data_src in (1,2,3) and (detail.errorcode = ''0'' or detail.errorcode is null) and sc.school_id ='||school_id;
dbms_output.put_line(p_sql);
execute immediate p_sql into sa_send_cnt;

dbms_output.put_line(sa_send_cnt);

end;
夏末冬初 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
使用动态拼装sql方法

day varchar2(2);
sql varchar2(2000);
---- 短信表后缀
select to_char(sysdate-1,'dd') into day from dual;

------ 统计xxxx成功量
sql:= 'select sum(sms.send_count) into sa_send_cnt from core_s……
[/Quote]


试了是可以,不过我想把sum(sms.send_count)的值付给sa_send_cnt 直接执行上面的sql会报错,说是missing keyword
book523 2012-10-23
  • 打赏
  • 举报
回复
使用动态拼装sql方法

day varchar2(2);
sql varchar2(2000);
---- 短信表后缀
select to_char(sysdate-1,'dd') into day from dual;

------ 统计xxxx成功量
sql:= 'select sum(sms.send_count) into sa_send_cnt from core_school sc '||
'inner join sms_mt_send sms on sc.school_id = sms.school_id '||
'inner join ||'sms_dx_demo_'||day||' detail on sms.mt_send_id = detail.mt_send_id '||
' where sms.data_src in (1,2,3) and (detail.errorcode = ''0'' or detail.errorcode is null) ';
dbms_output.put_line(sql);
Execute Immediate sql;
结贴是美德 2012-10-23
  • 打赏
  • 举报
回复
貌似得用动态sql,就是execute immediate
Oracle数据库设计规范建议 1 目的 本规范的主要目的是希望规范数据库设计,尽量提前避免由于数据库设计不当而产生 的麻烦;同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很 好的保证。 数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其 应用系统,有效存储数据,满足用户信息要求和处理要求。 2 适用范围 本规范的适用人员范围包括我司的所有应用开发人员以及在我司承接数据库应用开 发的软件人员。 本规范的适用IT范围包括数据库对象的命名规范、设计原则、SQL语句的设计和使用 、SQL语句的性能优化建议、其他与性能有关的设计原则以及设计工具的选择。 3 数据对象的命名规范 3.1 通用规范 3.1.1 使用英文:要用简单明了的英文单词,不要用拼音,特别是拼音缩写。主要目的很明确 ,让人容易明白这个对象是做什么用的; 3.1.2 一律大写,特别是表名:有些数据库,表的命名乃至其他数据对象的命名是大小写敏感 的,为了避免不必要的麻烦,并且尊重通常的习惯,最好一律用大写; 3.2 数据库对象命名规范 3.2.1 表的命名 3.2.1.1 表名的前缀:前缀_表名_T。为表的名称增加一个或者多个前缀,前缀名不要太长,可以 用缩写,最好用下划线与后面的单词分开;其目的有这样几个: 3.2.1.1.1 为了不与其他项目或者其他系统、子系统的表重名; 3.2.1.1.2 表示某种从属关系,比如表明是属于某个子系统、某个模块或者某个项目等等。表示这 种从属关系的一个主要目的是,从表名能够大概知道如何去找相关的人员。比如以子系 统为前缀的,当看到这个表的时候,就知道有问题可以去找该子系统的开发和使用人员 ; 3.2.2 视图命名:相关表名_V(或者根据需要另取名字); 3.2.3 程序包命名:程序包名_PKG(用英文表达程序包意义); 3.2.4 存储过程命名:存储过程名_PRO(用英文表达存储过程意义); 3.2.5 函数命名:函数名称_FUN(用英文表达函数作用); 3.2.6 触发器命名:触发器名称_TRI(用英文表达触发器作用); 3.2.7 索引命名:表名_字段名_IDX(如果存在多字段索引,取每字段前三个字符加下划线组合 ,如在 custom, cutting, curtail 上建立联合索引,命名为 表名_cus_cut_cur_IDX,如果前三个截取字符相同,就从字段名称中不同的字符开始取三 个字符加下划线组合,如在 custid, custom,custname上建立联合索引,就命名为表_tid_tom_tna_IDX; 3.2.8 唯一索引命名:表名_字段名_UNI(如果存在多字段唯一索引,取每字段前三个字符加下 划线组合,如在 custom, cutting, curtail上建立唯一索引,命名为 表名_ cus_cut_cur_UNI,如果前三个截取字符相同,就从字段名称中不同的字符开始取三个字 符加下划线组合,如:在 custid, custom,custname上建立唯一索引,命名:表_tid_tom_tna_UNI; 3.2.9 主键命名:表名_字段名_PK(如果存在多字段主键,取每字段前三个字符加下划线组合, 如在 custom, cutting, curtail上建立主键,命名为 表名_cus_cut_cur_PK,如果前三个截取字符相同,就从字段名称中不同的字符开始取三 个字符加下划线组合,如在 custid, custom,custname上建立主键,命名:表_tid_tom_tna_PK; 3.2.10 外键命名:表名_主表名_字段名_FK; 3.2.11 Sequence 命名:表名_列名_SEQ(或者根据需要另取名字); 3.2.12 Synonym 命名:与对应的数据库对象同名; 3.2.12 JAVA 命名:遵守公司相应的JAVA命名规范; 4 数据库对象设计原则 4.1 表的设计 4.1.1 主、外键 4.1.1.1 每个表,都必须要有主键。主键是每行数据的唯一标识,保证主键不可随意更新修改, 在不知道是否需要主键的时候,请加上主键,它会为你的程序以及将来查找数据中的错 误等等,提供一定的帮助; 4.1.1.2 一个表的某列与另一表有关联关系的时候,如果加得上的话,请加上外键约束。外键是 很重要的,所以要特别强调: 4.1.1.2.1 适量建外键。为了保证外键的一致性,数据库会增加一些开销,如果有确凿的并且是对 性能影响到无法满足用户需求的证据,可以考虑不建外键。否则,还是应该建外键; 4.1.1.2.2 不要以数据操作不方便为理由而不建外键。是的,加上外键以后,一些数据操作变得有 些麻烦,但是这正是对数据一致性的保护。正是因为这种保护很有效,所以最好不要拒

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧