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, это, скорее всего, причина для исключения.

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