我遇到了一个Oracle问题,我迄今为止找不到原因。
下面的查询在Oracle sql开发人员中工作,但在.NET中运行时会抛出:
ORA-01008: not all variables bound
我试过了:
>更改lot_priority(Varchar2或int32)的Oracle数据类型。
>更改lot_priority(string或int)的.NET数据类型。
>一个绑定变量名在查询中使用两次。这不是我的问题
在多个使用相同的绑定变量的其他查询
位置,但只是为了确保我尝试做二次它的
自己的变量具有不同的名称,并分别绑定。
>几种不同的绑定变量的方法(见注释的代码;
还有其他)。
>移动bindByName()调用。
>用文字替换每个绑定变量。我有两个单独的变量导致问题(:lot_pri和:lot_priprc)。两者之间我记不住有一些微小的变化。更改为文字使查询工作,但他们确实需要使用绑定。
查询和代码跟随。可变名称已被更改以保护无辜者:
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 bar = new Dictionary();
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声称并不是所有变量都被绑定?