(p_upcode         in varchar2, --属装图号
           p_upname         in varchar2, --属装图名
           p_ditem          in number, --键号
           p_dcode          in varchar2, --图号
           p_dname          in varchar2, --图名
           p_dmaterial      in varchar2, --材料
           p_dweight        in number, --单重
           p_dtweight       in number, --总重
           p_dquantity      in number, --总数
           p_dre        in varchar2, --备注
           p_dother1        in varchar2, --工艺分工
           p_productdwgcode in varchar2, --所属产品 
           p_g1             in varchar2,
           p_g2             in varchar2, --领料单位 
           p_g3             in varchar2,
           p_g4             in varchar2,
           p_g5             in varchar2,
           p_g6             in varchar2,
           p_g7             in varchar2,
           p_g8             in varchar2,
           p_g9             in varchar2,
           p_xialiao        in varchar2, --下料尺寸
           p_dinge          in number, --定额
           p_lldw           in varchar2, --领料单位
           p_d          in varchar2, --外购标记
           p_invcost        in number, --计划价
           p_dinvcost       in number, --计划总价
           p_cinvcode       in varchar2, --物料码
           p_invunit        in varchar2, --计量单位
           p_yongyou        in varchar2, --用友码
           p_changerate     in number, --转化率
           p_dxcb           in number, --单向成本
           p_sjyl           in number,--设计用量
           p_creator        in varchar2, --创建人
           -- p_createtime     in date, --创建日期
           p_modified       in varchar2 --修改人
           -- p_modifytime     in date --修改日期
                                          ) as
  num number;
  num1 number;--单重
  num2 number;--总重
  num3 varchar2(50);--下料尺寸
  num4 number;--定额
  num5 number;--计划价
  num6 number;--计划总价
  num7 varchar2(10);--领料单位
  num8 varchar2(20);--用友码
begin
    select count(*)
    into num 
    from XTDETAIL.XTDETAMSALL_DETAIL_2
    WHERE UPCODE = p_upcode
    and DITEM = p_ditem;
   if num <> 0 then
       select DWEIGHT,DTWEIGHT,XIALIAO,DINGE,INVCOST,DINVCOST,LLDW,YONGYOU 
       into num1,num2,num3,num4,num5,num6,num7,num8 
       from XTDETAIL.XTDETAMSALL_DETAIL_2
       WHERE UPCODE = p_upcode
       and DITEM = to_number(p_ditem); 
       if num1 <> p_dweight or num2 <> p_dtweight or num3 <> p_xialiao or num4 <> p_dinge or num5 <> p_invcost or num6 <> p_dinvcost or num7 <> p_lldw or num8 <> p_yongyou then
           update XTDETAMSALL_DETAIL_2
           set DWEIGHT    = p_dweight,--单重
               DTWEIGHT   = p_dtweight,--总重
               XIALIAO    = p_xialiao,--下料尺寸
               DINGE      = p_dinge,--定额
               INVCOST    = p_invcost,--计划价
               DINVCOST   = p_dinvcost,--计划总价
               LLDW       = p_lldw, --领料单位
               YONGYOU    = p_yongyou,--用友码
               MODIFIED   = p_modified,
               MODIFYTIME = sysdate
           where UPCODE = p_upcode
             and DITEM = p_ditem;
        end if;
    else
    insert into XTDETAMSALL_DETAIL_2
      (UPCODE,
       UPNAME,
       DITEM,
       DCODE,
       DNAME,
       DMATERIAL,
       DWEIGHT,
       DTWEIGHT,
       DQUANTITY,
       DREMARK,
       DOTHER1,
       PRODUCTDWGCODE,
       G1,
       G2,
       G3,
       G4,
       G5,
       G6,
       G7,
       G8,
       G9,
       XIALIAO,
       DINGE,
       LLDW,
       DMARK,
       INVCOST,
       DINVCOST,
       CINVCODE,
       INVUNIT,
       YONGYOU,
       CHANGERATE,
       DXCB,
       SJYL,
       CREATOR,
       CREATETIME)
    values
      (p_upcode,
       p_upname,
       p_ditem,
       p_dcode,
       p_dname,
       p_dmaterial,
       p_dweight,
       p_dtweight,
       p_dquantity,
       p_dre,
       p_dother1,
       p_productdwgcode,
       p_g1,
       p_g2,
       p_g3,
       p_g4,
       p_g5,
       p_g6,
       p_g7,
       p_g8,
       p_g9,
       p_xialiao,
       p_dinge,
       p_lldw,
       p_d,
       p_invcost,
       p_dinvcost,
       p_cinvcode,
       p_invunit,
       p_yongyou,
       p_dxcb,
       p_sjyl,
       p_changerate,
       p_creator,
       sysdate);
  end if;
  commit;
end insert_update;<?php
session_start();
if($_POST['Submit']==true){
  $path1=$_POST['upcode'.$i];//属装图号 varchar2
  $path2=$_POST['upname'.$i];//属装图名 varchar2
  $path3=(float)$_POST['ditem'.$i]; //键号 number
  $path4=$_POST['dcode'.$i];//图号 varchar2
  $path5=$_POST['dname'.$i]; //图名 varchar2
  $path6=$_POST['dmaterial'.$i]; //材料 varchar2
  $path7=round($_POST['dweight'.$i],3); //单重 number
  $path8=round((float)$_POST['dtweight'.$i],3); //总重
  $path9=(float)$_POST['dquantity'.$i]; //数量 number
  $path10=$_POST['dre'.$i]; //备注 varchar2
  $path11=$_POST['dother1'.$i]; //工艺分工 varchar2
           $path12=$_POST['dproductdwg'.$i];  //所属产品 varchar2
  $path13=$_POST['G1'.$i]; //varchar2
  $path14=$_POST['G2'.$i];
  $path15=$_POST['G3'.$i];
  $path16=$_POST['G4'.$i];
  $path17=$_POST['G5'.$i];
  $path18=$_POST['G6'.$i];
  $path19=$_POST['G7'.$i];
  $path20=$_POST['G8'.$i];
  $path21=$_POST['G9'.$i];
  $path22=$_POST['xialiao'.$i]; //下料尺寸 varchar2
  $path23=round($_REQUEST['dinge'.$i],3); //定额 varchar2
           $path24=$_POST['lldw'.$i];//领料单位 varchar2
  $path25=$_POST['d'.$i];//自制/外购/标准件 varchar2
  $path26=round($_POST['invcost'.$i],3);//计划价 number
  $path27=round($_POST['dinvcost'.$i],3);//计划总价
  $path28=$_POST['cinvcode'.$i];//新物料码 varchar2
  $path29=$_POST['dinvunit'.$i]; //计量单位 varchar2
  $path30=$_POST['yongyou'.$i];//用友码 varchar2
  $path31=(float)$_POST['changerate'.$i];//转换率 number
  $path32=round($_POST['dxcb'.$i],3);//number 单向成本-----》其实 就是 计划总价 DINVCOST 
  $path33=round($_POST['sjyl'.$i],3);    //  number 设计用量-----》总重  DTWEIGHT 
  $path34 = $_SESSION['pdmuser']; //创建人 varchar2
  $path35 = $_SESSION['pdmuser']; //修改人
  $sql = "BEGIN insert_update(:path1,:path2,:path3,:path4,:path5,:path6,:path7,:path8,:path9,:path10,:path11,:path12,:path13,:path14,:path15,:path16,:path17,:path18,:path19,:path20,:path21,:path22,:path23,:path24,:path25,:path26,:path27,:path28,:path29,:path30,:path31,:path32,:path33,:path34,:path35);END;";
  $stmt = ociparse($conn,$sql);
  
  //执行绑定
  OCIBindByName($stmt,":path1",$path1);
  OCIBindByName($stmt,":path2",$path2);
  OCIBindByName($stmt,":path3",$path3);
  OCIBindByName($stmt,":path4",$path4);
  OCIBindByName($stmt,":path5",$path5);
  OCIBindByName($stmt,":path6",$path6);
  OCIBindByName($stmt,":path7",$path7);
  OCIBindByName($stmt,":path8",$path8);
  OCIBindByName($stmt,":path9",$path9);
  OCIBindByName($stmt,":path10",$path10);
  OCIBindByName($stmt,":path11",$path11);
  OCIBindByName($stmt,":path12",$path12);
  OCIBindByName($stmt,":path13",$path13);
  OCIBindByName($stmt,":path14",$path14);
  OCIBindByName($stmt,":path15",$path15);
  OCIBindByName($stmt,":path16",$path16);
  OCIBindByName($stmt,":path17",$path17);
  OCIBindByName($stmt,":path18",$path18);
  OCIBindByName($stmt,":path19",$path19);
  OCIBindByName($stmt,":path20",$path20);
  OCIBindByName($stmt,":path21",$path21);
  OCIBindByName($stmt,":path22",$path22);
  OCIBindByName($stmt,":path23",$path23);
  OCIBindByName($stmt,":path24",$path24);
  OCIBindByName($stmt,":path25",$path25);
  OCIBindByName($stmt,":path26",$path26);
  OCIBindByName($stmt,":path27",$path27);
  OCIBindByName($stmt,":path28",$path28);
  OCIBindByName($stmt,":path29",$path29);
  OCIBindByName($stmt,":path30",$path30);
  OCIBindByName($stmt,":path31",$path31);
  OCIBindByName($stmt,":path32",$path32);
  OCIBindByName($stmt,":path33",$path33); 
  OCIBindByName($stmt,":path34",$path34); 
  OCIBindByName($stmt,":path35",$path35);
 
  ociexecute($stmt);
  $committed = OCICommit($conn);   // Test whether commit was successful. If error occurred, return error message
   if(!$committed){
   $error = OCIError($conn);
   echo 'Commit failed. Oracle reports: ' .$error['message'];
   }   OCIFreeStatement($stmt);
  }
}
?>

解决方案 »

  1.   

    上面的代码是一段存储过程,而下面php文件则是进行调用这个存储过程的文件,通过name绑定把参数一一传递给这个存储过程,然后把相关数据保存到数据库中。
    程序中存在借用现象(注释:当一条记录重复在程序中出现,但是在数据库中的表中只保存一次)当我在表单中输入内容后,并不能全部进行保存,是不是在程序的表单中某一条记录操作两次后就不能很顺利的调用这个存储过程了?
    是不是需要我在存储过程中过滤掉重复的记录?
    请高手们指教!
      

  2.   


    明明在compute.php中的for循环中,我var_dump($_REQUEST['dinge'.$i])这个字段的时候 ,即使拥有相同的upcode和ditem(联合主键)两条记录, 是可以分别显示出来的,
    在insert_update这个存储过程中我也进行了判断,根据表中是否含有相同的记录,进行相对应的操作(插入或是删除),但是经过保存后这种重复记录的保存却不能实现呢?
    请问这是怎么一种情况?
      

  3.   

    是不是穿过去的参数不对?
    输出一下php执行的sql结果,然后手动执行一下
      

  4.   

          $sql = "BEGIN insert_update(:path1,:path2,:path3,:path4,:path5,:path6,:path7,:path8,:path9,:path10,:path11,:path12,:path13,:path14,:path15,:path16,:path17,:path18,:path19,:path20,:path21,:path22,:path23,:path24,:path25,:path26,:path27,:path28,:path29,:path30,:path31,:path32,:path33,:path34,:path35);END;";
          $stmt = ociparse($conn,$sql);
    var_dump($sql);
    我在$stmt后面添加了var_dump($sql);
    但是显示出来的结果也只是若干个这样的字段:BEGIN insert_update(:path1,:path2,:path3,:path4,:path5,:path6,:path7,:path8,:path9,:path10,:path11,:path12,:path13,:path14,:path15,:path16,:path17,:path18,:path19,:path20,:path21,:path22,:path23,:path24,:path25,:path26,:path27,:path28,:path29,:path30,:path31,:path32,:path33,:path34,:path35);END;
    请问输出sql的时候能否让其把变量的值也都带进去进行显示呢?