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

前端之家收集整理的这篇文章主要介绍了oracle – ORA-01008:并非所有变量都绑定 他们有约束力前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我遇到了一个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<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 ( ...

上面的第二组评论是在子查询开始时出现的问题。删除时,执行查询。其他意见也不错
这不是一些流氓或缺少换行符的问题,导致以下行被注释,因为以下行是一个SELECT。缺少的选择将产生与“不是所有变量绑定”不同的错误

我问了一下,发现有一个同事遇到这样的问题 – 引起查询失败的评论 – 多次。有谁知道这可能是什么原因?我的理解是,DBMS对评论的第一件事是看到它们是否包含提示,如果不是,则在解析过程中删除它们。普通的评论如何不包含异常字符(只是字母和句点)会导致错误?离奇。

猜你在找的Oracle相关文章