oracle – ORA-01008:并非所有变量都绑定 他们有约束力
我遇到了一个Oracle问题,我迄今为止找不到原因。
下面的查询在Oracle SQL开发人员中工作,但在.NET中运行时会抛出:
我试过了: >更改lot_priority(Varchar2或int32)的Oracle数据类型。 查询和代码跟随。可变名称已被更改以保护无辜者: SELECT rf.myrow floworder,rf.stage,rf.prss,rf.pin instnum,rf.prid,r_history.rt,r_history.wt FROM ( SELECT sub2.myrow,sub2.stage,sub2.prss,sub2.pin,sub2.prid FROM ( SELECT sub.myrow,sub.stage,sub.prss,sub.pin,sub.prid,MAX(sub.target_rn) OVER (ORDER BY sub.myrow) target_row,sub.hflag FROM ( WITH floc AS ( SELECT flow.prss,flow.seq_num FROM rpf@mydblink flow WHERE flow.parent_p = :lapp AND flow.prss IN ( SELECT r_priprc.prss FROM r_priprc@mydblink r_priprc WHERE priprc = :lot_priprc ) AND rownum = 1 ) SELECT row_number() OVER (ORDER BY pp.seq_num,rpf.seq_num) myrow,rpf.stage,rpf.prss,rpf.pin,rpf.itype,hflag,CASE WHEN rpf.itype = 'SpecialValue' THEN rpf.instruction ELSE rpf.parent_p END prid,CASE WHEN rpf.prss = floc.prss AND rpf.seq_num = floc.seq_num THEN row_number() OVER (ORDER BY pp.seq_num,rpf.seq_num) END target_rn FROM floc,rpf@mydblink rpf LEFT OUTER JOIN r_priprc@mydblink pp ON (pp.prss = rpf.prss) WHERE pp.priprc = :lot_priprc ORDER BY pp.seq_num,rpf.seq_num ) sub ) sub2 WHERE sub2.myrow >= sub2.target_row AND sub2.hflag = 'true' ) rf LEFT OUTER JOIN r_history@mydblink r_history ON (r_history.lt = :lt AND r_history.pri = :lot_pri AND r_history.stage = rf.stage AND r_history.curp = rf.prid ) ORDER BY myrow public void runMyQuery(string lot_priprc,string lapp,string lt,int lot_pri) { Dictionary<int,foo> bar = new Dictionary<int,foo>(); using(var con = new OracleConnection(connStr)) { con.Open(); using(var cmd = new OracleCommand(sql.rtd_get_flow_for_lot,con)) { // Query stored in sql.resx try { cmd.BindByName = true; cmd.Prepare(); cmd.Parameters.Add(new OracleParameter("lapp",OracleDbType.Varchar2)).Value = lapp; cmd.Parameters.Add(new OracleParameter("lot_priprc",OracleDbType.Varchar2)).Value = lot_priprc; cmd.Parameters.Add(new OracleParameter("lt",OracleDbType.Varchar2)).Value = lt; // Also tried OracleDbType.Varchar2 below,and tried passing lot_pri as an integer cmd.Parameters.Add(new OracleParameter("lot_pri",OracleDbType.Int32)).Value = lot_pri.ToString(); /*********** Also tried the following,more explicit code rather than the 4 lines above: ** OracleParameter param_lapp = cmd.Parameters.Add(new OracleParameter("lapp",OracleDbType.Varchar2)); OracleParameter param_priprc = cmd.Parameters.Add(new OracleParameter("lot_priprc",OracleDbType.Varchar2)); OracleParameter param_lt = cmd.Parameters.Add(new OracleParameter("lt",OracleDbType.Varchar2)); OracleParameter param_lot_pri = cmd.Parameters.Add(new OracleParameter("lot_pri",OracleDbType.Varchar2)); param_lapp.Value = lastProcedureStackProcedureId; param_priprc.Value = lotPrimaryProcedure; param_lt.Value = lotType; param_lot_pri.Value = lotPriority.ToString(); //***************************************************************/ var reader = cmd.ExecuteReader(); while(reader.Read()) { // Get values from table (Never reached) } } catch(OracleException e) { // ORA-01008: not all variables bound } } } 为什么Oracle声称并不是所有变量都被绑定? 我发现如何运行查询没有错误,但我犹豫称之为“解决方案”,而没有真正了解潜在的原因。这更像我的实际查询的开始: -- Comment -- More comment SELECT rf.flowrow,rf.process,rf.instr instnum,rf.procedure_id,rtd_history.runtime,rtd_history.waittime FROM ( -- Comment at beginning of subquery -- These two comment lines are the problem SELECT sub2.flowrow,sub2.process,sub2.instr,sub2.pid FROM ( ... 上面的第二组评论是在子查询开始时出现的问题。删除时,执行查询。其他意见也不错 我问了一下,发现有一个同事遇到这样的问题 – 引起查询失败的评论 – 多次。有谁知道这可能是什么原因?我的理解是,DBMS对评论的第一件事是看到它们是否包含提示,如果不是,则在解析过程中删除它们。普通的评论如何不包含异常字符(只是字母和句点)会导致错误?离奇。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |