ABAP собственный SQL-курсор - PullRequest
1 голос
/ 14 июня 2010

Я пытаюсь написать собственный 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 Ответ

3 голосов
/ 14 июня 2010

Правило 1: не используйте собственный SQL.

Правило 2: не используйте собственный SQL.

Правило 3: не используйте собственный SQL.

...

Правило n: не используйте собственный SQL.

Правило n + 1: Серьезно, не используйте.

Правило n + 2: Если выдействительно, помните, что вам придется указывать клиента вручную.

Правило n + 3: Не используйте SELECT * в собственном SQL, всегда выбирайте поля конкретно по имени.Причина: Вы не можете ПОЛУЧИТЬ ... В СООТВЕТСТВУЮЩИЕ ПОЛЯ, но должны позаботиться о том, чтобы последовательность, число и типы данных целевых полей совпадали.Если ваша таблица / BI0 / TCUSTOMER состоит не только из двух полей, типизированных как / BI0 / OICUSTOMER и RSTXTMD, это, скорее всего, причина для исключения.

...