2

以下(高度人为和简化的)示例在 SQLDeveloper 中运行良好,但在通过 OCI 运行时会导致 ORA-01008 错误。

declare
  CURRENT_LINE_ID NUMBER := 120;
  TARGETVAR NUMBER;
begin
  SELECT 1 INTO TARGETVAR FROM DUAL WHERE 120 = :CURRENT_LINE_ID;
end;

有什么方法可以重组它,以便在 OCI 中满足绑定变量?

我尝试了一些替换变量(再次在 SQL Developer 中工作),但 DEFINE 在 OCI 中似乎完全无效。

DEFINE MYSUBST = 120;
DECLARE
  TARGETVAR NUMBER;
BEGIN
  SELECT 1 INTO TARGETVAR FROM DUAL WHERE 120 = &MYSUBST;
END;
4

2 回答 2

4

当您使用:CURRENT_LINE_ID NUMBER时,OCI仅在您的主机程序中查找该绑定变量。在这里C++。所以你应该在你的c++程序中声明这个变量,exec declare section或者它应该在的任何地方。当你在 中运行任何东西时SQL developer,当遇到 a 时:variable,它会盲目地提示用户输入它的值,所以不要将它与它的工作方式和oci libraries工作混为一谈。

最后,在您的情况下,当PL/SQL使用 a 并在那里声明变量时,您始终可以在没有colon. 如果你想从宿主程序绑定它,你已经将它声明为host variable. PRO*C支持这一点。不确定C++。pro*c 只不过embedded sqlCoracle.

于 2013-12-20T04:40:25.623 回答
0

Maheswaran 的回答让我搜索host variable,这让我得到了答案:我离成功只有一个冒号

DECLARE
  CURRENT_LINE_ID NUMBER := 120;
  targetVar NUMBER;
begin
  SELECT 1 INTO targetVar FROM DUAL WHERE 120 = CURRENT_LINE_ID;
end;

尽管现在事实证明我必须将所有内容包装在存储过程中才能真正取回行。

于 2013-12-20T17:18:45.700 回答