请问,如下错误是什么情况,是否为我的存储过程有问题?

cyxin2121921 2009-03-31 02:49:27
运行本程序的时候出现如下错误:
Warning: ociexecute(): OCIStmtExecute: ORA-06575: 程序包或函数 INSERT_UPDATE 处于无效状态 in d:\myweb\a\cost\include\compute.php on line 251
请问出现这种情况是一个什么错误,如果是存储过程的问题,请大家提示一下 该如何修改?
下面是\a\cost\include\compute.php 中调用存储过程那部分代码,
$sql="call 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."')";
$stmt = ociparse($conn,$sql);
if(!$stmt){echo "ERROR - Could not parse SQL statement."; exit;}
if(ociexecute($stmt)){ echo "<script>alert('操作成功!');</script>";
}else{
echo "<script>alert('操作失败!');</script>";
}

下面是oracle9i数据库中写的存储过程:
CREATE OR REPLACE PROCEDURE insert_update( 
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_dremark 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 varchar2, --定额
p_lldw in varchar2, --领料单位
p_dmark 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_creator in varchar2, --创建人
p_createtime in date, --创建日期
p_modified in varchar2, --修改人
p_modifytime in date, --修改日期
)
as
num number;
begin
select count(*) into num from XTDETAMSALL_DETAIL_2 WHERE UPCODE=p_upcode and DITEM=p_ditem;
if num <>0 then
update XTDETAMSALL_DETAIL_2 set XIALIAO=p_xialiao,DINGE=p_dinge,LLDW=p_lldw,DMARK=p_dmark,INVCOST=p_invcost,DINVCOST=p_dinvcost,CINVCODE=p_cinvcode,INVUNIT=p_invunit,YONGYOU=p_yongyou,CHANGERATE=p_changerate,MODIFIED=p_modified,MODIFYTIME=sysdate where UPCODE=p_upcode and DITEM=p_ditem;
--UPCODE=p_upcode,UPNAME=p_upname,DITEM=p_ditem,DCODE=p_dcode,DNAME=p_dname,DMATERIAL=p_dmaterial,DWEIGHT=p_dweight,DTWEIGHT=p_dtweight,DQUANTITY=p_dquantity,DREMARK=p_dremark,DOTHER1=p_dother1,PRODUCTDWGCODE=p_productdwgcode,G1=p_g1,G2=p_g2,G3=p_g3,G4=p_g4,G5=p_g5,G6=p_g6,G7=p_g7,G8=p_g8,G9=p_g9,XIALIAO=p_xialiao,DINGE=p_dinge,LLDW=p_lldw,DMARK=p_dmark,INVCOST=p_invcost,DINVCOST=p_dinvcost,CINVCODE=p_cinvcode,INVUNIT=p_invunit,YONGYOU=p_yongyou,MODIFIED=p_modified,MODIFYTIME=sysdate;
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,CREATOR,CREATETIME)values(p_upcode,p_upname,p_ditem,p_dcode,p_dname,p_dmaterial,p_dweight,p_dtweight,p_dquwantity,p_dremark,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_dmark,p_invcost,p_dinvcost,p_cinvcode,p_invunit,p_changerate,p_yongyou,p_creator);
end if;
commit ;
end insert_update;
...全文
198 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cyxin2121921 2009-04-08
  • 打赏
  • 举报
回复
现在本人的程序 出现了 如下错误:
Warning: ociexecute(): OCIStmtExecute: ORA-06502: PL/SQL: 数字或值错误 : 字符到数值的转换错误 ORA-06512: 在line 1 in d:\myweb\a\cost\include\compute.php on line

请问这种情况是怎么回事
网上也没有给出很好的解决方法
希望有此经历的人 能告知本人
不胜感谢
cyxin2121921 2009-04-08
  • 打赏
  • 举报
回复
是不是需要我用 类型强制转换
frederic_zhao 2009-04-08
  • 打赏
  • 举报
回复
错误提示不是些的挺清楚的嘛,你的类型不对应,直接把字符赋值给了数值。
cyxin2121921 2009-04-03
  • 打赏
  • 举报
回复
现在我遇到了这么一个情况
我再plSQL中 用xtdetail用户进行登陆的时候 是可以进行登陆的
但是 当我在oracle9i直接登陆数据库的时候 用xtdetail用户进行登录的时候 说我的权限不够
请问这是一种什么情况?
dodiphp 2009-04-03
  • 打赏
  • 举报
回复
PHP爱好者交流群:49112294
frederic_zhao 2009-04-02
  • 打赏
  • 举报
回复
对应的变量需要绑定值的,没有的话就绑定空。
cyxin2121921 2009-04-02
  • 打赏
  • 举报
回复
请问 在存储过程中的参数个数 是不是 需要跟OCIBindByName所绑定的变量的个数要一样呢?
我是在我的存储过程中 存在如下四个参数:创建人 创建日期 修改人 修改日期
创建人 和 修改人 用系统当前登陆者的信息
创建日期和修改日期用的是当前系统时间
如果是增加记录的话 创建人 被赋值 修改人此时为空 此时CREATETIME=sysdate
如果是修改记录信息的话 是 创建人信息不变 只是对修改人部分进行更新 MODIFYTIME=sysdate (此时为Oracle取时间函数,自动赋值)
但是 我这上面的调用参数中 我没有 创建日期和修改日期
并且我只传递了一个“创建人或是修改人信息” 请问 我该如何去操作呢?
因为按照楼上的进行修改后
报错为:
Warning: ociexecute(): OCIStmtExecute: ORA-01008: 并非所有变量都已关联 in d:\myweb\a\cost\include\compute.php on line 286

frederic_zhao 2009-04-02
  • 打赏
  • 举报
回复
最后的:path32帮定了四遍,而:path33、:path34、:path35都没有帮定值。
cyxin2121921 2009-04-02
  • 打赏
  • 举报
回复
下面这段代码是我调用insert_update存储过程部分
$path* 是 绑定的变量
该存储过程中使用了35个变量
详细存储过程见顶楼中SQL部分代码

仍出现如下错误情况,望高手多加指教:
ociexecute(): OCIStmtExecute: ORA-01008: 并非所有变量都已关联 in d:\myweb\a\cost\include\compute.php on line
session_start();
if($_POST['Submit']==true){

for($i=1;$i<=$_POST["jilushu"];$i++){
//设定绑定,以下用于绑定的PHP变量
$path1=$_POST['upcode'.$i];//属装图号
$path2=$_POST['upname'.$i];//属装图名
$path3=$_POST['ditem'.$i]; //键号
$path4=$_POST['dcode'.$i];//图号
$path5=$_POST['dname'.$i]; //图名
$path6=$_POST['dmaterial'.$i]; //材料
$path7=$_POST['dweight'.$i]; //单重


$path8=$_POST['sjyl'.$i]; // 设计用量-----》总重 DTWEIGHT $path7=$_POST['dtweight'.$i]; //总重
$path9=$_POST['dquantity'.$i]; //数量
$path10=$_POST['dremark'.$i]; //备注
$path11=$_POST['dother1'.$i]; //工艺分工
$path12=$_POST['dproductdwg'.$i]; //所属产品

$path13=$_POST['G1'.$i];
$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]; //下料尺寸
$path23=$_POST['dinge'.$i]; //定额
$path24=$_POST['lldw'.$i];//领料单位
$path25=$_POST['dmark'.$i];//自制/外购/标准件

$path26=$_POST['invcost'.$i];//计划价

$path27=$_POST['dxcb'.$i];//单向成本-----》其实 就是 计划总价 TINVCOST
$path28=$_POST['cinvcode'.$i];//新物料码
$path29=$_POST['dinvunit'.$i]; //计量单位
$path30=$_POST['yongyou'.$i];//用友码

$path31=$_POST['changerate'.$i];//转换率

$path32 = $_SESSION['pdmuser']; //创建人,$_SESSION['pdmuser']是系统当前登陆人员信息
$path33 = ''; //创建日期
$path34 = $_SESSION['pdmuser']; //修改人
$path35 = ''; //修改日期


$sql = "BEGIN insert_update(:path1,:path2,:path3,:path4,:path5,:path6,:path7,:path8,:path9,:path10,:path11,:path1,:path12,:path13,:path14,:path15,:path16,:path17,:path18,:path19,:path20,:path21:path1,: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,":path32",$path32);
OCIBindByName($stmt,":path32",$path33);
OCIBindByName($stmt,":path32",$path34);
OCIBindByName($stmt,":path32",$path35);

if(ociexecute($stmt)){ 这里面就是报错所在行
echo "<script>alert('操作成功!');</script>";
}else{
echo "<script>alert('操作失败!');</script>";
}
OCIFreeStatement($stmt);
}
}
dodiphp 2009-04-02
  • 打赏
  • 举报
回复
你可以到DODIPHP俱乐部提问啊,那里有技术专家保证在一个工作日解答,网址是
http://www.dodiphp.cn/bbs/forumdisplay.php?fid=13&;page=1
QQ:254596439
frederic_zhao 2009-04-01
  • 打赏
  • 举报
回复
楼主你的存储过程在Oracle里不能像调用MySQL存储过程一样。


$gConn=ocilogon("test","test");

$stmt = OCIParse($gConn,"BEGIN 存储过程(:参数);END;");
OCIBindByName($stmt,":参数",$变量,32);
OCIExecute($stmt);

OCIFreeStatement($stmt);
OCILogoff($gConn);

cyxin2121921 2009-04-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hqaht 的回复:]
把sql打印出来 在oracle里运行一下 看报错不
[/Quote]

这个过程是怎么一回事?
如何打印sql 如何在oracle中 运行呢?
是不是我只运行 update 和 insert 这两个语句呢?
rex100 2009-03-31
  • 打赏
  • 举报
回复
顶2楼
把sql打印出来 在oracle里运行一下
hqaht 2009-03-31
  • 打赏
  • 举报
回复
把sql打印出来 在oracle里运行一下 看报错不
枯桥断道 2009-03-31
  • 打赏
  • 举报
回复
存储过程有测试通过吗?
如果存储过程测试通过了应该是你的SQL这句里有问题
$sql="call 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."')";


具体没有细看。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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