ABAP: использование табличных подсказок SQL Server в блоке Native SQL - PullRequest
1 голос
/ 04 ноября 2010

У меня есть класс ABAP с различными методами для чтения / записи в удаленный экземпляр Microsoft SQL Server 2005.

Все работает как положено. Теперь мне порекомендовали добавить подсказку таблицы SQL Server (READPAST) в запрос SELECT по соображениям безопасности (это должна быть мера против тупиков - я далеко не эксперт по SQL).

К сожалению, я не могу заставить это работать. Это мой блок Native SQL, и как он работает:

EXEC SQL.
  OPEN ritc FOR
    SELECT FIELD1,
           FIELD2,
           FIELD3,
           FROM MY_TABLE
           WHERE FIELD1 <= :lv_variable1
             AND FIELD3 =  :c_constant
ENDEXEC.

Если я пытаюсь добавить WITH(READPAST) сразу после FROM MY_TABLE, я получаю эту ошибку: Вы можете указать блокировку READPAST только в уровнях изоляции READ COMMITTED или REPEATABLE READ .

Достаточно справедливо: я попытался добавить эту команду прямо перед строкой OPEN ritc:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Это вызывает другую ошибку: при первой команде FETCH после этого блока я получаю сообщение об ошибке, в котором говорится, что курсор ritc существует, и он уже открыт.

На данный момент я даже не уверен, что могу добавить табличные подсказки в блок Native SQL?

Есть предложения? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2010

Я думаю, что SET нужно сделать после ОТКРЫТИЯ.

EXEC SQL.
  OPEN ritc FOR
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    SELECT FIELD1,
           FIELD2,
           FIELD3,
           FROM MY_TABLE WITH (READPAST)
           WHERE FIELD1 <= :lv_variable1
             AND FIELD3 =  :c_constant
ENDEXEC.
0 голосов
/ 04 ноября 2010

Может быть, вам нужен оператор BEGIN TRANSACTION?

(вам также нужен оператор END TRANSACTION в другом блоке ABAP.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...