以下(高度设计和简化的)示例在 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 中满足绑定(bind)变量吗?
我尝试过substitution variables有一点(在 SQL Developer 中同样有效),但 DEFINE 在 OCI 中似乎完全无效。
DEFINE MYSUBST = 120;
DECLARE
TARGETVAR NUMBER;
BEGIN
SELECT 1 INTO TARGETVAR FROM DUAL WHERE 120 = &MYSUBST;
END;
最佳答案
当您使用 :CURRENT_LINE_ID NUMBER
时,OCI
仅在主机程序中查找该绑定(bind)变量。这里是C++
。因此,您应该在 C++ 程序的 exec 声明部分或任何应该在的位置声明此变量。当您在SQL Developer
中运行任何内容时,当遇到:variable
时,它会盲目地提示用户输入它的值,因此不要将其与它的方式混淆并且 oci 库
可以工作。
最后,在您的情况下,当使用 PL/SQL
并在那里声明变量时,您始终可以在不使用 冒号
的情况下引用它。如果您想从主机程序绑定(bind)它,您可以将其声明为主机变量
。 PRO*C
支持这一点。不确定c++。 pro*c只不过是oracle
提供的C
中的嵌入式sql
。
关于oracle - 在 OCI 中使用 PL/SQL 变量会导致 "ORA-01008: not all variables bound"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20694572/