oracle not in一个变量,oracle – ORA-01008:并非所有变量都绑定 他们有约束力

本文探讨了一个在Oracle数据库查询中遇到的ORA-01008错误,并详细记录了作者为解决此问题所尝试的各种方法,包括调整数据类型、更改绑定变量方式等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我遇到了一个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声称并不是所有变量都被绑定?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值