做数据表比较的存储过程
来源:互联网 发布:查看域名注册信息 编辑:程序博客网 时间:2024/04/27 16:47
内容未经测试,只是一种思路。
CREATE OR REPLACE PROCEDURE test
(
pid1 IN varchar2(32),
pid2 IN varchar2(32),
start_date1 IN varchar2(8),
start_date2 IN varchar2(8),
end_date1 IN varchar2(8),
end_date2 IN varchar2(8)
) IS
sql_A varchar2(200);
sql_B varchar2(200);
tablename varchar2(20);
BEGIN
sql_A:='';
sql_B:='';
/*查找数据表(一个月内)*/
/*如果是涉及到两个月的数据,还未作处理*/
tablename:='analog_data_'+substr(start_date1,1,6);
/*查询语句*/
sql_A:='select * into #T1 from '+tablename+
'where pid like '+pid1+
' and dtag<=floor(to_date('+end_date1+
','''yyyymmdd''')-to_date('''20000101''','''yyyymmdd''')) '+
' and dtag>=floor(to_date('+start_date1+
','''yyyymmdd''')-to_date('''20000101''','''yyyymmdd'''))';
sql_B:='select * into #T2 from '+tablename+
'where pid like '+pid2+
' and dtag<=floor(to_date('+end_date2+
','''yyyymmdd''')-to_date('''20000101''','''yyyymmdd''')) '+
' and dtag>=floor(to_date('+start_date2+
','''yyyymmdd''')-to_date('''20000101''','''yyyymmdd'''))';
/*创建临时表#T1.#T2*/
execute(sql_A);
execute(sql_B);
--记录数量
select count(*) into v_count_A from #T1;
select count(*) into v_count_B from #T2;
DECLARE
R_emp_A EMP%ROWTYPE;
R_emp_B EMP%ROWTYPE;
v_pid CHAR(32);
v_dtag NUMBER(5);
v_ttag NUMBER(10);
v_dqf NUMBER(10);
v_pval NUMBER(16,5);
v_count_A NUMER(5); /*A记录数*/
v_count_B NUMBER(5);/*B记录数*/
v_count_temp NUMBER(5);/*临时*/
--游标
CURSOR C_TEMP_A IS select * from #T1; /*声明游标*/
CURSOR C_TEMP_B IS select * from #T2;
BEGIN
if v_count_A<v_count_B /*A为主*/
Begin
OPEN C_TEMP_A;
OPEN C_TEMP_B;
LOOP
FETCH C_TEMP_B INTO R_emp_B;
LOOP
FETCH C_TEMP_A INTO R_emp_A;
if (C_TEMP_B.v_dtag=C_TEMP_A.v_ttag and C_TEMP_B.v_ttag=C_TEMP_A.v_ttag)
then
--analog_data_ana为新建的表,字段同数据表
insert into analog_data_ana(pid,dtag,ttag,dqf,pval) value(C_TEMP_A.v_pid,C_TEMP_A.v_dtag,C_TEMP_A.v_ttag,C_TEMP_A.v_dqf,C_TEMP_A.v_pval);
insert into analog_data_ana(pid,dtag,ttag,dqf,pval) value(C_TEMP_B.v_pid,C_TEMP_B.v_dtag,C_TEMP_B.v_ttag,C_TEMP_B.v_dqf,C_TEMP_B.v_pval);
end if;
EXIT WHEN C_TEMP_A%NOTFOUND;
END LOOP;
EXIT WHEN C_TEMP_B%NOTFOUND;
END LOOP;
CLOSE C_TEMP_A;
CLOSE C_TEMP_B;
END;
if v_count_A>v_count_B /*B为主*/
Begin
OPEN C_TEMP_A;
OPEN C_TEMP_B;
LOOP
FETCH C_TEMP_A INTO R_emp_A;
LOOP
FETCH C_TEMP_B INTO R_emp_B;
if C_TEMP_B.v_dtag=C_TEMP_A.v_ttag and C_TEMP_B.v_ttag=C_TEMP_A.v_ttag;
then
insert into analog_data_ana(pid,dtag,ttag,dqf,pval) value(C_TEMP_A.v_pid,C_TEMP_A.v_dtag,C_TEMP_A.v_ttag,C_TEMP_A.v_dqf,C_TEMP_A.v_pval);
insert into analog_data_ana(pid,dtag,ttag,dqf,pval) value(C_TEMP_B.v_pid,C_TEMP_B.v_dtag,C_TEMP_B.v_ttag,C_TEMP_B.v_dqf,C_TEMP_B.v_pval);
end if;
EXIT WHEN C_TEMP_B%NOTFOUND;
END LOOP;
EXIT WHEN C_TEMP_A%NOTFOUND;
END LOOP;
CLOSE C_TEMP_B;
CLOSE C_TEMP_A;
END;
End;
Drop Table #T1;/*删除临时表*/
Drop Table #T2;
Truncate analog_data_ana;/*清空临时表*/
END test
- 做数据表比较的存储过程
- 数据表和存储过程
- 存储过程构造数据表
- 小型数据表分页---存储过程
- 使用存储过程操作数据表
- MSSQL中批量修改数据表和存储过程的所有者
- SQLServer导出数据表中数据的存储过程
- MYSQL 查询包含某个数据表的所有存储过程
- sql生成(c#调用存储过程返回数据表)代码的存储过程
- 存储过程做的日历(原创)
- 自己学存储过程做的笔记
- 做一个串行执行的存储过程
- 删除比较危险的sqlserver存储过程
- 我认为比较好的分页存储过程
- 一个比较好的分页存储过程
- 我认为比较好的分页存储过程
- 一个比较不错的存储过程分页
- SqlServer 比较有用的系统存储过程
- oracle中某月天数的获取
- 正则模式修正符
- 话说罗盘
- 我设计的UNIX根文件系统目录结构
- Chapter 3(1): Helper Classes
- 做数据表比较的存储过程
- 写给我小弟的PHP培训教材!
- 基民增速赶超股民
- 企业版个性化搜索引擎产品分析报告
- oracle 数据库里查看表空间使用状况
- 常用的网页播放器代码
- DataGrid为删除列添加确认弹出框
- CausesValidation="False"
- 2007年9月6日