Open SQL en native SQL in SAP ABAP
⚡ Slimme samenvatting
Open SQL en Native SQL in SAP ABAP beschrijft de twee manieren waarop een ABAP-programma de database benadert. OpenSQL werkt met woordenboektabellen op een database-onafhankelijke manier, terwijl NativeSQL databasespecifieke instructies rechtstreeks naar het platform doorgeeft.

Wat zijn OpenSQL en native SQL?
Het doel van deze tutorial is niet om je iets te leren SQL of databaseconcepten, maar om je kennis te laten maken met de diversiteit van SQL in ABAP.
In de programmeertaal ABAP/4 worden twee typen SQL gebruikt.
- NATIEVE SQL
- OPEN-SQL.
Met Open SQL hebt u toegang tot de databasetabellen die zijn gedeclareerd in het ABAP-woordenboek, ongeacht het databaseplatform dat het R/3-systeem gebruikt.
Met Native SQL kunt u databasespecifieke SQL-instructies gebruiken in een ABAP/4-programma. Dit betekent dat u databasetabellen kunt gebruiken die niet door het ABAP-woordenboek worden beheerd, en daardoor gegevens kunt integreren die geen deel uitmaken van het R/3-systeem.
Open SQL bestaat uit een set ABAP-statements die bewerkingen uitvoeren op de centrale database in het R/3-systeem. De resultaten van de bewerkingen en eventuele foutmeldingen zijn onafhankelijk van het gebruikte databasesysteem. Open SQL biedt dus een uniforme syntaxis en semantiek voor alle databasesystemen die worden ondersteund door SAP. ABAP-programma's die alleen Open SQL-statements gebruiken, werken in elk R/3-systeem, ongeacht het gebruikte databasesysteem. Open SQL-statements kunnen alleen werken met databasetabellen die zijn gemaakt in het ABAP-woordenboek.
OpenSQL is in vrijwel elk programma de standaardkeuze, dus de bijbehorende commando's worden eerst behandeld.
Basis Open SQL-opdrachten
- SELECT
- INSERT
- UPDATE
- WIJZIGEN
- VERWIJDEREN
- OPEN CURSOR, OPHALEN, SLUIT CURSOR
Voorbeeld
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.
Voer de passagierslijst uit voor Lufthansa-vlucht 0400 op 28-02.1995:
Elk van deze statements rapporteert het resultaat via twee systeemvelden, die hierna worden beschreven.
Open SQL Return Codes
Alle Open SQL-instructies vullen de volgende twee systeemvelden met retourcodes.
| Systeemveld | Betekenis |
|---|---|
| SY-SUBRC | Na elke Open SQL-instructie bevat het systeemveld SY-SUBRC de waarde 0 als de bewerking is geslaagd, en een andere waarde dan 0 als dat niet het geval is. |
| SY-DBCNT | Na een Open SQL-instructie bevat het systeemveld SY-DBCNT het aantal verwerkte databaseregels. |
💡Tip: Controleer SY-SUBRC altijd direct na de instructie. Een latere ABAP-opdracht overschrijft het veld, waardoor het oorspronkelijke resultaat verloren gaat.
Wanneer een tabel zich buiten het ABAP-woordenboek bevindt, is deze niet toegankelijk via OpenSQL en neemt Native SQL het over.
Inheemse SQL
Zoals eerder vermeld, kunt u met Native SQL databasespecifieke SQL-instructies gebruiken in een ABAP-programma.
Om de Native SQL-instructie te gebruiken, moet u deze vooraf laten gaan door de EXEC SQL-instructie en deze volgen door de ENDEXEC-instructie.
Syntaxis
EXEC SQL [PERFORMING <form>]. <Native SQL statement> ENDEXEC.
Er staat geen punt na Native SQL-instructies. Bovendien introduceert het gebruik van aanhalingstekens (“) of een asterisk (*) aan het begin van een regel in een native SQL-instructie geen commentaar zoals bij de normale ABAP-syntaxis. U moet weten of de tabel- en veldnamen hoofdlettergevoelig zijn in de door u gekozen tabel databank.
Bij Native SQL-instructies worden de gegevens met behulp van hostvariabelen tussen de databasetabel en het ABAP-programma getransporteerd. Deze worden gedeclareerd in het ABAP-programma en in de Native SQL-instructie voorafgegaan door een dubbele punt (:). U kunt elementaire structuren als gastheervariabelen gebruiken. In uitzonderlijke gevallen worden structuren in een INTO-clausule behandeld alsof al hun velden afzonderlijk worden vermeld.
Net als in Open SQL bevat SY-DBCNT na de ENDEXEC-instructie het aantal verwerkte regels. In bijna alle gevallen bevat SY-SUBRC de waarde 0 na de ENDEXEC-instructie.
⚠️ Waarschuwing: Native SQL omzeilt de SAP Tabelbuffer en de automatische clientafhandeling van OpenSQL. Het clientveld moet door het programma worden aangeleverd en de instructie wordt alleen uitgevoerd op het databaseplatform waarvoor deze is geschreven.
OpenSQL versus native SQL: belangrijkste verschillen
Beide interfaces hebben toegang tot dezelfde database, maar ze verschillen in portabiliteit, buffering en de objecten die ze kunnen benaderen. De onderstaande tabel vat de praktische verschillen samen.
| criteria | SQL openen | Inheemse SQL |
|---|---|---|
| Tabellen behandeld | Alleen tabellen die in het ABAP-woordenboek zijn gedeclareerd. | Elke tabel in de database, inclusief tabellen buiten het woordenboek. |
| Draagbaar | Werkt op elke database die wordt ondersteund door SAP | Gekoppeld aan de syntaxis van één databaseplatform. |
| Syntaxis | ABAP-instructies met een afsluitende periode | Oorspronkelijke instructies ingesloten in EXEC SQL … ENDEXEC, zonder afsluitende punt. |
| De overdracht van gegevens | Werkgebieden en interne tabellen via INTO | Gastheervariabelen voorafgegaan door een dubbele punt |
| Clientafhandeling en buffering | Automatische clientafhandeling en tabelbuffering | Geen automatische clientafhandeling, en de SAP De buffer wordt omzeild. |
| Typisch gebruik | Dagelijkse toegang tot R/3-applicatiegegevens | Integratie van gegevens die geen deel uitmaken van het R/3-systeem. |
OpenSQL is daarom de standaard, en de onderstaande regels zorgen ervoor dat het snel blijft.
Open SQL – Prestatieregels
Om de prestaties van de SQL en op zijn beurt van het ABAP-programma te verbeteren, moet men rekening houden met de volgende regels:
Houd de resultatenset klein
- Met behulp van de Where-clausule
- Als er slechts één record uit de database nodig is, gebruik dan waar mogelijk SELECT SINGLE.
Minimaliseer de hoeveelheid overgedragen gegevens
- Beperk het aantal regels
- Als alleen bepaalde velden uit een tabel vereist zijn, gebruikt u de SELECT INTO … verklaring
- Beperk het aantal kolommen
- Gebruik aggregatiefuncties
Minimaliseer het aantal gegevensoverdrachten
- Vermijd geneste selectielussen
- Een alternatieve optie is om de instructie SELECT .. FOR ALL ENTRIES te gebruiken. Deze instructie kan vaak een stuk efficiënter zijn dan het uitvoeren van een groot aantal SELECT- of SELECT SINGLE-instructies tijdens een LOOP van een interne tabel.
- Gebruik woordenboekweergaven
- Gebruik joins in de FROM-clausule
- Gebruik subquery's in de Where-clausule
Minimaliseer de zoekoverhead
- Gebruik indexvelden in de Where-clausule
- Zorg er bij het benaderen van databases altijd voor dat de juiste index wordt gebruikt.
Verminder de databasebelasting
- Bufferen
- Logische databases
- Vermijd herhaalde databasetoegang
Interne tabellen gebruiken om Buffer Archief
- Om te voorkomen dat dezelfde SELECT-query meerdere keren wordt uitgevoerd (en dus dubbele SELECT-resultaten oplevert), is een interne tafel Het type HASHED kan worden gebruikt om de prestaties te verbeteren.
