【问题标题】:How to bind by name in Oracle PRO*C如何在 Oracle PRO*C 中按名称绑定
【发布时间】:2012-05-07 10:16:15
【问题描述】:

我收到了一个包含绑定变量的查询,其中同一个绑定变量多次出现,例如:

select *
  from some_table
  where param1 = :parm1 and
        applied_date = (select min(applied_date)
                          from some_table
                          where param1 = :parm1)

当我在 sqlplus 中运行此查询时,Oracle 似乎是按名称绑定的。 IE。识别出 parm1 的第一次和第二次出现是同一个参数,并且只提示我一次 parm1 的值。 但是,当我在我的 C++ 程序中将绑定变量描述到绑定描述符中时,它总是按位置绑定。

EXEC SQL DESCRIBE BIND VARIABLES FOR my_stmt INTO myBindDesc

myBindDesc->F 的值是 2 而不是 1,在我填充之前查询不会正确执行 他们两个,即使它的价值相同。 我的问题是:有没有办法在 PRO*C 中按名称绑定?

【问题讨论】:

  • 嗯...看起来可能的解决方案可能是使用 dbms_sql.bind_variable()。可能比使用绑定描述符慢一点。

标签: c++ sql oracle select binding


【解决方案1】:

我无法确定导致此问题的原因,但您可以通过多种方式重写查询以仅使用 :VAR 一次。我希望这可以帮助你 - 如果不明白,至少解决你的问题:

SELECT *
FROM some_table tout
JOIN (
    SELECT MIN(param1) AS "param1_min", MIN(applied_date) AS "applied_date_min"
    FROM some_table
    WHERE param1 = :parm1
) taux ON (1=1
AND tout.param1 = taux.param1_min
AND tout.applied_date = taux.applied_date_min
)

【讨论】:

  • 感谢您到目前为止的回复。我只是重新表述了这个问题,清楚地表明问题是关于按位置绑定与按名称绑定。顺便提一句。不幸的是,重写查询不是一种选择。
猜你喜欢
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多