6.4 Grundlegende Syntaxelemente

Im folgenden werden die Syntaxelemente beschrieben, die von mehreren SQL-Anweisungen verwendet werden und damit globalen Charakter haben. Wenn auf diese Elemente in der Syntaxbeschreibung Bezug genommen wird, sind diese kursiv aufgeführt. Die hier aufgeführten Syntaxbestandteile können im wesentlichen auch in der Procedure Language (PL) verwendet werden. Die Elemente, die nicht oder anders in Routinen verwendet werden können bzw. müssen, sind mit SQL hinter dem Syntaxelement gekennzeichnet, während die Elemente, die nur innerhalb von Routinen verwendet werden können, mit PL gekennzeichnet sind.

Literale



literal ::=
	string-literal
	| integer-literal
	| floating-literal
	| datetime-literal
	| interval-literal


string-literal ::= ' character [ ... ] '

Wird die Shellvariable YARDSTRING gesetzt, kann eine Stringkonstante auch mit doppelten Anführungszeichen gekennzeichnet werden.



character ::= ASCII 8 Bit Zeichen, außer ASCII 0


integer-literal ::= [ + | - ] unsigned-integer-literal


unsigned-integer-literal ::= digit [ ... ]


digit ::= { 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 }


floating-literal ::= [ + | - ] unsigned-floating-literal


unsigned-floating-literal ::= 
	unsigned-integer-literal [ . unsigned-integer-literal ] [ { E | e } integer-literal ]

Bei DATETIME und INTERVAL Literalen wird der eigentliche Wert als Stringkonstante angegeben. Der String muß dabei den allgemeinen Aufbau 'YYYY-MM-DD HH:MM:SS.FFFFFF' haben, bzw. abhängig vom jeweiligen Typ entsprechend weniger Felder. Der Datumsbereich kann auch im durch die NLS Datei bzw. die Shellvariable YARDDATE bestimmten Format angegeben werden.

datetime-literal ::= 
	{ DATE | TIME | TIMESTAMP } string-literal


interval-literal ::= 
	INTERVAL [ + | - ] string-literal interval-qualifier

interval-qualifier ::=
	DAY [ interval-precision ]
	| DAY [ interval-precision ] TO HOUR
	| DAY [ interval-precision ] TO MINUTE
	| DAY [ interval-precision ] TO SECOND [ second-precision ]
	| HOUR [ interval-precision ]
	| HOUR [ interval-precision ] TO MINUTE
	| HOUR [ interval-precision ] TO SECOND [ second-precision ]
	| MINUTE [ interval-precision ]
	| MINUTE [ interval-precision ] TO SECOND [ second-precision ]
	| SECOND [ ( unsigned-integer-literal ] [ , unsigned-integer-literal ] ) ]
	| YEAR [ interval-precision ]
	| MONTH [ interval-precision ]
	| YEAR [ interval-precision ] TO MONTH

interval-precision ::=
	( unsigned-integer-literal )

second-precision ::=
	( unsigned-integer-literal )


Variablen, Werte und dynamische Parameter

Hostvariablen (host-variable-construct) können nur in einem ESQLC-Programm verwendet werden. Prozedurvariablen (variable-name) können nur in SQL- und PL-Anweisungen innerhalb von Routinen verwendet werden. Dynamische Parameter können auch in der Procedure Language (PL) verwendet werden.

Hostvariablen



host-variable-construct ::=
host-variable [ indicator-variable ]


host-variable ::= : host-identifier


indicator-variable ::= { : host-identifier | INDICATOR host-identifier }


host-identifier ::= gültiger C Identifier mit der Maximallänge 100

Ein host-identifier muß in einer DECLARE SECTION deklariert werden und kann die folgenden C und ESQLC Datentypen haben.

C Datentypen:

ESQLC Datentypen: Zur Deklaration von Hostvariablen siehe auch Kapitel 3, Hostvariablen, im YARD-ESQLC Benutzer- und Referenzhandbuch.
char-variable ::= { Hostvariable vom C Typ char
| Hostvariable vom ESQLC Typ varchar, string oder fixchar }


integer-variable ::= Hostvariable vom C Typ short, int oder long


float-variable ::= Hostvariable vom C Typ float oder double


decimal-variable ::= Hostvariable vom ESQLC Typ struct decimal bzw. decimal_t


blob-variable ::= Hostvariable vom ESQLC Typ struct blob bzw. blob_t oder BLOB

Prozedurvariablen



variable-name ::= identifier


char-variable ::= Variable vom SQL Typ CHAR oder VARCHAR

integer-variable ::= Variable vom SQL Typ INTEGER oder SMALLINT

float-variable ::= Variable vom SQL Typ FLOAT oder REAL

decimal-variable ::= Variable vom SQL Typ DECIMAL oder MONEY

Werte



char-value ::= { char-variable | string-literal }


integer-value ::= { integer-variable | integer-literal }


float-value ::= { float-variable | floating-literal }


decimal-value ::= { decimal-variable | floating-literal }

Dynamische Parameter

Dynamische Parameter sind Platzhalter für Werte in dynamisch definierten SQL-Anweisungen (PREPARE), wobei die eigentlichen Werte beim OPEN oder EXECUTE übergeben werden. Dynamische Parameter können somit nur in einer PREPARE Anweisung verwendet werden.



dynamic-parameter ::= ?

Identifier

Ein Identifier darf, soweit nicht explizit anders angegeben, maximal 18 Zeichen lang sein.



identifier ::= { regular-identifier | delimited-identifier }


regular-identifier ::= { a-zA-Z }[ _a-zA-Z0-9 ]...


delimited-identifier ::= "ASCII 8 Bit Zeichen [ ... ]"

Wird die Shellvariable YARDSTRING gesetzt, können keine Delimited Identifier verwendet werden. Doppelte Anführungszeichen dienen dann der Kennzeichnung von Stringkonstanten. Ein doppeltes Anführungszeichen muß durch ein weiteres doppeltes Anführungszeichen ausmaskiert werden. Das Zeichen ASCII 0 kann nicht verwendet werden.



qualified-name ::= [ schema-name. ] identifier


schema-name ::= { string-literal | regular-identifier }


synonym-name ::= qualified-name


table-name ::= qualified-name


trigger-name ::= qualified-name


routine-name ::= qualified-name


constraint-name ::= qualified-name


domain-name ::= qualified-name


index-name ::= qualified-name


savepoint-name ::= qualified-name


routine-source ::= { char-value | blob-variable }


column-name ::= identifier


column-name-list ::= column-name [ , ... ]


correlation-name ::= identifier


cursor-name ::= { identifier | char-variable }


database-name ::= { identifier | char-value }

Ein database-name darf maximal 10 Zeichen lang sein.



filename ::= char-value


descriptor-name ::= char-value


statement-id ::= { identifier | char-variable }


user-name ::= { identifier | char-value }

Ein user-name darf maximal 14 Zeichen lang sein. Bei der Verwendung von user-name in einer CONNECT Anweisung gilt die Besonderheit, daß führende und abschließende Leerzeichen entfernt werden.



password ::= char-value


user-authorization-identifier ::= identifier


dbspace-name ::= regular-identifier

Ein dbspace-name darf maximal 10 Zeichen lang sein.

SQL-Datentypen

Die von YARD-SQL unterstützen Datentypen können in den folgenden SQL-Anweisungen verwendet werden:



data-type ::=
	CHAR [ (n) ]
	| CHARACTER [ (n) ]
	| VARCHAR [ (n) ]
	| SMALLINT
	| INTEGER
	| INT
	| SERIAL [ (s) ]SQL
	| SMALLFLOAT
	| REAL
	| FLOAT
	| DOUBLE PRECISION
	| DECIMAL [ ( m , [ n ] ) ]
	| DEC [ ( m , [ n ] ) ]
	| NUMERIC [ ( m , [ n ] ) ]
	| MONEY [ ( m , [ n ] ) ]
	| DATE
	| TIME [ ( m ) ]
	| TIMESTAMP [ ( m ) ]
	| INTERVAL interval-qualifier
	| BLOBSQL
	| TEXTSQL

CHAR [ (n) ]
Zeichenkette der festen Länge n zur Speicherung aller Zeichen innerhalb eines 8-bit Zeichensatzes (jedoch nicht das 0-Byte). Die Maximallänge beträgt 32767. CHAR Spalten, die länger als 255 Zeichen sind, können nicht indiziert werden, da dies die Maximallänge eines Index ist. Wird keine Länge angegeben, ist die Länge 1. Ein Wert, der in eine Spalte vom Typ CHAR eingefügt wird, wird bis auf die definierte Länge n mit Leerzeichen aufgefüllt, sofern die Länge des Wertes kleiner ist, als die definierte Länge.

CHARACTER [ (n) ]
Ist ein Synonym für CHAR.

VARCHAR (n)
Variabel lange Zeichenkette mit der Maximallänge n zur Speicherung aller Zeichen eines 8-bit Zeichensatzes (jedoch nicht das 0-Byte). Die Maximallänge einer VARCHAR Spalte darf 255 nicht überschreiten. Anders als beim CHAR Datentyp, wird ein Wert nicht bis auf die definierte Länge n mit Leerzeichen aufgefüllt.

SMALLINT
Integerwert mit dem Wertebereich -32767 bis 32767

INTEGER
Integerwert mit dem Wertebereich -2147483647 bis 2147483647

INT
Ist ein Synonym für INTEGER

SERIAL [ (s) ]
Integerwert mit demselben Wertebereich wie INTEGER. Wird beim Einfügen eines neuen Satzes für eine Spalte dieses Typs der Wert 0 verwendet, so vergibt der Datenbankserver automatisch einen bisher für diese Tabelle noch nicht vergebenen Wert. Dieser Wert ist dabei immer um eins größer als der zuletzt vergebene Wert. Wird beim Einfügen ein anderer Wert als 0 verwendet, wird der interne Serialwert auf diesen Wert gesetzt, wenn er größer als der bisherige Serialwert ist. Eine SERIAL Spalte darf keine NULL Werte enthalten. Über s kann ein Startwert für den SERIAL Wert angegeben werden. Die Voreinstellung für den Startwert ist 1.

SMALLFLOAT
Fließkommazahl mit dem Wertebereich -1E38 bis +1E38 zur Speicherung wissenschaftlicher Werte.

REAL
Ist ein Synonym für SMALLFLOAT.

FLOAT
Fließkommazahl mit dem Wertebereich -1E76 bis +1E76 zur Speicherung wissenschaftlicher Werte.

DOUBLE PRECISION
Ist ein Synonym für FLOAT.

DECIMAL [ ( m , [ n ] ) ]
Numerischer Wert mit m Stellen zur Speicherung kaufmännischer Werte. Ein DECIMAL Wert kann bis zu 32 Stellen (m) und dabei 0 bis 31 Nachkommastellen (n) haben. Der Dezimalpunkt wird bei der Längendefinition nicht mitgezählt. Wird keine Länge angegeben, wird 16 verwendet. Werden Nachkommastellen angegeben, wird der Wert als Festkommazahl behandelt, ansonsten als Fließkommazahl.

DEC
Ist ein Synonym für DECIMAL.

NUMERIC
Ist ein Synonym für DECIMAL.

MONEY [ ( m [ , n ] ) ]
Festkommazahl mit m Stellen zur Speicherung von Geldbeträgen. Ein MONEY Wert kann bis zu 32 Stellen und dabei 0 bis 31 Nachkommastellen (n) haben. Der Dezimalpunkt wird bei der Längendefinition nicht mitgezählt. Die Standardeinstellung für die Länge ist 16 sowie 2 für die Nachkommastellen. Die Darstellung von MONEY Werten wird über die Angabe in der durch die Shellvariable YARDNLS bestimmten Definitionsdatei (Feld MONEY) bestimmt. Über die Shellvariable YARDMONEY kann darüber hinaus das Währungsformat individuell festgelegt werden. So führt die Angabe von '% DM' für YARDMONEY beispielsweise bei einem Wert von 34,89 zu '34,89 DM', während die Angabe von '$ %' zu '$ 34,89' führt.

DATE
Datumfeld für Tage vom 01.01.0001 bis zum 31.12.9999. Intern wird ein Datum als INTEGER Wert gespeichert, und zwar als Anzahl Tage seit dem 31.12.1899. Ein Datumswert kann sowohl als Integerzahl als auch als Zeichenkette angegeben werden. Bei der Angabe von Zeichenketten muß das in der durch die Shellvariable YARDNLS bestimmten Definitionsdatei beschriebene Datumsformat verwendet werden. Zusätzlich kann jeder Benutzer sein Datumsformat über die Shellvariable YARDDATE festlegen, wodurch die Definition aus der NLS-Datei überschrieben wird.
Wird eine Jahreszahl als zweistellige Zahl angegeben, werden Zahlen kleiner 40 als Jahre nach 2000, und Zahlen größer gleich 40 als Jahre vor 2000 interpretiert. So wird eine Angabe von 12 z.B. als Jahr 2012 und eine Angabe von 63 als 1963 interpretiert. Um Mißverständnisse zu vermeiden, sollte die Jahreszahl immer vierstellig angegeben werden. Die Angabe von Jahren vor 1940 muß generell vierstellig erfolgen.

Unabhängig von der Einstellung des Datumsformat kann immer die ANSI Schreibweise YYYY-MM-DD verwendet werden. Die Angabe des Jahres muß dabei immer vierstellig erfolgen.

TIME [ (n) ]
Vers. 4.5 Ein TIME Feld speichert eine Uhrzeit im Bereich von 00:00:00 bis 23:23:59. Optional kann eine Anzahl Nachkommastellen zur Speicherung von Sekundenbruchteilen angegeben werden. Wird keine angegeben, gilt der Default von 0 Stellen.

TIMESTAMP [ (n) ]
Vers. 4.5 Ein TIMESTAMP Feld ist eine Komination aus DATE und TIME und dient zur Speicherung von Zeitpunkten. Genauso wie bei TIME kann die Anzahl Nachkommastellen definiert werden, bei TIMESTAMP gilt jedoch ein Default von 6.
Das folgende Beispiel zeigt, wie DATE/TIME/TIMESTAMP Spalten definiert werden können:
create table dt (
	col10 date,
	col11 time,
	col12 timestamp(0),
	col13 time(2),
	col14 timestamp(4),
	col15 time,
	col16 timestamp
);

INTERVAL
Vers. 4.5 Ein INTERVAL Feld wird zur Speicherung von Zeiträumen verwendet und besteht je nach konkreter Definition aus den Einzelfeldern YEAR, MONTH, DAY, HOUR, MINUTE und SECOND. Es gibt zwei Klassen von INTERVALs. Die eine, year-month INTERVALs, bestehen aus den Feldern YEAR und MONTH, wobei nicht unbedingt beide erforderlich sind. Die andere Klasse, day-time INTERVALs, besteht aus den übrigen Feldern.
Das folgende Beispiel zeigt, wie INTERVAL Spalten definiert werden können:
create table ival (
	col20 interval day,
	col21 interval day to hour,
	col22 interval day to minute,
	col23 interval day to second(0),
	col24 interval day to second(2),
	col25 interval hour,
	col26 interval hour(3) to minute,
	col27 interval hour to second(0),
	col28 interval hour to second(2),
	col29 interval minute,
	col30 interval minute(4) to second(0),
	col31 interval minute to second,
	col32 interval month,
	col33 interval second(2,0),
	col34 interval second(2,2),
	col35 interval year(1),
	col36 interval year to month,
	col37 interval second
);

BLOB
Spezieller Datentyp zur Speicherung von binären Daten bis zu einer Größe von 2 GB. Im Gegensatz zu den anderen Datentypen werden Werte vom Typ BLOB nicht im Datensatz, sondern direkt in dem Dbspace gespeichert, wo sich die Tabelle befindet. In der CREATE TABLE Anweisung kann für eine BLOB Spalte auch ein anderes Dbspace angegeben werden. Der Datensatz selbst enthält nur einen Verweis auf diesen Festplattenbereich.

TEXT
Der Datentyp TEXT entspricht zunächst dem Datentyp BLOB. Es ist jedoch möglich, über die NLS-Datei eine Menge gültiger Zeichen in einer Spalte vom Typ TEXT zu definieren. Standardmäßig sind alle 256 Zeichen des ASCII Codes zulässig.

Search Conditions

Zum Thema Search Conditions siehe auch Kapitel 3, Abschnitt Search Conditions.



search-condition ::=
	boolean-term [ OR search-condition ]

	boolean-term ::= boolean-factor [ AND boolean-term ]

	boolean-factor ::= [ NOT ] boolean-primary

	boolean-primary ::= predicate | ( search-condition )


predicate ::=
	comparison-predicate
	| between-predicate
	| in-predicate
	| like-predicate
	| null-predicate
	| quantified-comparison-predicateSQL
	| exists-predicateSQL
	| matches-predicate


comparison-predicate ::= value-expression comparison-operator value-expression


between-predicate ::= value-expression [ NOT ] BETWEEN value-expression AND value-expression


in-predicate ::= value-expression [ NOT ] IN { ( unsigned-value-specification [ , ... ] )
	| ( query-expression ) }


like-predicate ::= value-expression [ NOT ] LIKE value-expression [ escape-clauseSQL ]


null-predicate ::= column-reference IS [ NOT ] NULL


quantified-comparison-predicate ::=
	value-expression comparison-operator { ALL | ANY | SOME } ( query-expression )


exists-predicate ::= EXISTS (query-expression)


matches-predicate ::= value-expression [ NOT ] MATCHES value-expression [ escape-clauseSQL ]


escape-clause ::= ESCAPE value-expression


comparison-operator ::= { = | != | <> | < | > | >= | <= }

Expressions

Zum Thema Expressions siehe auch Kapitel 3, Abschnitt Expressions.



value-expression ::= 
	value-expression { + | - | * | / | DIV | MOD | concat-operator } value-expression
	| [ + | - ] value-expression
	| value-expression-primary


concat-operator ::= ||


value-expression-primary ::=
	column-referenceSQL [ subscript ]SQL
	| rowid-primarySQL
	| subquerySQL
	| set-function-specificationSQL
	| unsigned-value-specification
	| routine-invocation
	| numeric-value-function ( [ value-expression [ , ... ] ] )
	| string-value-function ( [ value-expression [ , ... ] ] )
	| date-value-function ( [ value-expression [ , ... ] ] )
	| ( value-expression )
	| NVL ( value-expression , value-expression )
	| EXTRACT ( { YEAR | MONTH | DAY | HOUR | MINUTE | SECOND }
		FROM value-expression )
	| cast-specification
	| SERIAL ( table-name )


column-reference ::= [ { table-name | correlation-name } . ] column-name


subscript ::= [ unsigned-integer-literal [ , unsigned-integer-literal ] ]


Beim subscript sind die äußeren eckigen Klammern Bestandteil der Syntax.



rowid-primary ::= [ { table-name | correlation-name } . ] ROWID


subquery ::= ( query-expression )



set-function-specification ::=
	COUNT ( * )
	| set-type ( [ set-quantifier ] value-expression )
	

set-type ::=
	{ AVG | COUNT | MAX | MIN | SUM }


set-quantifier ::=
	ALL | DISTINCT


unsigned-value-specification ::=
	dynamic-parameter
	| host-variable-constructSQL
	| variable-namePL
	| literal
	| TODAY
	| CURRENT_DATE
	| CURRENT_TIME
	| CURRENT_TIMESTAMP
	| SYSTEM USER
	| USER
	| SQLCODEPL
	| ISAMCODEPL
	| SQLERRMPL
	| SQLERRIPL
	| SQLSERIALPL
	| SQLROWCNTPL
	| SQLOPCODEPL


routine-invocation ::= routine-name ( [ value-expression [ , ... ] ] )


numeric-value-function ::=
	ABS
	| ABSOLUTE
	| ACOS
	| ASIN
	| ATAN
	| COS
	| COSH
	| EXP
	| LOG
	| LOG10
	| MOD
	| POW
	| POWER
	| RAND
	| ROUND
	| SIN
	| SINH
	| SQRT
	| TAN
	| TANH
	| TRUNC


string-value-function ::=
	ASCII
	| CHAR
	| CHAR_LENGTH
	| CHARACTER_LENGTH
	| CHR
	| CONCAT
	| HEX
	| INSTR
	| LENGTH
	| LCASE
	| LOWER
	| LPAD
	| LTRIM
	| POSITION
	| REPLACE
	| RPAD
	| RTRIM
	| SUBSTR
	| SUBSTRING
	| UCASE
	| UPPER


date-value-function ::=
	CURDATE
	| DAY
	| DAYOFMONTH
	| DAYOFWEEK
	| MONTH
	| WEEKDAY
	| YEAR


cast-specification ::=
	CAST ( { value-expression | NULL } AS data-type )

Funktionen und Prozeduren

In diesem Abschnitt werden die syntaktischen Elemente von Funktionen und Prozeduren aufgeführt, die in der CREATE FUNCTION bzw. CREATE PROCEDURE Anweisung verwendet werden. Zum Thema Prozeduren und Funktionen siehe insbesondere die Kapitel 5, Stored Procedures, und Kapitel 6, Procedure Language Reference.



parameter-declaration ::=
	identifier data-type [ default-specification ]


default-specification ::=
	{ DEFAULT | = } default-value


default-value ::=
	literal
	| NULL
	| SYSTEM USER
	| USER
	| TODAY


routine-body ::=
	[ local-declaration-list ; ]
	{ procedure-statement | external-body-reference }

external-body-reference ::=
	EXTERNAL string-literal


local-declaration-list ::= local-declaration [ ... ]


local-declaration ::= 
	variable-declaration ;
	| exception-declaration ;
	| handler-declaration ;
	| handler-routine-declaration



procedure-statement ::= { terminated-statement ; | statement }


terminated-statement ::=
	assignment-statement
	| break-statement
	| call-statement
	| continue-statement
	| return-statement
	| signal-statement
	| sql-statement
	| write-statement


statement ::=
	compound-statement
	| case-statement
	| if-statement
	| while-statement
	| for-statement
	| foreach-statement


compound-statement ::=
BEGIN
[ local-declaration-list ]
[ statement-list ]
END


statement-list ::= procedure-statement [ ... ]

Die o.a. Anweisungen unter local-declaration sowie terminated-statement (außer sql-statement) und statement sind in Kapitel 6, Procedure Language Referenz, definiert.
sql-statement ::=

Die folgenden Anweisungen dürfen in jeder Routine vorkommen:
	ALTER USER
	| CALL
	| CHECK TABLE
	| CLOSE
	| CREATE DOMAIN
	| CREATE INDEX
	| CREATE SYNONYM
	| CREATE TABLE
	| CREATE USER
	| CREATE VIEW
	| DECLARE CURSOR
	| DELETE
	| EXECUTE
	| EXECUTE IMMEDIATE
	| FETCH
	| FREE
	| INSERT
	| LOCK
	| OPEN
	| PREPARE
	| SELECT
	| SET LOCK MODE
	| SET ISOLATION
	| SET OPTIMIZER
	| UNLOCK
	| UPDATE

In Routinen, die nicht von einem Trigger ausgelöst werden, können zusätzlich die folgenden SQL-Anweisungen verwendet werden:
	ALTER TABLE
	| COMMIT
	| CREATE TRIGGER
	| DROP DOMAIN
	| DROP INDEX
	| DROP SYNONYM
	| DROP TABLE
	| DROP USER
	| DROP VIEW
	| DROP TRIGGER
	| GRANT
	| RELEASE
	| RENAME
	| REVOKE
	| ROLLBACK
	| SAVEPOINT
	| UPDATE STATISTICS