Отворете SQL & Native SQL в SAP ABAP
⚡ Умно обобщение
Отворен SQL и Native SQL в SAP ABAP описва двата начина, по които ABAP програмата достига до базата данни. Open SQL работи с речникови таблици по начин, независим от базата данни, докато Native SQL предава специфични за базата данни оператори директно към платформата.

Какво представляват Open SQL и Native SQL?
Целта на този урок не е да ви учи SQL или концепции за бази данни, а за да ви запозная с SQL разнообразието в ABAP
В езика за програмиране ABAP/4 се използват два вида SQL.
- НАТИВЕН SQL
- ОТВОРЕТЕ SQL.
Open SQL ви позволява достъп до таблиците на базата данни, декларирани в ABAP речника, независимо от платформата на базата данни, която системата R/3 използва.
Native SQL ви позволява да използвате специфични за базата данни SQL изрази в програма ABAP/4. Това означава, че можете да използвате таблици на база данни, които не се администрират от ABAP речник, и следователно да интегрирате данни, които не са част от системата R/3.
Open SQL се състои от набор от ABAP изрази, които извършват операции в централната база данни в системата R/3. Резултатите от операциите и всички съобщения за грешка са независими от използваната система от бази данни. По този начин Open SQL предоставя единен синтаксис и семантика за всички системи за бази данни, поддържани от SAP. ABAP програмите, които използват само Open SQL изрази, ще работят във всяка R/3 система, независимо от използваната система от бази данни. Open SQL операторите могат да работят само с таблици на база данни, които са създадени в ABAP речника.
Open SQL е изборът по подразбиране в почти всяка програма, така че неговият набор от команди е разгледан първо.
Основни Open SQL команди
- МАРКИРАЙ
- INSERT
- АКТУАЛИЗАЦИЯ
- МОДИФИЦИРАЙТЕ
- ИЗТРИЙ
- ОТВОРЕТЕ КУРСОРА, ИЗВЛЕЧЕТЕ, ЗАТВОРЕТЕ КУРСОРА
Пример
TABLES SBOOK. DATA C TYPE CURSOR, WA LIKE SBOOK. OPEN CURSOR C FOR SELECT * FROM SBOOK WHERE CARRID = 'LH ' AND CONNID = '0400' AND FLDATE = '19950228' ORDER BY PRIMARY KEY. DO. FETCH NEXT CURSOR C INTO WA. IF SY-SUBRC <> 0. CLOSE CURSOR C. EXIT. ENDIF. WRITE: / WA-BOOKID, WA-CUSTOMID, WA-CUSTTYPE, WA-SMOKER, WA-LUGGWEIGHT, WA-WUNIT, WA-INVOICE. ENDDO.
Изведете списъка на пътниците за полет 0400 на Lufthansa на 28-02.1995:
Всяко едно от тези твърдения докладва резултата си чрез две системни полета, описани по-долу.
Отваряне на SQL Return Codes
Всички оператори на Open SQL попълват следните две системни полета с кодове за връщане.
| Системно поле | Значение |
|---|---|
| SY-SUBRC | След всеки оператор Open SQL системното поле SY-SUBRC съдържа стойност 0, ако операцията е била успешна, стойност, различна от 0, ако не. |
| SY-DBCNT | След оператор Open SQL, системното поле SY-DBCNT съдържа броя на обработените редове на базата данни. |
💡 Съвет: Винаги проверявайте SY-SUBRC веднага след оператора. По-късна ABAP команда презаписва полето и оригиналният резултат се губи.
Когато дадена таблица се намира извън ABAP речника, Open SQL не може да я достигне и Native SQL поема контрола.
Роден SQL
Както вече споменахме, Native SQL ви позволява да използвате специфични за базата данни SQL изрази в an ABAP програма.
За да използвате оператора Native SQL, трябва да го предшествате с израза EXEC SQL и да го последвате от оператора ENDEXEC.
Синтаксис
EXEC SQL [PERFORMING <form>]. <Native SQL statement> ENDEXEC.
Няма точка след Native SQL оператори. Освен това, използването на обърнати запетаи (“) или звездичка (*) в началото на ред в естествен SQL оператор не въвежда коментар, както би било в нормалния ABAP синтаксис. Трябва да знаете дали имената на таблици и полета са чувствителни към малки и големи букви в избраното от вас база данни.
В операторите на Native SQL данните се транспортират между таблицата на базата данни и програмата ABAP с помощта на хост променливи. Те се декларират в програмата ABAP и се предхождат от двоеточие (:) в оператора Native SQL. Можете да използвате елементарни структури като хост променливи. По изключение структурите в клауза INTO се третират така, сякаш всички техни полета са изброени поотделно.
Както в Open SQL, след оператора ENDEXEC, SY-DBCNT съдържа броя на обработените редове. В почти всички случаи SY-SUBRC съдържа стойността 0 след израза ENDEXEC.
⚠️ Предупреждение: Native SQL заобикаля SAP буфер на таблицата и автоматичната обработка на Open SQL от клиента. Полето client трябва да бъде предоставено от програмата и операторът се изпълнява само на платформата на базата данни, за която е написан.
Open SQL срещу Native SQL: Ключови разлики
И двата интерфейса достигат до една и съща база данни, но се различават по преносимост, буфериране и обекти, които могат да адресират. Таблицата по-долу обобщава практическите разлики.
| Критерии | Отворете SQL | Роден SQL |
|---|---|---|
| Адресирани таблици | Само таблици, декларирани в ABAP речника | Всяка таблица от базата данни, включително таблици извън речника |
| Преносимост | Работи на всяка база данни, поддържана от SAP | Обвързан със синтаксиса на една платформа за бази данни |
| Синтаксис | ABAP отчети с период на затваряне | Нативни оператори, затворени в EXEC SQL … ENDEXEC, без затваряща точка |
| Трансфер на данни | Работни зони и вътрешни таблици чрез INTO | Променливи на хоста, предшествани от двоеточие |
| Обработка и буфериране на клиенти | Автоматична обработка на клиенти и буфериране на таблици | Няма автоматична обработка на клиенти и SAP буферът е заобиколен |
| Типична употреба | Ежедневен достъп до данни от R/3 приложения | Интегриране на данни, които не са част от R/3 системата |
Следователно Open SQL е по подразбиране, а правилата по-долу го поддържат бърз.
Open SQL – Правила за ефективност
За да подобрите производителността на SQL и от своя страна на програмата ABAP, трябва да се погрижите за следните правила-
Поддържайте набора от резултати малък
- Използване на клаузата where
- Ако се изисква само един запис от базата данни, използвайте SELECT SINGLE, когато е възможно.
Минимизирайте количеството прехвърлени данни
- Ограничете броя на редовете
- Ако се изискват само определени полета от таблица, използвайте SELECT INTO … изявление
- Ограничете броя на колоните
- Използвайте агрегатни функции
Минимизирайте броя на трансферите на данни
- Избягвайте вложени цикли за избиране
- Алтернативна опция е да използвате израза SELECT .. FOR ALL ENTRIES. Този оператор често може да бъде много по-ефективен от изпълнението на голям брой оператори SELECT или SELECT SINGLE по време на LOOP на вътрешна таблица.
- Използвайте речникови изгледи
- Използвайте Joins в клаузата FROM
- Използвайте подзаявки в клаузата where
Минимизиране на излишните разходи за търсене
- Използвайте индексни полета в клаузата where
- Когато осъществявате достъп до бази данни, винаги се уверявайте, че се използва правилният индекс.
Намалете натоварването на базата данни
- BufferING
- Логически бази данни
- Избягвайте повтарящ се достъп до база данни
Използване на вътрешни таблици за Buffer Records
- За да се избегне многократното изпълнение на един и същ SELECT (и следователно дублиране на селекции), вътрешна маса от тип HASHED може да се използва за подобряване на производителността.
