ABAP собственный SQL-курсор
Я пытаюсь написать собственный SQL в abap, но у меня возникли некоторые проблемы.
Вот мой код:
method GET_SOMEDATA.
DATA: lt_table TYPE TABLE OF /BI0/TCUSTOMER,
c1 TYPE /BI0/TCUSTOMER.
DATA: BEGIN OF wa,
customer TYPE /BI0/OICUSTOMER,
txtsh TYPE RSTXTSH,
txtmd TYPE RSTXTMD,
txtlg TYPE RSTXTLG,
END OF wa.
EXEC SQL.
OPEN c1 FOR
SELECT * FROM /BI0/TCUSTOMER
WHERE customer LIKE '229'.
ENDEXEC.
DO.
EXEC SQL.
FETCH NEXT c1 INTO :wa-customer, :wa-txtmd
* ERROR: CX_SY_NATIVE_SQL_ERROR
ENDEXEC.
IF sy-subrc = 0.
* <process data>
ENDIF.
ENDDO.
EXEC SQL.
CLOSE c1
ENDEXEC.
endmethod.
После вызова "FETCH NEXT c1 INTO:wa-customer,:wa-txtmd" я получаю "CX_SY_NATIVE_SQL_ERROR" - я догадываюсь, что с моим курсором что-то не так - но я понятия не имею. Некоторая помощь будет отличной.
1 ответ
Правило 1: не используйте собственный SQL.
Правило 2: не используйте собственный SQL.
Правило 3: не используйте собственный SQL.
...
Правило n: не используйте собственный SQL.
Правило n+1: Серьезно, не надо.
Правило n+2: Если вам действительно нужно, помните, что вам нужно будет указать клиента вручную.
Правило n+3: не используйте SELECT * в собственном SQL, всегда выбирайте поля конкретно по имени. Причина: Вы не можете ПОЛУЧИТЬ... В СООТВЕТСТВУЮЩИЕ ПОЛЯ, но должны позаботиться о том, чтобы последовательность, число и типы данных целевых полей совпадали. Если ваша таблица /BI0/TCUSTOMER состоит не только из двух полей, типизированных как /BI0/OICUSTOMER и RSTXTMD, это, скорее всего, причина для исключения.