小弟也是刚申请的号,分数不多。请不要见怪。
       问题是这样的:
           有俩张表: 一张新导入表,一张旧表
       写个储存过程,让两表中的一个字段(比如说:money)进行比较,
       如果新导入表中的money小于旧表中的money
       则就把新导入表中的数据加入一个新创建表中,然后查询新建表中最低的money出来
    麻烦各位了,小弟还是刚接触oracle,犹豫特殊情况。
        我也没时间慢慢学习了,先把任务完成了。然后好好研究下oracle~
           求大家帮帮忙~ 
       

解决方案 »

  1.   

    需求描述不够清楚,难以理解你的需求。1. 新导入表中的money小于旧表中的money,应当还有其它约束条件吧?比如相同主键的记录才进行比较
    2. 符合条件的数据加入的一个新创建的表中?这个新创建是在哪创建?动态创建吗?
      

  2.   

    表没有任何外键约束,
    就是两张完全独立的表,两表中都没有主键。 只要新导入的数据中money小于旧表中的money
    就动态创建,然后比对完的数据插入到新表中!
      

  3.   

    如果新导入表中的money小于旧表中的money
      则就把新导入表中的数据加入一个新创建表中,然后查询新建表中最低的money出来这个数据是要保存下来,还是说,就只供查询一次?
      

  4.   


    假设新表为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对比时插入的
      

  5.   


    -- 新表
    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;
    /
      

  6.   

    1,插入的新表是独立创建的表~!
    2,新导入的表money数据不止一个,而旧表money数据固定就一个。所以拿新导入表的money数据和固定money进行比较,只要新表中的money小于旧表的money。就动态创建一个新表,然后比对数据加入到新表中。
      

  7.   


    你按的需求,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;
      

  8.   


    存储过程,查询的时候,你自己改一下 select 语句,你要取最小的money,就是 select commodity, min(money) money
      from insrt_tab
     group by commodity;其他的条件,你后面自己参照着慢慢加
      

  9.   


       这位大大,查询insrt_tab表中money最小值是否可以这样写?SELECT * FROM insrt_tab where money=(SELECT min(money) FROM insrt_tabwhere) ;
      

  10.   


    这样既可,我上面的帖子也说明了的
    select commodity, min(money) money
      from insrt_tab
     group by commodity;
      

  11.   

      我把oracle 写完就过来结贴~
    我怕我现在结贴的话。又遇到问题了, 又要开贴~
      

  12.   


    我只是在存储过程使用了一个 out 参数,参数类型是一个 ref cursor 类型的
    一般存储过程返回数据(比如你想在页面上显示),都是用的这种方法
      

  13.   

     这里的游标是储存过程的返回值,这个我能看明白
    但是,您整个过程没有定义游标~
       不是要把sql语句存放在游标中。。然后拿游标来匹配数据的嚒?
             这是我理解的游标~
      

  14.   

       目前我就理解了显示游标中的普通游标~
    至于您说的
     ref cursor 类型的
       这个我真不知道~
    诶,看来我oracle 确实稀烂~自愧不如啊!
      

  15.   

    ocursor       out       sys_refcursorocursor 就是一个游标呀
      

  16.   

      诶,游标我自己好好百度下,学习下
    opps_zhou这个大大,谢谢您勒~
      

  17.   

    opps_zhou:
          我这里报了个错误。您还在不?
      

  18.   

      您终于现身了
    我直接贴我代码吧。。
          
    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
      

  19.   

    create or replace procddure p_test
    标注红色的那个单词是
    procedure
      

  20.   


    嗯,确实。。我有点粗心了。。您帮我看看储存过程 有没有编译错误?Warning: Procedure created with compilation errors
      

  21.   

    update 旧表 SET MONEY=CASE WHEN A.MONEY>B.MONEY THEN B.MONEY ELSE A.MONEY END FROM 旧表 A LEFT JOIN 新表 B ON A.ITEMCODE=B.ITEMCODE
      

  22.   


     这个SQL语句是更新什么?
      

  23.   

    我想在oracle数据库中调用储存过程,请问如何调用啊?
      

  24.   

    你要在oracle中的哪里调用呢?直接写这个存储过程的名字就可以了。
    p_test(mycourse);
      

  25.   

           我的表数据都有,储存过程是把对比的数据插入到新创建表中。。
     我想查看结果。。
       我select 比较表~ 没数据
       我在最后调用储存过程,一样没数据。。
     这个要怎么实现?
      

  26.   

    先调用存储过程,然后再select,或者直接看存储过程返回的游标,显示游标的内容。