Ansicht
Dokumentation
ABENNEWS-740-ABAP_SQL - NEWS-740-ABAP SQL
PERFORM Short Reference Vendor Master (General Section)Diese Dokumentation steht unter dem Copyright der SAP AG.
zu Release 7.40, SP02
Optimierung der Tabellenpufferung
- Die Tabellenpufferung wurde dahingehend optimiert, dass bei statischer Angabe der Datenbanktabelle jetzt auch deren Sekundärindizes beim Auslesen von Daten aus dem Tabellenpuffer berücksichtigt werden, wenn die generische Pufferung oder die vollständige Pufferung eingeschaltet sind.
- Bei Verwendung von SELECT mit FOR ALL ENTRIES wird die
Tabellenpufferung jetzt auch beim Zugriff auf eine Tabelle mit Einzelsatzpufferung verwendet und nicht mehr umgangen.
Ergebnistyp der Aggregatfunktion COUNT( * )
Für den Fall, dass die Aggregatfunktion COUNT( *
) bzw. COUNT(*) als einziges
Element der SELECT-Liste und ohne GROUP BY-Klausel angegeben ist, wurde der interne Datentyp
des Ergebnisses auf INT8 erweitert. Falls der Wertebereich ausgenutzt werden soll, muss hinter INTO
ein Zielobjekt mit Datentyp p oder decfloat34 verwendet werden. Das Systemfeld sy-dbcnt wird bei Ergebnissen außerhalb seines Wertebereichs auf den Wert -1 gesetzt.
Nachkommastellen in der INTO-Klausel
Die Zuweisungsregeln der INTO-Klausel
der Anweisung SELECT wurden so geändert,
dass überzählige Nachkommastellen bei der Zuweisung von Zahlen an Zielfelder mit zu wenigen
Nachkommastellen jetzt immer abgeschnitten werden. Vorher konnte abhängig von der Datenbank und von der Tabellenpufferung auch gerundet werden.
Bedingungen bei äußeren Joins
Die frühere Einschränkung, dass in der ON-Bedingung von
äußeren Joins nur Vergleiche auf Gleichheit ( =, EQ) möglich sind, entfällt.
Erweiterungen bei Sortierung nach Primärschlüssel
Bei Verwendung des Zusatzes PRIMARY KEY hinter ORDER BY wurden folgende Einschränkungen aufgehoben:
- Die Mandantenspalte muss bei der Angabe einzelner Spalten in der SELECT-Liste nicht mehr explizit aufgeführt werden, wenn der Zusatz DISTINCT verwendet wird.
- Hinter FROM kann jetzt auch statisch eine View angegeben werden, wenn diese weniger Schlüsselfelder als View-Felder enthält.
- Der Zusatz PRIMARY KEY kann jetzt auch dynamisch angegeben werden.
Behandlung von Strings
Folgende, bislang undokumentierte, Beschränkungen wurden aufgehoben:
- Vor Release 7.40, SP02 war kein Zugriff mit DISTINCT * auf Datenbanktabellen möglich, die kurze Strings vom Typ SSTRING enthalten.
- Vor Release 7.40, SP02 konnte beim Lesen aller Spalten mit * in der SELECT-Liste
bei einem dynamisch angegebenen Join hinter FROM
nicht auf Datenbanktabellen mit kurzen oder langen Strings der Datentypen SSTRING, STRING oder RAWSTRING zugegriffen werden.
Feldsymbole und Datenreferenzvariablen in SELECT-Schleifen
Wenn in einer SELECT-Schleife hinter INTO
Feldsymbole oder dereferenzierte Referenzvariablen für den Arbeitsbereich, einzelne Datenobjekte
oder interne Tabellen angegeben sind, wird ab Release 7.40, SP02 genau einmal beim Eintritt in die Schleife
bestimmt, auf welches Datenobjekt ein Feldsymbol oder eine Referenzvariable zeigt. Dieses Datenobjekt
wird bei jedem Schleifendurchgang als Zielbereich verwendet. Eine Änderung der Zuordnung eines
Feldsymbols oder einer Referenzvariable innerhalb der Schleife hat darauf keine Auswirkung. Vor Release
7.40, SP02 wurde die Zuordnung eines Feldsymbols oder einer Referenzvariable für jeden Schleifendurchgang neu bestimmt und es wurde das jeweils aktuelle Datenobjekt als Zielbereich verwendet.
Angabe dynamischer Tokens
Ab Release 7.40, SP02 können als dynamische Tokens der Anweisung SELECT
angegebene interne Tabellen auch Sekundärschlüssel haben.
Strengere Überprüfung von Syntaxregeln
Zu Release 7.40, SP02 wurde ein neuer SQL-Parser für eingeführt. Dieser Parser überprüft einige Regeln strenger als der alte Parser. Insbesondere wird jetzt auch der gleiche Parser für statisch angegebenes und für den Inhalt dynamischer Tokens verwendet. Dieser Parser wird zu Release 7.40, SP02 vorerst nur für die Anweisung SELECT eingesetzt. Als Konsequenz daraus führen jetzt folgende Syntaxkonstrukte, die schon immer fehlerhaft waren, zu Syntax- oder Laufzeitfehlern:
- Allgemeine Korrekturen
- Ab Release 7.40, SP02 muss der Inhalt des Operanden n der Zusätze UP TO n ROWS und PACKAGE SIZE der Anweisung SELECT den Regeln einer verlustfreien Zuweisung für den Datentyp i genügen.
- Vor Release 7.40, SP02 wurde für den Operator IN range_tab einer WHERE-Bedingung statisch nicht in jedem Fall überprüft, ob die Spalten LOW und HIGH der Ranges-Tabelle range_tab in den Datentyp der Datenbankspalte konvertierbar sind, und es kam bei nicht konvertierbaren Spalten zu keinem Laufzeitfehler, wenn die Ranges-Tabelle leer war. Jetzt findet immer eine statische Überprüfung statt und es kommt bei nicht konvertierbaren Spalten immer zu einer Ausnahme.
- Beispiel
- Ab Release 7.40, SP02 Syntaxfehler für:
-
DATA: range_tab TYPE RANGE OF t,
itab TYPE TABLE OF sflight.
SELECT *
FROM sflight
INTO TABLE itab
WHERE fldate IN range_tab.
- Vor Release 7.40, SP02 konnten in einer WHERE-Bedingung mehrere Operatoren NOT direkt hintereinander stehen. Da eine gerade oder ungerade Anzahl von hintereinanderstehenden NOT gleichbedeutend zu keinem NOT bzw. einem Operator NOT ist, wird die überflüssige Angabe von NOT jetzt verboten.
- Beispiel
- Ab Release 7.40, SP02 Syntaxfehler für:
-
SELECT SINGLE *
FROM spfli
INTO wa WHERE
NOT NOT carrid = 'LH'.
- Vor Release 7.40, SP02 konnte bei der Verwendung von mit AS definierten Aliasnamen oder von Joins in ON- und WHERE-Bedingungen auf die Mandantenspalte zugegriffen werden, ohne dass die implizite Mandantenbehandlung mit CLIENT SPECIFIED abgeschaltet wurde. In diesem Fall ist die Ergebnismenge immer leer, wenn die explizite Mandantenangabe nicht den aktuellen Mandanten enthält. Seit Release 7.40, SP02 führt dies zu einer Warnung von der Syntaxprüfung.
- Beispiel
- Ab Release 7.40, SP02 Syntaxwarnungen für:
-
SELECT *
FROM scarr AS carriers
INTO TABLE itab
WHERE carriers~mandt = '...'.
-
und
SELECT *
FROM scarr
INNER JOIN spfli
on scarr~mandt = spfli~mandt
INTO CORRESPONDING FIELDS OF TABLE itab
WHERE scarr~mandt = '...'.
- Für Pool- und Cluster-Tabellen kann der Zusatz GROUP BY nicht angegeben werden. Vor Release 7.40, SP02 konnte hinter GROUP BY noch eine dynamische Spaltenangabe gemacht werden, was aber immer zu einer Ausnahme führte. Ab Release 7.40, SP02 führt die dynamische Angabe einer GROUP BY-Klausel bei Pool- und Cluster-Tabellen zu einer Syntaxwarnung, die in einem kommenden SP in einen Syntaxfehler verschärft wird.
- Beispiel
- Ab Release 7.40, SP02 Syntaxwarnung bzw. -fehler für:
-
SELECT id object langu typ
FROM doktl
INTO TABLE itab
GROUP BY (`ID OBJECT LANGU TYP`).
- Korrekturen für dynamische Tokens
- Vor Release 7.40, SP02 konnte in den dynamischen Tokens beliebiger -Anweisungen an bestimmten Stellen ein einzelner Punkt (.) aufgeführt sein, der bei Auswertung des Tokens zur Laufzeit ignoriert wurde. Ab Release 7.40, SP02 führt ein solcher Punkt zur Ausnahme der Klasse CX_SY_DYNAMIC_OSQL_SYNTAX.
- Beispiel
- Ab Release 7.40, SP02 Ausnahme für:
-
SELECT *
FROM (`SPFLI .`)
INTO TABLE itab
WHERE (`. CARRID = 'LH'`).
- Vor Release 7.40, SP02 konnte bei einer dynamischen Angabe column_syntax in der SELECT-Liste der Spalten hinter SELECT ein Aliasname mehrmals vergeben werden, obwohl dies statisch nicht erlaubt ist. Ab Release 7.40, SP02 führt dies zu einer Ausnahme der Klasse CX_SY_DYNAMIC_OSQL_SEMANTICS.
- Beispiel
- Ab Release 7.40, SP02 Ausnahme für:
-
SELECT SINGLE ('carrid AS col carrname AS col')
FROM scarr
INTO CORRESPONDING FIELDS OF wa
WHERE carrid = 'LH'.
- Vor Release 7.40, SP02 konnte bei einer dynamischen Angabe der Aggregatfunktion COUNT( DISTINCT col ) der statisch vorgeschriebene Zusatz DISTINCT weggelassen werden und es wurden alle Zeilen der Ergebnismenge gezählt. Ab Release 7.40, SP02 führt das Weglassen von DISTINCT zur Ausnahme der Klasse CX_SY_DYNAMIC_OSQL_SYNTAX.
- Beispiel
-
Ab Release 7.40, SP02 Ausnahme für:
SELECT ('COUNT( carrid )')
FROM spfli
INTO count.
ENDSELECT.
- Vor Release 7.40, SP02 konnte in einer dynamischen WHERE-Bedingung fälschlicherweise ein NOT direkt vor einen Vergleichsoperator geschrieben werden, was im statischen Fall nicht möglich ist. Ab Release 7.40, SP02 führt eine solche Angabe zur Ausnahme CX_SY_DYNAMIC_OSQL_SYNTAX.
- Beispiel
- Ab Release 7.40, SP02 Ausnahme für:
-
SELECT SINGLE *
FROM spfli
INTO wa
WHERE (`carrid NOT = 'LH'`).
- Vor Release 7.40, SP02 konnte in einer dynamischen FROM-Klausel zusammen mit dem Zusatz ORDER BY PRIMARY KEY fälschlicherweise auf DDIC-Projektions-Views zugegriffen werden, die genauso viele Schlüssel- wie View-Felder enthalten, was im statischen Fall nicht möglich ist. Ab Release 7.40, SP02 führt eine solche Angabe zur Ausnahme CX_SY_DYNAMIC_OSQL_SEMANTICS.
- Beispiel
- Ab Release 7.40, SP02 Ausnahme, wenn projection_view genauso viele Schlüssel- wie View-Felder hat.
-
DATA itab TYPE TABLE OF projection_view.
SELECT *
FROM ('KELLERH_VIEW')
INTO TABLE itab
ORDER BY PRIMARY KEY.
- Korrekturen für Aggregatfunktion count( * )
- Wie für alle Aggregatfunktionen muss bei count( * ) bzw. count(*)das Zielfeld passend gewählt werden und es darf bei der Zuweisung des Ergebnisses zu keinen Werteverlusten kommen. Vor Release 7.40, SP02 wurde dies nicht überprüft und die Zuweisung erfolgte nach den Konvertierungsregeln, die bei einem Werteverlust nicht immer zu einer Ausnahme führen. Ab Release 7.40, SP02 muss das Zielfeld numerisch sein und ein Werteverlust führt immer zu einer Ausnahme.
- Beispiel
- Ab Release 7.40, SP02 Syntaxwarnung und Ausnahme, wenn der Wert nicht in das Zielfeld passt, für:
-
DATA cnt TYPE c LENGTH 1.
SELECT COUNT(*)
FROM scarr
INTO cnt.
- Bei der Angabe einzelner Spalten oder von Aggregatausdrücken in der SELECT-Liste muss in der Regel ein expliziter Arbeitsbereich angegeben werden und die obsolete Kurzform ist nicht möglich. Die einzige Ausnahme ist die Angabe von nichts als count( * ) wenn für diese kein Aliasname und wenn keine GROUP BY-Klausel angegeben ist. Vor Release 7.40 , SP02 führte die Kurzform mit count( * ) mit Angabe eines Aliasnamens oder einer GROUP BY-Klausel bereits zu einem Laufzeitfehler. Ab Release 7.40, SP02 kommt es falls statisch erkennbar auch zu einem Syntaxfehler.
- Beispiel
- Ab Release 7.40, SP02 Syntaxfehler für:
-
TABLES scarr.
SELECT COUNT( * ) AS cnt
FROM scarr.
SELECT count( * )
FROM scarr
GROUP BY carrid.
...
ENDSELECT.
- Spalten der Typen LCHR und LRAW dürfen nicht in relationalen Ausdrücken von SQL-Bedingungen verwendet werden. Vor Release 7.40, SP02 führte dies bereits zu einem Laufzeitfehler. Ab Release 7.40, SP02 kommt es falls statisch erkennbar auch zu einem Syntaxfehler.
- Beispiel
- Ab Release 7.40, SP02 Syntaxfehler für:
-
SELECT SINGLE *
FROM indx
INTO wa
WHERE clustd = '...'.
- Spalten der Typen LCHR und LRAW dürfen nicht mit SELECT gelesen werden, wenn der Zusatz DISTINCT angegeben ist. Vor Release 7.40, SP02 führte dies bereits zu einem Laufzeitfehler. Ab Release 7.40, SP02 kommt es falls statisch erkennbar auch zu einem Syntaxfehler.
- Beispiel
- Ab Release 7.40, SP02 Syntaxfehler für:
-
SELECT DISTINCT *
FROM indx
INTO TABLE itab.
- Spalten der Typen LCHR und LRAW dürfen mit SELECT nur gemeinsam mit den zugehörigen Längenfeldern gelesen werden. Vor Release 7.40, SP02 führte das Lesen ohne Längenfelder bereits zu einer Syntaxwarnung. Ab Release 7.40, SP02 kommt es in diesem Fall immer zu einem Laufzeitfehler.
- Beispiel
- Ab Release 7.40, SP02 Laufzeitfehler für:
-
SELECT clustd
FROM indx
INTO TABLE itab.
- Korrekturen für FOR ALL ENTRIES
- Bei der Verwendung von FOR ALL ENTRIES vor einer WHERE-Bedingung einer SELECT-Anweisung muss in mindestens einem Vergleich eine Spalte der internen Tabelle angegeben sein, wobei der Vergleich auch in einer Subquery aufgeführt sein kann. Vor Release 7.40, SP02 wurde dies bei der Angabe einer Subquery nicht überprüft. Ab Release 7.40, SP02 muss der Vergleich auch bei Angabe einer Subquery aufgeführt sein (statisch oder dynamisch).
- Beispiel
- Ab Release 7.40, SP02 Syntaxfehler für:
-
SELECT carrid connid fldate
FROM sflight
INTO CORRESPONDING FIELDS OF TABLE rtab
FOR ALL ENTRIES IN itab
WHERE EXISTS ( SELECT * FROM sflight ).
- Bei der Verwendung von FOR ALL ENTRIES vor einer WHERE-Bedingung einer SELECT-Anweisung dürfen in der SELECT-Liste keine Datenbankfelder der eingebauten Typen STRING und RAWSTRING sowie LCHR und LRAW vorkommen, da der implizite Zusatz DISTINCT dann nicht an das Datenbanksystem übergeben werden kann. Ab Release 7.40, SP02 kommt es zu einer Syntaxwarnung der erweiterten Programmprüfung, die durch ein Pragma ausgeblendet werden kann.
- Beispiel
- Ab Release 7.40, SP02 Pragma nötig für:
-
SELECT *
FROM snwd_bpa
INTO TABLE bupas
FOR ALL ENTRIES IN orders
WHERE node_key = orders-buyer_guid
##select_fae_with_lob[web_address].
- Bei der Verwendung von FOR ALL ENTRIES vor einer WHERE-Bedingung einer SELECT-Anweisung darf im Zielbereich kein LOB-Handle erzeugt werden, da das Ergebnis ansonsten undefiniert ist. Vor Release 7.40, SP02 wurde dies für Lokatoren weder statisch noch zur Laufzeit richtig erkannt. Ab Release 7.40, SP02 kommt es zu einem Syntaxfehler bzw. zu einer Ausnahme.
- Beispiel
- Ab Release 7.40, SP02 Syntaxfehler für:
-
SELECT picture
FROM demo_blob_table
INTO wa-picture
FOR ALL ENTRIES IN name_tab
WHERE name = name_tab-table_line.
ENDSELECT.
- Der Zusatz FOR ALL ENTRIES soll nicht zusammen mit dem Zusatz GROUP BY verwendet werden. Der Zusatz GROUP BY hat zusammen mit FOR ALL ENTRIES keine Wirkung. Seit Release 7.40, SP02 führt dies zu einer Warnung von der Syntaxprüfung.
- Beispiel
- Ab Release 7.40, SP02 Syntaxwarnung für:
-
SELECT COUNT( * )
FROM spfli
INTO cnt
FOR ALL ENTRIES IN carriers
WHERE carrid = carriers-table_line
GROUP BY carrid.
- Korrekturen für ORDER BY
- Vor Release 7.40, SP02 konnte zwischen einer dynamischen Spaltenangabe hinter ORDER BY und dem abschließenden Punkt einer SELECT-Anweisung beliebiger Text aufgeführt werden, der bei Ausführung der Anweisung ignoriert wurde. Vor Release 7.40, SP02 führte ein solcher Text zu einer Syntaxwarnung, ab Release 7.40, SP02 führt er zu einem Syntaxfehler.
- Beispiel
- Ab Release 7.40, SP02 Syntaxwarnung für:
-
SELECT *
FROM scarr
INTO TABLE itab
ORDER BY (`CARRID`) carrname and other crap.
- Wenn der Zusatz ORDER BY zusammen mit FOR ALL ENTRIES angegeben ist, müssen alle Spalten des Primärschlüssels eingelesen werden, da das Ergebnis ansonsten undefiniert ist. Ab Release 7.40, SP02 kommt es in einem solchen Fall falls statisch erkennbar zu einer Syntaxwarnung und zur Laufzeit immer zu einer Ausnahme.
- Beispiel
- Ab Release 7.40, SP02 Syntaxwarnung bzw. Ausnahme für:
-
SELECT carrid connid
FROM sflight
INTO CORRESPONDING FIELDS OF TABLE rtab
FOR ALL ENTRIES IN itab
WHERE carrid = itab-carrid AND
connid = itab-connid
ORDER BY PRIMARY KEY.
- Wenn hinter SELECT Aggregatfunktionen angegeben sind, müssen alle Spalten, die hinter ORDER BY aufgeführt sind und kein Aliasname für eine Aggregatfunktion sind, auch hinter SELECT und hinter GROUP BY angegeben sein. Vor Release 7.40, SP02 wurde dies zur Laufzeit nur unzureichend überprüft und das Verhalten war plattformabhängig. Ab Release 7.40, SP02 kommt es bei einem Verstoß gegen diese Regel immer zu einer Ausnahme der Klasse CX_SY_DYNAMIC_OSQL_SEMANTICS.
- Beispiel
- Ab Release 7.40, SP02 Ausnahme CX_SY_DYNAMIC_OSQL_SEMANTICS für:
-
SELECT COUNT( * )
FROM spfli
INTO (cnt)
GROUP BY ('CARRID')
ORDER BY ('CARRID').
...
ENDSELECT.
- Ein Aliasname in der SELECT-Liste darf nicht der Name einer Spalte sein, der kein Aliasname zugeordnet ist. Dies führte bereits vor Release 7.40, SP02 bei der Verwendung eines solchen Namens hinter ORDER BY zu einer Ausnahme. Ab Release 7.40, SP02 kommt es falls statisch erkennbar auch zu einem Syntaxfehler.
- Beispiel
- Ab Release 7.40, SP02 Syntaxfehler für:
-
SELECT carrid connid AS carrid
FROM spfli
INTO TABLE itab
ORDER BY carrid.
Vendor Master (General Section) Vendor Master (General Section)
Diese Dokumentation steht unter dem Copyright der SAP AG.
Length: 30267 Date: 20240523 Time: 110437 sap01-206 ( 293 ms )