小弟也是刚申请的号,分数不多。请不要见怪。
问题是这样的:
有俩张表: 一张新导入表,一张旧表
写个储存过程,让两表中的一个字段(比如说:money)进行比较,
如果新导入表中的money小于旧表中的money
则就把新导入表中的数据加入一个新创建表中,然后查询新建表中最低的money出来
麻烦各位了,小弟还是刚接触oracle,犹豫特殊情况。
我也没时间慢慢学习了,先把任务完成了。然后好好研究下oracle~
求大家帮帮忙~
问题是这样的:
有俩张表: 一张新导入表,一张旧表
写个储存过程,让两表中的一个字段(比如说:money)进行比较,
如果新导入表中的money小于旧表中的money
则就把新导入表中的数据加入一个新创建表中,然后查询新建表中最低的money出来
麻烦各位了,小弟还是刚接触oracle,犹豫特殊情况。
我也没时间慢慢学习了,先把任务完成了。然后好好研究下oracle~
求大家帮帮忙~
2. 符合条件的数据加入的一个新创建的表中?这个新创建是在哪创建?动态创建吗?
就是两张完全独立的表,两表中都没有主键。 只要新导入的数据中money小于旧表中的money
就动态创建,然后比对完的数据插入到新表中!
则就把新导入表中的数据加入一个新创建表中,然后查询新建表中最低的money出来这个数据是要保存下来,还是说,就只供查询一次?
假设新表为A,表中有3条记录
2011-10-12
2011-10-13
2011-10-14假设旧表为B,表中有2条记录
2011-10-13
2011-10-14那么要插入的新表是哪张表?表A?还是另外一张表T?
表And的记录是和表B中的每条记录对比?还是和表B中最大的那条记录对比?
如果是和表B的每条记录对比,那么插入的内容就应当是
2011-10-12
-- 上面是和表B的2011-10-13对比时插入的
2011-10-12
2011-10-13
-- 上面是和表B的2011-10-14对比时插入的
-- 新表
create table new_tab
(
commodity varchar2(20),
money number
);
-- 旧表
create table old_tab
(
commodity varchar2(20),
money number
);-- 比较插入的表
create table insrt_tab
(
commodity varchar2(20),
money number
);
create or replace procedure p_test
(
ocursor out sys_refcursor
)
as
begin
insert into insrt_tab(commodity, money)
select a.commodity, a.money
from new_tab a, old_tab b
where a.commodity = b.commodity
and a.money < b.money; commit;
open ocursor for
select * from insrt_tab;
end p_test;
/
2,新导入的表money数据不止一个,而旧表money数据固定就一个。所以拿新导入表的money数据和固定money进行比较,只要新表中的money小于旧表的money。就动态创建一个新表,然后比对数据加入到新表中。
你按的需求,8楼提供的代码应当就可以满足你的需求。8楼的代码中包括了建表语句、存储过程、动态游标。
其中的重点是下面这条SQL:
insert into insrt_tab(commodity, money)
select a.commodity, a.money
from new_tab a, old_tab b
where a.commodity = b.commodity
and a.money < b.money;
存储过程,查询的时候,你自己改一下 select 语句,你要取最小的money,就是 select commodity, min(money) money
from insrt_tab
group by commodity;其他的条件,你后面自己参照着慢慢加
这位大大,查询insrt_tab表中money最小值是否可以这样写?SELECT * FROM insrt_tab where money=(SELECT min(money) FROM insrt_tabwhere) ;
这样既可,我上面的帖子也说明了的
select commodity, min(money) money
from insrt_tab
group by commodity;
我怕我现在结贴的话。又遇到问题了, 又要开贴~
我只是在存储过程使用了一个 out 参数,参数类型是一个 ref cursor 类型的
一般存储过程返回数据(比如你想在页面上显示),都是用的这种方法
但是,您整个过程没有定义游标~
不是要把sql语句存放在游标中。。然后拿游标来匹配数据的嚒?
这是我理解的游标~
至于您说的
ref cursor 类型的
这个我真不知道~
诶,看来我oracle 确实稀烂~自愧不如啊!
opps_zhou这个大大,谢谢您勒~
我这里报了个错误。您还在不?
我直接贴我代码吧。。
create table AtzVendor( --旧的表
quoteid varchar2(50),
usergroupid number(5),
regioncode varchar2(10),
regionname varchar2(100),
cityname varchar2(100),
citycode varchar2(15),
firstunit number(4),
firstrate number(10,6),
secondunit number(4),
secondrate number(10,6),
feerate number(10,6),
effectivedate date,
expiredate date,
dates date,
newflag number(4),
filename varchar2(255),
prefix varchar2(50),
rateid number(10)
)create table ImportRateAdd --新导入的表
(
usergroupid number(5),
quoteid varchar2(50),
regioncode varchar2(10), --字段1
regionname varchar2(100), --字段2
cityname varchar2(100), --字段3
citycode varchar2(15), --字段4
filename varchar2(100),
ratetype number(4),
firstunit number(4),
firstrate number(10,6),
secondunit number(4),
secondrate number(10,6),
effectivedate date,
expiredate date,
loginname varchar2(50),
importdate date,
dates date,
feerate number(10,6), --这个是要比较的字段
reimporttimes number(4),
actionflag number(4),
changed number(4),
ratetypedese varchar2(100),
prefix varchar2(50),
atzflag number(4)
)create table CompareRate --比较之后创建的表
(
regioncode varchar2(10),
regionname varchar2(100),
cityname varchar2(100),
citycode varchar2(15),
feerate number(10,6),
importdate date
)create or replace procddure p_test
(
ocursor out sys_refcursor;)as
begin
insert into CompareRate(regioncode,regionname,cityname, citycode,feerate,inportdate)
select a.REGIONCODE,a.REGIONNAME,a.CITYCODE ,a.CITYNAME,a.feerate,a.IMPORTDATE
from ImportRateAdd a, b AtzVendor
where a.regioncode = b.regioncode
and a.citycode = b.citycode
and a.feerate < b.feerate; commit;
open ocursor for
SELECT * FROM CompareRate where feerate =(SELECT min(feerate ) FROM CompareRate);
end p_test;
/ 报错:
————————————分割线————————————————
Error on line 0
create or replace procddure p_test
(
ocursor out sys_refcursorORA-00922: 缺少或无效选项
————————————分割线————————————————
Error on line 7
begin
insert into CompareRate(regioncode,regionname,cityname, citycode,feerORA-06550: 第 4 行, 第 30 列:
PL/SQL: ORA-00942: 表或视图不存在
ORA-06550: 第 2 行, 第 5 列:
PL/SQL: SQL Statement ignored
ORA-06550: 第 10 行, 第 10 列:
PLS-00201: 必须说明标识符 'OCURSOR'
ORA-06550: 第 10 行, 第 5 列:
PL/SQL: SQL Statement ignored
标注红色的那个单词是
procedure
嗯,确实。。我有点粗心了。。您帮我看看储存过程 有没有编译错误?Warning: Procedure created with compilation errors
这个SQL语句是更新什么?
p_test(mycourse);
我想查看结果。。
我select 比较表~ 没数据
我在最后调用储存过程,一样没数据。。
这个要怎么实现?