Ansicht
Dokumentation

ABENNEWS-740-ABAP_SQL - NEWS-740-ABAP SQL

ABENNEWS-740-ABAP_SQL - NEWS-740-ABAP SQL

PERFORM Short Reference   Vendor Master (General Section)  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

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:

  • 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

  • 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.
  • Korrekturen für Verwendung der eingebauten Typen LCHR und LRAW des ABAP Dictionary.
  • 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 )