Åpne SQL & Native SQL i SAP ABAP
⚡ Smart oppsummering
Åpne SQL og Native SQL i SAP ABAP beskriver de to måtene et ABAP-program når databasen på. Open SQL fungerer på ordbokstabeller på en databaseuavhengig måte, mens Native SQL sender databasespesifikke setninger rett gjennom til plattformen.

Hva er Open SQL og Native SQL?
Målet med denne opplæringen er ikke å lære deg SQL eller databasekonsepter, men for å introdusere deg for SQL-mangfoldet i ABAP
I programmeringsspråket ABAP/4 er det to typer SQL som brukes.
- NATIVE SQL
- ÅPNE SQL.
Open SQL lar deg få tilgang til databasetabellene som er deklarert i ABAP-ordboken uavhengig av databaseplattformen som R/3-systemet bruker.
Native SQL lar deg bruke databasespesifikke SQL-setninger i et ABAP/4-program. Dette betyr at du kan bruke databasetabeller som ikke administreres av ABAP-ordboken, og derfor integrere data som ikke er en del av R/3-systemet.
Open SQL består av et sett med ABAP-setninger som utfører operasjoner på den sentrale databasen i R/3-systemet. Resultatene av operasjonene og eventuelle feilmeldinger er uavhengige av databasesystemet som er i bruk. Open SQL gir dermed en enhetlig syntaks og semantikk for alle databasesystemene som støttes av SAP. ABAP-programmer som kun bruker Open SQL-setninger vil fungere i alle R/3-systemer, uavhengig av databasesystemet som er i bruk. Åpne SQL-setninger kan bare fungere med databasetabeller som er opprettet i ABAP-ordboken.
Open SQL er standardvalget i nesten alle programmer, så kommandosettet dekkes først.
Grunnleggende åpne SQL-kommandoer
- VELG
- INSERT
- OPPDATERING
- MODIFISER
- SLETT
- ÅPNE MARKØR, HENT, LUKK MARKØR
Eksempel
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.
Send ut passasjerlisten for Lufthansa flight 0400 28.-02.1995:
Hver av disse utsagnene rapporterer resultatet sitt gjennom to systemfelt, som beskrives nedenfor.
Åpne SQL-retur Codes
Alle Open SQL-setninger fyller de følgende to systemfeltene med returkoder.
| Systemfelt | Betydning |
|---|---|
| SY-SUBRC | Etter hver Open SQL-setning inneholder systemfeltet SY-SUBRC verdien 0 hvis operasjonen var vellykket, en annen verdi enn 0 hvis ikke. |
| SY-DBCNT | Etter en åpen SQL-setning inneholder systemfeltet SY-DBCNT antallet databaselinjer som er behandlet. |
💡 Tips: Sjekk alltid SY-SUBRC rett etter kommandoen. En senere ABAP-kommando overskriver feltet, og det opprinnelige resultatet går tapt.
Når en tabell ligger utenfor ABAP-ordboken, kan ikke Open SQL nå den, og Native SQL tar over.
Innfødt SQL
Som allerede nevnt lar Native SQL deg bruke databasespesifikke SQL-setninger i en ABAP-program.
For å bruke Native SQL-setningen må du gå foran den med EXEC SQL-setningen, og følge den med ENDEXEC-setningen.
syntax
EXEC SQL [PERFORMING <form>]. <Native SQL statement> ENDEXEC.
Det er ingen punktum etter Native SQL-setninger. Videre, bruk av inverterte kommaer (“) eller en stjerne (*) på begynnelsen av en linje i en naturlig SQL-setning introduserer ikke en kommentar slik den ville gjort i normal ABAP-syntaks. Du må vite om tabell- og feltnavn skiller mellom store og små bokstaver i det du har valgt database.
I Native SQL-setninger transporteres dataene mellom databasetabellen og ABAP-programmet ved hjelp av vertsvariabler. Disse er deklarert i ABAP-programmet, og innledes med et kolon (:) i Native SQL-setningen. Du kan bruke elementære strukturer som vertsvariabler. Unntaksvis behandles strukturer i en INTO-klausul som om alle feltene deres var oppført individuelt.
Som i Open SQL, etter ENDEXEC-setningen, inneholder SY-DBCNT antall behandlede linjer. I nesten alle tilfeller inneholder SY-SUBRC verdien 0 etter ENDEXEC-setningen.
⚠️ Advarsel: Native SQL omgår SAP tabellbuffer og automatisk klienthåndtering av Open SQL. Klientfeltet må leveres av programmet, og setningen kjører bare på databaseplattformen den ble skrevet for.
Åpen SQL vs. Native SQL: Viktige forskjeller
Begge grensesnittene når den samme databasen, men de er forskjellige i portabilitet, bufring og objektene de kan adressere. Tabellen nedenfor oppsummerer de praktiske forskjellene.
| Kriterier | Åpne SQL | Innfødt SQL |
|---|---|---|
| Adresserte tabeller | Kun tabeller deklarert i ABAP-ordboken | Enhver tabell i databasen, inkludert tabeller utenfor ordboken |
| Portabilitet | Kjører på alle databaser som støttes av SAP | Knyttet til syntaksen til én databaseplattform |
| syntax | ABAP-utskrifter med en avslutningsperiode | Native setninger omsluttet i EXEC SQL … ENDEXEC, uten avslutningspunkt |
| Dataoverføring | Arbeidsområder og interne bord gjennom INTO | Vertsvariabler etterfulgt av et kolon |
| Klienthåndtering og bufring | Automatisk klienthåndtering og tabellbuffering | Ingen automatisk klienthåndtering, og SAP bufferen blir omgått |
| Typisk bruk | Daglig tilgang til R/3-applikasjonsdata | Integrering av data som ikke er en del av R/3-systemet |
Open SQL er derfor standard, og reglene nedenfor holder det raskt.
Åpen SQL – ytelsesregler
For å forbedre ytelsen til SQL og i sin tur til ABAP-programmet, bør man ta vare på følgende regler-
Hold resultatsettet lite
- Bruker hvor-klausulen
- Hvis bare én post er nødvendig fra databasen, bruk SELECT SINGLE når det er mulig .
Minimer mengden data som overføres
- Begrens antall linjer
- Hvis bare visse felt kreves fra en tabell, bruk SELECT INTO … uttalelse
- Begrens antall kolonner
- Bruk aggregerte funksjoner
Minimer antall dataoverføringer
- Unngå nestede utvalgsløkker
- Et alternativ er å bruke SELECT .. FOR ALL ENTRIES-setningen. Denne setningen kan ofte være mye mer effektiv enn å utføre et stort antall SELECT- eller SELECT SINGLE-setninger under en LOOP i en intern tabell.
- Bruk ordbokvisninger
- Bruk Joins i FROM-klausulen
- Bruk underspørringer i where-leddet
Minimer søkeoverheaden
- Bruk indeksfelt i where-leddet
- Når du får tilgang til databaser, sørg alltid for at riktig indeks brukes.
Reduser databasebelastningen
- Buffering
- Logiske databaser
- Unngå gjentatt databasetilgang
Bruke interne tabeller til Buffer Records
- For å unngå å utføre samme SELECT flere ganger (og dermed ha dupliserte SELECT-er), en innvendig bord av typen HASHED kan brukes til å forbedre ytelsen.
