Использование переменных PL/SQL в OCI приводит к ошибке "ORA-01008: не все переменные связаны"
Следующий (сильно надуманный и упрощенный) пример прекрасно работает в SQLDeveloper, но приводит к ошибке ORA-01008 при запуске через OCI.
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;
2 ответа
Когда вы используете :CURRENT_LINE_ID NUMBER
, OCI
ищет эту переменную связывания только в вашей хост-программе. Вот C++
, Таким образом, вы должны были объявить эту переменную в вашей программе на C++ в exec declare section
или где это должно быть. Когда вы запускаете что-нибудь в SQL developer
, когда встретил :variable
, он слепо предлагает пользователю ввести значение для него, так что не путайте его с тем, как он это делает, и oci libraries
Работа.
В вашем случае, наконец, когда PL/SQL
используется и переменная объявлена там, вы всегда можете обратиться к ней без colon
, Если вы хотите связать его с хост-программой, вы должны объявить его как host variable
, PRO*C
поддерживает это. не уверен насчет C++. Pro* C не что иное, как embedded sql
в C
предоставлено oracle
,
Ответ Махесварана заставил меня искать host variable
, что привело меня к ответу: я был в одиночку от успеха.
DECLARE
CURRENT_LINE_ID NUMBER := 120;
targetVar NUMBER;
begin
SELECT 1 INTO targetVar FROM DUAL WHERE 120 = CURRENT_LINE_ID;
end;
Хотя теперь выясняется, что мне нужно будет обернуть все в хранимую процедуру, чтобы на самом деле вернуть строки.