Åbn SQL & Native SQL i SAP ABAP
Målet med denne tutorial er ikke at lære dig SQL eller databasekoncepter, men for at introducere dig til SQL-diversiteten i ABAP
I programmeringssproget ABAP/4 er der to typer SQL, der bruges.
- NATIVE SQL
- ÅBN SQL.
Open SQL giver dig adgang til databasetabellerne, der er erklæret i ABAP-ordbogen, uanset hvilken databaseplatform R/3-systemet bruger.
Native SQL giver dig mulighed for at bruge databasespecifikke SQL-sætninger i et ABAP/4-program. Det betyder, at du kan bruge databasetabeller, der ikke administreres af ABAP-ordbogen, og derfor integrere data, der ikke er en del af R/3-systemet.
Open SQL består af et sæt ABAP-sætninger, der udfører operationer på den centrale database i R/3-systemet. Resultaterne af operationerne og eventuelle fejlmeddelelser er uafhængige af det databasesystem, der er i brug. Open SQL giver således en ensartet syntaks og semantik for alle de databasesystemer, der understøttes af SAP. ABAP-programmer, der kun bruger Open SQL-sætninger, vil fungere i ethvert R/3-system, uanset hvilket databasesystem der er i brug. Åbne SQL-sætninger kan kun fungere med databasetabeller, der er blevet oprettet i ABAP-ordbogen.
Grundlæggende åbne SQL-kommandoer
- SELECT
- INSERT
- OPDATER
- MODIFICERE
- SLET
- ÅBN MARKØR, HENT, LUK 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.
Udskriv passagerlisten for Lufthansa flight 0400 den 28-02.1995:
Åbn SQL-returkoder
Alle Open SQL-sætninger udfylder følgende to systemfelter med returkoder.
SY-SUBRC
Efter hver Open SQL-sætning indeholder systemfeltet SY-SUBRC værdien 0, hvis operationen var vellykket, en anden værdi end 0, hvis ikke.
SY-DBCNT
Efter en Open SQL-sætning indeholder systemfeltet SY-DBCNT antallet af behandlede databaselinjer.
Indfødt SQL
Som allerede nævnt giver Native SQL dig mulighed for at bruge databasespecifikke SQL-sætninger i en ABAP program.
For at bruge Native SQL-sætning skal du foran den med EXEC SQL-sætningen og følge den med ENDEXEC-sætningen.
Syntaks
EXEC SQL [PERFORMING <form>]. <Native SQL statement> ENDEXEC.
Der er ingen punktum efter Native SQL-sætninger. Desuden introducerer brug af inverterede kommaer (“) eller en stjerne (*) i begyndelsen af en linje i en indbygget SQL-sætning ikke en kommentar, som det ville i normal ABAP-syntaks. Du skal vide, om tabel- og feltnavne er store og små bogstaver i din valgte database.
I Native SQL-sætninger transporteres data mellem databasetabellen og ABAP-programmet ved hjælp af værtsvariabler. Disse er deklareret i ABAP-programmet og foranstillet i Native SQL-sætningen af et kolon (:). Du kan bruge elementære strukturer som værtsvariable. Undtagelsesvis behandles strukturer i en INTO-klausul, som om alle deres felter var opført individuelt.
Som i Open SQL, efter ENDEXEC-sætningen, indeholder SY-DBCNT antallet af behandlede linjer. I næsten alle tilfælde indeholder SY-SUBRC værdien 0 efter ENDEXEC-sætningen.
Åben SQL – præstationsregler
For at forbedre ydelsen af SQL og til gengæld ABAP-programmet, bør man tage sig af følgende regler-
Hold resultatsættet lille
- Bruger hvor-klausulen
- Hvis der kun kræves én post fra databasen, skal du bruge SELECT SINGLE, når det er muligt.
Minimer mængden af overførte data
- Begræns antallet af linjer
- Hvis kun bestemte felter er nødvendige fra en tabel, skal du bruge SELECT INTO … erklæring
- Begræns antallet af kolonner
- Brug aggregerede funktioner
Minimer antallet af dataoverførsler
- Undgå indlejrede udvalgsløkker
- En alternativ mulighed er at bruge SELECT .. FOR ALL ENTRIES-sætningen. Denne sætning kan ofte være meget mere effektiv end at udføre et stort antal SELECT- eller SELECT SINGLE-sætninger under en LOOP i en intern tabel.
- Brug ordbogsvisninger
- Brug Joins i FROM-klausulen
- Brug underforespørgsler i where-sætningen
Minimer Search Overhead
- Brug indeksfelter i where-sætningen
- Når du tilgår databaser, skal du altid sikre dig, at det korrekte indeks bliver brugt.
Reducer databasebelastningen
- BufferING
- Logiske databaser
- Undgå gentagen databaseadgang
Brug af interne tabeller til Buffer Records
- For at undgå at udføre den samme SELECT flere gange (og derfor have duplikatvalg), kan en intern tabel af typen HASHED bruges til at forbedre ydeevnen.