Использование переменных 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;

Хотя теперь выясняется, что мне нужно будет обернуть все в хранимую процедуру, чтобы на самом деле вернуть строки.

Другие вопросы по тегам