Informix Guide To SQL-Syntax
Informix Guide To SQL-Syntax
Syntax
Versi on 7.2
Apri l 1996
Part No. 000- 7859A
ii Informi x Gui de to SQL: Syntax
Published by INFORMIX
; C-ISAM
; INFORMIX
; MS
; MS-DOS
;
(DOS as used herein refers to MS-DOS and/or PC-DOS operating systems.)
X/OpenCompany Ltd.: UNIX
; X/Open
Some of the products or services mentioned in this document are provided by companies other than Informix.
These products or services are identied by the trademark or servicemark of the appropriate company. If you
have a question about one of those products or services, please call the company in question directly.
Documentation Team: Diana Chase, Geeta Karmarkar, Dawn Maneval, Tom Noronha, Patrice ONeill
Copyright 1981-1996 by Informix Software, Inc. All rights reserved.
No part of this work covered by the copyright hereon may be reproduced or used in any form or by any
meansgraphic, electronic, or mechanical, including photocopying, recording, taping, or information storage
and retrieval systemswithout permission of the publisher.
To the extent that this software allows the user to store, display, and otherwise manipulate various forms of
data, including, without limitation, multimedia content such as photographs, movies, music and other binary
large objects (blobs), use of any single blob may potentially infringe upon numerous different third-party
intellectual and/or proprietary rights. It is the user's responsibility to avoid infringements of any such third-
party rights.
RESTRICTED RIGHTS LEGEND
Software and accompanying materials acquired with United States Federal Government funds or intended for
use within or for any United States federal agency are provided with Restricted Rights as dened in DFARS
252.227-7013(c)(1)(ii) or FAR 52.227-19.
Table of Contents
Table of
Contents
Introduction
Products Covered in This Manual . . . . . . . . . . . . . 3
About This Manual . . . . . . . . . . . . . . . . . . 3
Organization of This Manual . . . . . . . . . . . . . 4
Types of Users . . . . . . . . . . . . . . . . . . 5
Software Dependencies . . . . . . . . . . . . . . . 6
Demonstration Database . . . . . . . . . . . . . . 8
New Features of This Product . . . . . . . . . . . . . . 11
Conventions . . . . . . . . . . . . . . . . . . . . 16
Typographical Conventions . . . . . . . . . . . . . 16
Icon Conventions . . . . . . . . . . . . . . . . . 17
Syntax Conventions . . . . . . . . . . . . . . . . 19
Sample-Code Conventions . . . . . . . . . . . . . . 24
Terminology Conventions . . . . . . . . . . . . . . 25
Additional Documentation . . . . . . . . . . . . . . . 26
Printed Documentation . . . . . . . . . . . . . . . 26
On-Line Documentation . . . . . . . . . . . . . . 27
Related Reading . . . . . . . . . . . . . . . . . 29
Compliance with Industry Standards . . . . . . . . . . . 30
Informix Welcomes Your Comments . . . . . . . . . . . . 30
Chapter 1 SQL Statements
How to Enter SQL Statements . . . . . . . . . . . . . . 1-6
How to Enter SQL Comments . . . . . . . . . . . . . . 1-9
Categories of SQL Statements . . . . . . . . . . . . . . 1-12
ANSI Compliance and Extensions . . . . . . . . . . . . 1-16
Statements . . . . . . . . . . . . . . . . . . . . . 1-18
ALLOCATE DESCRIPTOR. . . . . . . . . . . . . . 1-19
ALTER FRAGMENT . . . . . . . . . . . . . . . . 1-22
ALTER INDEX . . . . . . . . . . . . . . . . . . 1-43
ALTER TABLE . . . . . . . . . . . . . . . . . . 1-46
BEGIN WORK . . . . . . . . . . . . . . . . . . 1-77
iv Informi x Gui de to SQL: Syntax
CHECK TABLE . . . . . . . . . . . . . . . . . 1-79
CLOSE . . . . . . . . . . . . . . . . . . . . 1-81
CLOSE DATABASE . . . . . . . . . . . . . . . . 1-85
COMMIT WORK. . . . . . . . . . . . . . . . . 1-87
CONNECT . . . . . . . . . . . . . . . . . . . 1-89
CREATE AUDIT . . . . . . . . . . . . . . . . . 1-102
CREATE DATABASE . . . . . . . . . . . . . . . 1-104
CREATE INDEX . . . . . . . . . . . . . . . . . 1-109
CREATE PROCEDURE . . . . . . . . . . . . . . 1-134
CREATE PROCEDURE FROM . . . . . . . . . . . . 1-144
CREATE ROLE . . . . . . . . . . . . . . . . . 1-145
CREATE SCHEMA . . . . . . . . . . . . . . . . 1-147
CREATE SYNONYM . . . . . . . . . . . . . . . 1-150
CREATE TABLE . . . . . . . . . . . . . . . . . 1-154
CREATE TRIGGER . . . . . . . . . . . . . . . . 1-192
CREATE VIEW . . . . . . . . . . . . . . . . . 1-224
DATABASE. . . . . . . . . . . . . . . . . . . 1-229
DEALLOCATE DESCRIPTOR . . . . . . . . . . . . 1-232
DECLARE . . . . . . . . . . . . . . . . . . . 1-234
DELETE . . . . . . . . . . . . . . . . . . . . 1-252
DESCRIBE . . . . . . . . . . . . . . . . . . . 1-255
DISCONNECT . . . . . . . . . . . . . . . . . 1-261
DROP AUDIT . . . . . . . . . . . . . . . . . . 1-265
DROP DATABASE . . . . . . . . . . . . . . . . 1-266
DROP INDEX . . . . . . . . . . . . . . . . . . 1-268
DROP PROCEDURE . . . . . . . . . . . . . . . 1-270
DROP ROLE . . . . . . . . . . . . . . . . . . 1-271
DROP SYNONYM . . . . . . . . . . . . . . . . 1-272
DROP TABLE . . . . . . . . . . . . . . . . . . 1-274
DROP TRIGGER . . . . . . . . . . . . . . . . . 1-277
DROP VIEW . . . . . . . . . . . . . . . . . . 1-279
EXECUTE . . . . . . . . . . . . . . . . . . . 1-281
EXECUTE IMMEDIATE . . . . . . . . . . . . . . 1-290
EXECUTE PROCEDURE . . . . . . . . . . . . . . 1-293
FETCH . . . . . . . . . . . . . . . . . . . . 1-296
FLUSH . . . . . . . . . . . . . . . . . . . . 1-308
FREE . . . . . . . . . . . . . . . . . . . . . 1-311
GET DESCRIPTOR . . . . . . . . . . . . . . . . 1-314
GET DIAGNOSTICS . . . . . . . . . . . . . . . 1-321
GRANT . . . . . . . . . . . . . . . . . . . . 1-340
GRANT FRAGMENT . . . . . . . . . . . . . . . 1-356
INFO . . . . . . . . . . . . . . . . . . . . . 1-365
INSERT . . . . . . . . . . . . . . . . . . . . 1-370
LOAD . . . . . . . . . . . . . . . . . . . . 1-380
LOCK TABLE . . . . . . . . . . . . . . . . . . 1-387
OPEN. . . . . . . . . . . . . . . . . . . . . 1-390
OUTPUT . . . . . . . . . . . . . . . . . . . 1-400
PREPARE . . . . . . . . . . . . . . . . . . . 1-402
PUT . . . . . . . . . . . . . . . . . . . . . 1-416
Tabl e of Contents v
RECOVER TABLE . . . . . . . . . . . . . . . . . 1-425
RENAME COLUMN . . . . . . . . . . . . . . . . 1-428
RENAME DATABASE . . . . . . . . . . . . . . . 1-431
RENAME TABLE . . . . . . . . . . . . . . . . . 1-432
REPAIR TABLE . . . . . . . . . . . . . . . . . . 1-435
REVOKE . . . . . . . . . . . . . . . . . . . . 1-437
REVOKE FRAGMENT . . . . . . . . . . . . . . . 1-450
ROLLBACK WORK . . . . . . . . . . . . . . . . 1-455
ROLLFORWARD DATABASE. . . . . . . . . . . . . 1-457
SELECT . . . . . . . . . . . . . . . . . . . . 1-459
SET . . . . . . . . . . . . . . . . . . . . . . 1-501
SET CONNECTION . . . . . . . . . . . . . . . . 1-527
SET DATASKIP. . . . . . . . . . . . . . . . . . 1-534
SET DEBUG FILE TO. . . . . . . . . . . . . . . . 1-537
SET DESCRIPTOR. . . . . . . . . . . . . . . . . 1-540
SET EXPLAIN . . . . . . . . . . . . . . . . . . 1-548
SET ISOLATION . . . . . . . . . . . . . . . . . 1-556
SET LOCK MODE . . . . . . . . . . . . . . . . . 1-561
SET LOG . . . . . . . . . . . . . . . . . . . . 1-564
SET OPTIMIZATION. . . . . . . . . . . . . . . . 1-566
SET PDQPRIORITY . . . . . . . . . . . . . . . . 1-568
SET ROLE . . . . . . . . . . . . . . . . . . . 1-571
SET SESSION AUTHORIZATION . . . . . . . . . . . 1-573
SET TRANSACTION. . . . . . . . . . . . . . . . 1-575
START DATABASE . . . . . . . . . . . . . . . . 1-581
START VIOLATIONS TABLE . . . . . . . . . . . . . 1-584
STOP VIOLATIONS TABLE . . . . . . . . . . . . . 1-603
UNLOAD. . . . . . . . . . . . . . . . . . . . 1-605
UNLOCK TABLE . . . . . . . . . . . . . . . . . 1-610
UPDATE . . . . . . . . . . . . . . . . . . . . 1-612
UPDATE STATISTICS . . . . . . . . . . . . . . . 1-623
WHENEVER. . . . . . . . . . . . . . . . . . . 1-632
Segments . . . . . . . . . . . . . . . . . . . . . 1-640
Condition . . . . . . . . . . . . . . . . . . . . 1-643
Constraint Name . . . . . . . . . . . . . . . . . 1-658
Database Name . . . . . . . . . . . . . . . . . . 1-660
Data Type . . . . . . . . . . . . . . . . . . . . 1-664
DATETIME Field Qualier . . . . . . . . . . . . . . 1-669
Expression . . . . . . . . . . . . . . . . . . . 1-671
Identier . . . . . . . . . . . . . . . . . . . . 1-723
Index Name . . . . . . . . . . . . . . . . . . . 1-741
INTERVAL Field Qualier . . . . . . . . . . . . . . 1-743
Literal DATETIME. . . . . . . . . . . . . . . . . 1-746
Literal INTERVAL . . . . . . . . . . . . . . . . . 1-749
Literal Number . . . . . . . . . . . . . . . . . . 1-752
Procedure Name . . . . . . . . . . . . . . . . . 1-754
Quoted String . . . . . . . . . . . . . . . . . . 1-757
Relational Operator . . . . . . . . . . . . . . . . 1-761
Synonym Name . . . . . . . . . . . . . . . . . 1-766
vi Informi x Gui de to SQL: Syntax
Table Name. . . . . . . . . . . . . . . . . . . 1-768
View Name. . . . . . . . . . . . . . . . . . . 1-772
Chapter 2 SPL Statements
CALL. . . . . . . . . . . . . . . . . . . . . 2-4
CONTINUE . . . . . . . . . . . . . . . . . . 2-7
DEFINE . . . . . . . . . . . . . . . . . . . . 2-8
EXIT . . . . . . . . . . . . . . . . . . . . . 2-16
FOR . . . . . . . . . . . . . . . . . . . . . 2-18
FOREACH . . . . . . . . . . . . . . . . . . . 2-23
IF . . . . . . . . . . . . . . . . . . . . . . 2-27
LET . . . . . . . . . . . . . . . . . . . . . 2-31
ON EXCEPTION. . . . . . . . . . . . . . . . . 2-34
RAISE EXCEPTION. . . . . . . . . . . . . . . . 2-39
RETURN . . . . . . . . . . . . . . . . . . . 2-41
SYSTEM. . . . . . . . . . . . . . . . . . . . 2-43
TRACE . . . . . . . . . . . . . . . . . . . . 2-46
WHILE . . . . . . . . . . . . . . . . . . . . 2-49
Index
Introduction
Products Covered in This Manual . . . . . . . . . . . . . . 3
About This Manual . . . . . . . . . . . . . . . . . . . 3
Organization of This Manual . . . . . . . . . . . . . . 4
Types of Users . . . . . . . . . . . . . . . . . . . 5
Software Dependencies . . . . . . . . . . . . . . . . 6
Assumptions About Your Database Server . . . . . . . . 6
Assumptions About Your Locale . . . . . . . . . . . 7
Demonstration Database . . . . . . . . . . . . . . . 8
New Features of This Product . . . . . . . . . . . . . . . 11
Conventions . . . . . . . . . . . . . . . . . . . . . 16
Typographical Conventions . . . . . . . . . . . . . . 16
Icon Conventions . . . . . . . . . . . . . . . . . . 17
Comment Icons . . . . . . . . . . . . . . . . . 17
Product and Platform Icons . . . . . . . . . . . . . 18
Compliance Icons . . . . . . . . . . . . . . . . 19
Syntax Conventions . . . . . . . . . . . . . . . . . 19
Elements That Can Appear on the Path . . . . . . . . . 20
How to Read a Syntax Diagram. . . . . . . . . . . . 23
Sample-Code Conventions . . . . . . . . . . . . . . . 24
Terminology Conventions . . . . . . . . . . . . . . . 25
Denitions of Terms . . . . . . . . . . . . . . . . 25
Abbreviations of Product Names . . . . . . . . . . . 25
Introduction
2 Informi x Gui de to SQL: Syntax
Additional Documentation . . . . . . . . . . . . . . . . 26
Printed Documentation . . . . . . . . . . . . . . . . 26
On-Line Documentation. . . . . . . . . . . . . . . . 27
Error Message Files . . . . . . . . . . . . . . . . 28
Release Notes, Documentation Notes, Machine Notes . . . . 28
Related Reading . . . . . . . . . . . . . . . . . . 29
Compliance with Industry Standards. . . . . . . . . . . . . 30
Informix Welcomes Your Comments . . . . . . . . . . . . . 30
Introducti on 3
his chapter introduces the Informix Guide to SQL: Syntax manual. Read
this chapter for an overview of the information provided in this manual and
for an understanding of the conventions used throughout this manual.
Products Covered in This Manual
All the information presented in this manual is valid for the following prod-
ucts. Differences in their use of SQL are indicated where appropriate:
I INFORMIX-ESQL/C, Version 7.2
I INFORMIX-ESQL/COBOL, Version 7.2
I INFORMIX-OnLine Dynamic Server, Version 7.2
I INFORMIX-SE, Version 7.2
Important: This manual does not cover the product called INFORMIX-SQL or any
other Informix application development tool. Each of these tools is covered in its own
manual set. This manual is valid only for the products in the preceding list.
About This Manual
The Informix Guide to SQL: Syntax is intended to be used as a companion
volume to the Informix Guide to SQL: Reference and Informix Guide to SQL:
Tutorial. This manual and the Informix Guide to SQL: Reference are references
that you can use on a daily basis after you nish reading and experimenting
with the Informix Guide to SQL: Tutorial.
T
4 Informi x Gui de to SQL: Syntax
Organi zati on of Thi s Manual
This manual contains all the syntax descriptions for Structured Query
Language (SQL) and Stored Procedure Language (SPL) statements. The
Informix Guide to SQL: Tutorial explains the philosophy and concepts behind
relational databases, and the Informix Guide to SQL: Reference provides
reference information for aspects of SQL other than the language statements.
Organization of This Manual
The Informix Guide to SQL: Syntax includes the following chapters:
I The Introduction explains the purpose and organization of this man-
ual, introduces the demonstration database from which the product
examples in the manual are drawn, lists the new features for
Version 7.2 of Informix database server products that use SQL, and
describes the syntax conventions followed in the manual.
I Chapter 1, SQL Statements, describes SQL statements and seg-
ments. The chapter is divided into six sections. The rst four sections
provide an introduction to the statements and segments. These sec-
tions cover the following subjects: entry of SQL statements, entry of
SQL comments, categories of SQL statements, and categories of ANSI
compliance. The fth and sixth sections, Statements and Seg-
ments, are the major sections of the chapter.
K Statements explains the workings of all the SQL statements
that Informix products support. Detailed syntax diagrams walk
you through every clause of each SQL statement, and syntax
tables explain the input parameters for each clause. Thorough
usage instructions, pertinent examples, and references to related
material complete the description of each SQL statement.
K Segments explains all the SQL segments. SQL segments are
language elements, such as table names and expressions, that
occur in many SQL statements. Instead of describing each
segment in each statement where it occurs, this manual provides
a comprehensive stand-alone description of each segment.
Whenever a segment occurs within a given syntax diagram, the
diagram points to the stand-alone description of the segment in
this section for further information.
Introducti on 5
Types of Users
I Chapter 2, SPL Statements, presents all the detailed syntax dia-
grams and explanations for SPL statements. You can use stored pro-
cedures to perform any function you can perform in SQL as well as
to expand what you can accomplish with SQL alone. You write a
stored procedure using SPL and SQL statements. For task-oriented
information about using stored procedures, see the Informix Guide to
SQL: Tutorial.
I The Index is a combined index for the manuals in the SQL series.
Each page reference in the index ends with a code that identies the
manual in which the page appears. The same index also appears in
the Informix Guide to SQL: Reference and the Informix Guide to SQL:
Tutorial.
The following items in the SQL manual series are an integral part of the
Informix Guide to SQL: Syntax even though they do not appear physically in
this manual:
I A description of the stores7 database appears in Appendix A of the
Informix Guide to SQL: Reference. This appendix describes the
structure and contents of the demonstration database that is installed
with the Informix database server products. All the manuals in the
SQL manual series use this database for their examples.
I Denitions of terms that are used in the SQL manual series appear in
the Glossary of the Informix Guide to SQL: Reference.
SQL messages that the database server issues to reect errors in the execution
of SQL statements are described in the section on SQL error codes in the
Informix Error Messages manual.
Types of Users
This manual is written for people who use Informix products and SQL on a
regular basis. The primary audience for this manual consists of SQL devel-
opers and database administrators. The secondary audience consists of end
users and anyone else who needs to know the syntax of SQL statements.
6 Informi x Gui de to SQL: Syntax
Software Dependenci es
Software Dependencies
You must have the following Informix software to enter and execute SQL and
SPL statements:
I An INFORMIX-OnLine Dynamic Server database server or an
INFORMIX-SE database server.
The database server must be installed either on your computer or on
another computer to which your computer is connected over a
network.
I Either an Informix application development tool, such as
INFORMIX-4GL; an SQL application programming interface (API),
such as INFORMIX-ESQL/C; or the DB-Access database access utility,
which is shipped as part of your database server.
The application development tool, the SQL API, or DB-Access enables
you to compose queries, send them to the database server, and view
the results that the database server returns.
You can use DB-Access to try out many of the SQL statements
described in this manual. See the DB-Access User Manual for a list of
all the SQL statements that you can run fromDB-Access.
Assumptions About Your Database Server
This manual assumes that you are using INFORMIX-OnLine Dynamic Server
as your database server. Thus information that is valid only for OnLine is not
called out as such in the text of this manual, unless a particular piece of text
emphasizes a contrast between OnLine and INFORMIX-SE. However, in
syntax diagrams, syntax paths valid only for OnLine are identied by a
product icon as an aid to users.
Features and behavior specic to INFORMIX-SE are noted throughout the text
of this manual. Information valid only for SE is identied by a product icon
in the text, and syntax paths valid only for SE are identied by the same
product icon in syntax diagrams.
Introducti on 7
Software Dependenci es
Assumptions About Your Locale
This manual assumes that you are using the default locale, U.S. 8859-1
English. This locale provides support for the U.S. English language, the ISO
8859-1 code set, and standard U.S. conventions for the formatting of
monetary, numeric, date, and time data. This locale has the following name:
en_us.8859-1
In this name, en indicates the English language, us indicates the United
States territory, and 8859-1 indicates the ISO 8859-1 code set. The ASCII code
set is a subset of the ISO 8859-1 code set.
However, Informix products can support more than one language, culture, or
code set. All culture-specic information is brought together in a single
environment, called a GLS (Global Language Support) locale. If you plan to
use non-English characters in your data or in SQL identiers, or if you want
to conform to the sorting and collation standards of a non-U.S. English
language or territory, you need to specify the appropriate nondefault locale.
See the Guide to GLS Functionality for instructions on specifying a locale.
If you are using the default U.S. English locale, the Informix Guide to SQL:
Syntax provides all the syntax information that you need for using SQL state-
ments and segments. You do not need to refer to the Guide to GLS Function-
ality for any additional syntax or considerations.
However, if you are using a nondefault locale, you need to use the Informix
Guide to SQL: Syntax in conjunction with the Guide to GLS Functionality. The
chapter on SQL features in that manual explains the effect of the GLS feature
on SQL statements and segments. That chapter approaches SQL from a
non-U.S. English perspective, so it is a necessary companion to the Informix
Guide to SQL: Syntax if you are using a nondefault locale.
8 Informi x Gui de to SQL: Syntax
Demonstrati on Database
Demonstration Database
The DB-Access utility, which is provided with your Informix database server
products, includes a demonstration database called stores7 that contains
information about a ctitious wholesale sporting-goods distributor. The
sample command les that make up a demonstration application are also
included.
Most examples in this manual are based on the stores7 demonstration
database. The stores7 database is described in detail and its contents are
listed in Appendix A of the Informix Guide to SQL: Reference.
The script that you use to install the demonstration database is called
dbaccessdemo7 and is located in the $INFORMIXDIR/bin directory. The
database name that you supply is the name given to the demonstration
database. If you do not supply a database name, the name defaults to stores7.
Use the following rules for naming your database:
I Names can have a maximum of 18 characters for INFORMIX-OnLine
Dynamic Server databases and a maximum of 10 characters for
INFORMIX-SE databases.
I The rst character of a name must be a letter or an underscore (_).
I You can use letters, characters, and underscores (_) for the rest of the
name.
I DB-Access makes no distinction between uppercase and lowercase
letters.
I The database name must be unique.
When you run dbaccessdemo7, as the creator of the database, you are the
owner and Database Administrator (DBA) of that database.
If you install your Informix database server according to the installation
instructions, the les that constitute the demonstration database are
protected so that you cannot make any changes to the original database.
Introducti on 9
Demonstrati on Database
You can run the dbaccessdemo7 script again whenever you want to work
with a fresh demonstration database. The script prompts you when the
creation of the database is complete and asks if you would like to copy the
sample command les to the current directory. Enter N if you have made
changes to the sample les and do not want them replaced with the original
versions. Enter Y if you want to copy over the sample command les.
To create and populate the stores7 demonstration database
1. Set the INFORMIXDIR environment variable so that it contains the
name of the directory in which your Informix products are installed.
2. Set INFORMIXSERVER to the name of the default database server.
The name of the default database server must exist in the
$INFORMIXDIR/etc/sqlhosts le. (For a full description of
environment variables, see Chapter 4 of the Informix Guide to SQL:
Reference.) For information about sqlhosts, see the
INFORMIX-OnLine Dynamic Server Administrators Guide or the
INFORMIX-SE Administrators Guide.
3. Create a new directory for the SQL command les. Create the
directory by entering the following command:
mkdir dirname
4. Make the new directory the current directory by entering the
following command:
cd dirname
10 Informi x Gui de to SQL: Syntax
Demonstrati on Database
5. Create the demonstration database and copy over the sample
command les by entering the dbaccessdemo7 command.
To create the database without logging, enter the following
command:
dbaccessdemo7 dbname
To create the demonstration database with logging, enter the
following command:
dbaccessdemo7 -log dbname
If you are using INFORMIX-OnLine Dynamic Server, by default the
data for the database is put into the root dbspace. If you wish, you
can specify a dbspace for the demonstration database.
To create a demonstration database in a particular dbspace, enter the
following command:
dbaccessdemo7 dbname -dbspace dbspacename
You can specify all of the options in one command, as shown in the
following command:
dbaccessdemo7 -log dbname -dbspace dbspacename
If you are using INFORMIX-SE, a subdirectory called dbname.dbs is
created in your current directory and the database les associated
with stores7 are placed there. You will see both data (.dat) and index
(.idx) les in the dbname.dbs directory. (If you specify a dbspace
name, it is ignored.)
To use the database and the command les that have been copied to
your directory, you must have UNIX read and execute permissions
for each directory in the pathname of the directory from which you
ran the dbaccessdemo7 script. Check with your system adminis-
trator for more information about operating-system le and
directory permissions. UNIX permissions are discussed in the
INFORMIX-OnLine Dynamic Server Administrators Guide and the
INFORMIX-SE Administrators Guide.
6. To give someone else the permissions to access the command les in
your directory, use the UNIX chmod command.
7. To give someone else access to the database that you have created,
grant them the appropriate privileges using the GRANT statement.
To revoke privileges, use the REVOKE statement. The GRANT and
REVOKE statements are described in Chapter 1 of this manual.
Introducti on 11
New Features of Thi s Product
New Features of This Product
The Introduction to each Version 7.2 product manual contains a list of new
features for that product. The Introduction to each manual in the Version 7.2
Informix Guide to SQL series contains a list of newSQL features.
A comprehensive list of all of the new features for Version 7.2 Informix
products is in the release-notes le called SERVERS_7.2.
This section highlights the major new features implemented in Version 7.2 of
Informix products that use SQL:
I Addition of Global Language Support (GLS)
The GLS feature allows you to work in any supported language and
to conform to the customs of a specic territory by setting certain
environment variables. In support of GLS, CHAR and VARCHAR,
columns of the system catalog tables are created as NCHAR and
NVARCHAR columns in this release. In addition, hidden rows have
been added to the systables system catalog table. See the discussion
of GLS in Chapter 1 of the Informix Guide to SQL: Reference.
I ANSI agger
The ANSI agger that Informix products use has been modied to
eliminate the agging of certain SQL items as Informix extensions.
These items include the AS keyword in the SELECT clause of the
SELECT statement and delimited identiers in the Identier segment.
I Bidirectional indexes
The database server can now traverse an index in either ascending or
descending order. So you no longer need to create both an ascending
index and a descending index for a column when you use this
column in both SELECT...ORDER BY column name ASC statements and
SELECT...ORDER BY column name DESC statements. You only need to
create a single ascending or descending index for these queries. See
the CREATE INDEX and SELECT statements.
12 Informi x Gui de to SQL: Syntax
New Features of Thi s Product
I Column matches in conditions
When you specify a LIKE or MATCHES condition in the SELECT
statement or other statements, you can specify a column name on
both sides of the LIKE or MATCHES keyword. The database server
retrieves a row when the values of the specied columns match. See
the Condition segment and the SELECT statement.
I Column substrings in queries
You can specify column subscripts for the column named in a
SELECT...ORDER BY statement. The database server sorts the query
results by the value of the column substring rather than the value of
the entire column.
I Column updates after a fetch
When you use the FOR UPDATE clause of the SELECT statement, you
can use the OF column name option of this clause to limit the columns
that can be updated after a fetch.
I Connectivity information
You can use the INFORMIXSQLHOSTS environment variable to
specify the pathname of the le where the client or the database
server looks for connectivity information.
I COUNT function
The ALL column name option of the COUNT function returns the total
number of non-null values in the specied column or expression. See
the Expression segment.
I Data distributions
You can suppress the construction of index information in the
MEDIUM and HIGH modes of the UPDATE STATISTICS statement.
When you use the newDISTRIBUTIONS ONLY option of this
statement, the database server gathers only distributions infor-
mation and table information.
I Database renaming
You can rename local databases. See the newRENAME DATABASE
statement.
I DBINFO function
You can use the 'sessionid' option of the DBINFO function to return
the session ID of your current session. See the Expression segment.
Introducti on 13
New Features of Thi s Product
I Decimal digits in client applications
Informix client applications (including the DB-Access utility or any
ESQL program that you write) by default display 16 decimal digits of
data types FLOAT, SMALLFLOAT, and DECIMAL. The actual digits
that are displayed can vary according to the size of the character
buffer. The new DBFLTMASK environment variable allows you to
override the default of 16 decimal digits in the display.
I Default privileges on tables
You can use the new NODEFDAC environment variable to prevent
default table privileges from being granted to PUBLIC when a new
table is created in a database that is not ANSI compliant.
I Fragment authorization
You can grant and revoke privileges on individual fragments of
tables. See the newGRANT FRAGMENT and REVOKE FRAGMENT
statements and the new sysfragauth system catalog table.
I High-Performance Loader (HPL) conguration
You can use the new DBONPLOAD and PLCONFIG environment
variables to specify the names of les and databases to be used by
HPL.
I In-place alter algorithm
INFORMIX-OnLine Dynamic Server uses a new in-place alter
algorithm for altering tables when you add a column to the end of
the table. See the ALTER TABLE statement.
I Next century in year values
You can use the next century to expand two-digit year values. See the
new DBCENTURY environment variable, the Literal DATETIME
segment, the DATE data type, and the DATETIME data type.
I Not null constraints
You can now create not null constraints with the CREATE TABLE and
ALTER TABLE statements. The database server records not null
constraints in the sysconstraints and syscoldepend system catalog
tables.
14 Informi x Gui de to SQL: Syntax
New Features of Thi s Product
I Object modes
You can specify the object mode of database objects with the newSET
statement. This statement permits you to set the object mode of
constraints, indexes, and triggers or the transaction mode of
constraints. See the SET statement, the new sysobjstate system
catalog table, and the new syntax for object modes in ALTER TABLE,
CREATE INDEX, CREATE TABLE, and CREATE TRIGGER.
I Optical StageBlob area
You can use the new INFORMIXOPCACHE environment variable to
specify the size of the memory cache for the Optical StageBlob area
of the client application.
I RANGE, STDEV, and VARIANCE functions
You can use the new aggregate functions RANGE, STDEV, and
VARIANCE. See the new syntax for Aggregate Expressions in the
Expression segment.
I Roles
You can create, drop, and enable roles. You can grant roles to
individual users and to other roles, and you can grant privileges to
roles. You can revoke a role from individual users and from another
role, and you can revoke privileges from a role. See the newCREATE
ROLE, DROP ROLE, and SET ROLE statements and the new
sysroleauth system catalog table. Also see the new syntax for roles in
the GRANT and REVOKE statements and the new information in the
sysusers system catalog table.
I Separation of administrative tasks
The security feature of role separation allows you to separate admin-
istrative tasks performed by different groups that are running and
auditing OnLine. The INF_ROLE_SEP environment variable allows
you to implement role separation during installation of OnLine.
I Session authorization
You can change the user name under which database operations are
performed in the current session and thus assume the privileges of
the specied user during the session. See the newSET SESSION
AUTHORIZATION statement.
Introducti on 15
New Features of Thi s Product
I Table access after loads
The FOR READ ONLY clause of the SELECT statement allows you to
access data in the tables of an ANSI-mode database after you have
loaded the data with the High-Performance Loader but before you
have performed a level-0 backup of the data. After you have
performed the level-0 backup, you no longer need to use the FOR
READ ONLY clause. See the SELECT and DECLARE statements.
I Thread-safe applications
You can use the new THREADLIB environment variable to compile
thread-safe ESQL/C applications. In a thread-safe ESQL/C appli-
cation, you can use the DORMANT option of the SET CONNECTION
statement to make an active connection dormant.
I Tutorials
Tutorial information on new features has been added to the Informix
Guide to SQL: Tutorial. The new tutorials cover Global Language
Support (GLS), thread-safe applications, object modes, violation
detection, fragment authorization, and roles.
I Utilities
The dbexport, dbimport, dbload, and dbschema utilities have been
moved from the Informix Guide to SQL: Reference to the Informix
Migration Guide.
I Violation detection
You can create special tables called violations and diagnostics tables
to detect integrity violations. See the newSTART VIOLATIONS TABLE
and STOP VIOLATIONS TABLE statements and the newsysviolations
system catalog table.
I XPG4 compliance
SQL statements and data structures have been modied to provide
enhanced compliance with the X/Open Portability Guide 4 (XPG4) speci-
cation for SQL. The sqlwarn array within the SQL Communications
Area (SQLCA) has been modied. A newSQLSTATE code (01007) has
been added. The behavior of the ALL keyword in the GRANT
statement and the behavior of the ALL and RESTRICT keywords in
the REVOKE statement has changed.
16 Informi x Gui de to SQL: Syntax
Conventi ons
See this manual for SQL statements and segments. See the Informix Guide to
SQL: Reference for data types, system catalog tables, and environment
variables. See the Informix Guide to SQL: Tutorial for tutorial information.
Conventions
This section describes the conventions that are used in this manual. By
becoming familiar with these conventions, you will nd it easier to gather
information from this and other volumes in the documentation set.
The following conventions are covered:
I Typographical conventions
I Icon conventions
I Syntax conventions
I Sample-code conventions
I Terminology conventions
Typographical Conventions
This manual uses a standard set of conventions to emphasize words, present
examples, describe statement syntax, and so forth. The following
typographical conventions are used throughout this manual.
Convention Meaning
italics Within text, emphasized words are printed in italics. Within
syntax diagrams, values that you are to specify are printed in
italics.
boldface Identiers (names of classes, objects, constants, events,
functions, program variables, forms, labels, and reports),
environment variables, database names, table names, column
names, menu items, command names, and other similar terms
are printed in boldface.
(1 of 2)
Introducti on 17
Icon Conventi ons
Tip: When you are instructed to enter characters or to execute a command,
immediately press RETURN after the entry. When you are instructed to type the
text or to press other keys, no RETURN is required.
Icon Conventions
Throughout the documentation, you will nd text that is identied by several
different types of icons. This section describes these icons.
Comment Icons
Comment icons identify three types of information, as described in the
following table. This information is always displayed in italics.
monospace Information that the product displays and information that you
enter are printed in a monospace typeface.
KEYWORD All keywords appear in uppercase letters.
This symbol indicates the end of product- or platform-specic
information.
(2 of 2)
Icon Description
Identies paragraphs that contain vital instructions,
cautions, or critical information.
Identies paragraphs that contain signicant information
about the feature or operation that is being described.
Identies paragraphs that offer additional details or
shortcuts for the functionality that is being described.
18 Informi x Gui de to SQL: Syntax
Icon Conventi ons
Product and Platform Icons
Product and platform icons identify paragraphs that describe product-
specic or platform-specic information. The following table describes the
product and platform icons that are used in this manual.
These icons can apply to a row in a table, one or more paragraphs, or an entire
section. A symbol indicates the end of the product- or platform-specic
information.
Icon Description
Identies information that is valid only for INFORMIX-SE.
Identies information that is valid only for DB-Access.
Identies information that is valid only for SQL statements
in INFORMIX-ESQL/C and INFORMIX-ESQL/COBOL.
Identies information that is valid only for
INFORMIX-ESQL/C.
Identies information that is valid only for
INFORMIX-ESQL/COBOL.
Identies information that is valid only if you are using
Informix Stored Procedure Language ( ).
Identies information that is valid only for
INFORMIX-OnLine/Optical.
SE
D/B
ESQL
E/C
E/CO
SPL
OP
Introducti on 19
Syntax Conventi ons
Compliance Icons
Compliance icons indicate paragraphs that provide guidelines for complying
with a standard.
These icons can apply to a row in a table, one or more paragraphs, or an entire
section. A symbol indicates the end of the compliance information.
Syntax Conventions
This section describes conventions for syntax diagrams. Each diagram
displays the sequences of required and optional keywords, terms, and
symbols that are valid in a given statement, command line, or other
specication, as in the following diagram of the SET EXPLAIN statement.
Each syntax diagram begins at the upper left corner and ends at the upper
right corner with a vertical terminator. Between these points, any path that
does not stop or reverse direction describes a possible form of the statement.
(For a fewdiagrams, notes in the text identify path segments that are
mutually exclusive.)
Icon Description
Identies information that is valid only if your database is
ANSI-compliant.
Identies information that is valid only if your database or
application uses a nondefault GLS locale.
Indicates that the functionality described in the text
conforms to X/Open specications for dynamic SQL. This
functionality is available when you compile your SQL API
with the -xopen ag.
ANSI
GLS
X/O
SET EXPLAIN
OFF
+
ON
20 Informi x Gui de to SQL: Syntax
Syntax Conventi ons
Syntax elements in a path represent terms, keywords, symbols, and segments
that can appear in your statement. Except for separators in loops, which the
path approaches counterclockwise from the right, the path always
approaches elements from the left and continues to the right. Unless
otherwise noted, at least one blank character separates syntax elements.
Elements That Can Appear on the Path
You might encounter one or more of the following elements on a path.
Element Description
KEYWORD A word in UPPERCASE characters is a keyword. You
must spell the word exactly as shown; however, you
can use either uppercase or lowercase characters.
( . , ; @ + * - / ) Punctuation and other non-alphanumeric characters
are literal symbols that you must enter exactly as
shown.
' ' Single quotes are literal symbols that you must enter
as shown.
variable A word in italics represents a value that you must
supply. A table immediately following the diagram
explains the value.
A term shown in a rectangle represents a subdiagram
on the same page (if no page number is supplied) or a
specied page, as if the subdiagram were spliced into
the diagram at this point. The same subdiagram can be
represented by rectangles of different shapes, as in
these symbols for the ADD Clause subdiagram.
An icon is a warning that this path is valid only for
some products, or only under certain conditions.
Characters on the icons indicate what products or
conditions support the path.
These icons might appear in a syntax diagram:
This path is valid only for
INFORMIX-OnLine Dynamic Server.
(1 of 3)
ADD
Clause
p. 1-14
ADD Clause
OL
OL
Introducti on 21
Syntax Conventi ons
This path is valid only for INFORMIX-SE.
This path is valid only for DB-Access.
This path is valid only for SQL statements
in INFORMIX-ESQL/C and
INFORMIX-ESQL/COBOL.
This path is valid only for
INFORMIX-ESQL/C.
This path is valid only for
INFORMIX-ESQL/COBOL.
This path is valid only if you are using
Informix Stored Procedure Language
(SPL).
This path is valid only for
INFORMIX-OnLine/Optical.
This path is an Informix extension to
ANSI SQL-92 entry-level standard SQL. If
you initiate Informix extension checking
and include this syntax branch, you
receive a warning. If you have set the
DBANSIWARN environment variable at
compile time, or have used the -ansi
compile ag, you receive warnings at
compile time. If you have DBANSIWARN
set at runtime, or if you compiled with
the -ansi ag, warning ags are set in the
sqlwarn structure.
This path is valid only if your database or
application uses a nondefault GLS locale.
A shaded option is the default. If you do not specify
any of the available options, this option is in effect by
default.
Syntax that is enclosed between a pair of arrows is
a subdiagram.
Element Description
(2 of 3)
SE
D/B
ESQL
E/C
E/CO
SPL
OP
+
GLS
ALL
22 Informi x Gui de to SQL: Syntax
Syntax Conventi ons
The vertical line is a terminator. This symbol only
appears at the right, indicating that the syntax
diagram is complete.
A branch below the main path indicates an optional
path. (Any term on the main path is required, unless
a branch can circumvent it.)
A set of multiple branches indicates that a choice
among more than two different paths is available.
A loop indicates a path that you can repeat.
Punctuation along the top of the loop indicates the
separator symbol for list items, as in this example. If no
symbol appears, a blank space is the separator,
A gate ( ) on a path indicates that you can only use
that path the indicated number of times, even if it is
part of a larger loop. Here you can specify size no more
than three times within this statement segment.
Element Description
(3 of 3)
NOT
NULL IS
ERROR
WARNING
NOT FOUND
statement
variable
,
3
size
, 3
Introducti on 23
Syntax Conventi ons
How to Read a Syntax Diagram
Figure 1 shows a syntax diagram that uses most of the path elements that are
listed in the previous table.
To use this diagram to construct a statement, start at the top left with the
keywords CREATE DATABASE. Then follow the diagram to the right,
proceeding through the options that you want.
Figure 1
Elements of a Syntax Diagram
OL Log Clause
CREATE DATABASE database name
IN dbspace
LOG IN 'pathname'
MODE ANSI
BUFFERED
LOG
LOG MODE ANSI
OL Log Clause
WITH
WITH
SE Log Clause
OL
SE
SE Log Clause
OL
Mai n di agram
Subdi agram
24 Informi x Gui de to SQL: Syntax
Sampl e- Code Conventi ons
To read the example syntax diagram
1. You must type the words CREATE DATABASE.
2. You must supply a database name.
3. You can stop, taking the direct route to the terminator, or you can
take one or more of the optional paths.
4. If desired, you can designate a dbspace by typing the word IN and a
dbspace name.
5. If desired, you can specify logging. Here, you are constrained by the
database server with which you are working.
K If you are using INFORMIX-OnLine Dynamic Server, go to the
subdiagram named OL Log Clause. Follow the subdiagram by
typing the keyword WITH, then choosing and typing either LOG,
BUFFERED LOG, or LOG MODE ANSI. Then, follow the arrow
back to the main diagram.
K If you are using INFORMIX-SE, go to the subdiagram named SE
Log Clause. Follow the subdiagram by typing the keywords
WITH LOG IN, typing a quote, supplying a pathname, and clos-
ing the quotes. You can then choose the MODE ANSI option
below the line or continue to follow the line across.
6. Once you are back at the main diagram, you come to the terminator.
Your CREATE DATABASE statement is complete.
Sample-Code Conventions
Examples of SQL code occur throughout this manual. Except where noted,
the code is not specic to any single Informix application development tool.
If only SQL statements are listed in the example, they are not delimited by
semicolons. To use this SQL code for a specic product, you must apply the
syntax rules for that product. For example, if you are using the
Query-language option of DB-Access, you must delimit multiple statements
with semicolons. If you are using an SQL API, you must use EXEC SQL and a
semicolon (or other appropriate delimiters) at the start and end of each
statement, respectively.
Introducti on 25
Termi nol ogy Conventi ons
For instance, you might see the code in the following example:
CONNECT TO stores7
.
.
.
DELETE FROM customer
WHERE customer_num = 121
.
.
.
COMMIT WORK
DISCONNECT CURRENT
Dots in the example indicate that more code would be added in a full
application, but it is not necessary to show it to describe the concept being
discussed.
For detailed directions on using SQL statements for a particular application
development tool or SQL API, see the manual for your product.
Terminology Conventions
This manual uses a standard set of conventions for terms and abbreviations.
Denitions of Terms
For denitions of terms used in this manual and in the other manuals of the
SQL series, see the Glossary in the Informix Guide to SQL: Reference.
Abbreviations of Product Names
The following abbreviations for product names and features appear in this
manual.
Abbreviation Complete Name
GLS Global Language Support
OnLine INFORMIX-OnLine Dynamic Server
SE INFORMIX-SE
SQL Structured Query Language
26 Informi x Gui de to SQL: Syntax
Addi ti onal Documentati on
Additional Documentation
This section describes the following pieces of the documentation set:
I Printed documentation
I On-line documentation
I Related reading
Printed Documentation
In addition to this manual, the following printed manuals are included in the
SQL manual series:
I A companion volume to this manual, the Informix Guide to SQL:
Reference, provides reference information on the types of Informix
databases you can create, the data types supported in Informix
products, system catalog tables associated with the database, and
environment variables you can set to use your Informix products
properly. This manual also provides a detailed description of the
stores7 demonstration database and contains a glossary.
I An additional companion volume to this manual, the Informix Guide
to SQL: Tutorialprovides a tutorial on SQL as it is implemented by
Informix products. It describes the fundamental ideas and termi-
nology that are used when planning, using, and implementing a
relational database.
I The SQL Quick Syntax Guide contains syntax diagrams for all state-
ments and segments described in this manual.
Introducti on 27
On- Li ne Documentati on
The following related Informix documents complement the information in
this manual set:
I Getting Started with Informix Database Server Products provides an
orientation to the Informix client/server environment and describes
the manuals for Informix products. If you are a new user of Informix
products, it is helpful to read this manual before you read any of the
manuals in the SQL manual series.
I The Guide to GLS Functionality explains the impact of the GLS feature
on Informix products. This manual includes a chapter on SQL
features and a chapter on GLS environment variables.
I You, or whoever installs your Informix products, should refer to the
UNIX Products Installation guide for your particular release to ensure
that your Informix product is properly set up before you begin to
work with it. A matrix that depicts possible client/server congura-
tions is included in the UNIX Products Installation guide.
I Depending on the database server you are using, you or your system
administrator need either theINFORMIX-SE Administrators Guide or
the INFORMIX-OnLine Dynamic Server Administrators Guide. The
DB-Access User Manual describes how to invoke the DB-Access utility
to access, modify, and retrieve information from Informix database
servers.
I When errors occur, you can look them up by number and learn their
cause and solution in the Informix Error Messages manual. If you
prefer, you can look up the error messages in the on-line message le
described in the section Error Message Files later in this Intro-
duction and in the Introduction to the Informix Error Messages
manual.
On-Line Documentation
The following online les supplement this document:
I On-line error messages
I Release notes, documentation notes, and machine notes
28 Informi x Gui de to SQL: Syntax
On- Li ne Documentati on
Error Message Files
Informix software products provide ASCII les that contain all of the
Informix error messages and their corrective actions. To read the error
messages in the ASCII le, Informix provides scripts that let you display error
messages on the screen ( nderr) or print formatted error messages (rofferr).
See the Introduction to the Informix Error Messages manual for a detailed
description of these scripts.
The optional Informix Messages and Corrections product provides
PostScript les that contain the error messages and their corrective actions. If
you have installed this product, you can print the PostScript les on a
PostScript printer. The PostScript error messages are distributed in a number
of les of the format errmsg1.ps, errmsg2.ps, and so on. These les are
located in the $INFORMIXDIR/msg directory.
Release Notes, Documentation Notes, Machine Notes
In addition to the Informix set of manuals, the following on-line les, located
in the $INFORMIXDIR/release/en_us/0333 directory, supplement the infor-
mation in this manual.
On-Line File Purpose
Documentation
Notes
Describes features that are not covered in the manual or that
have been modied since publication. The le that contains
the documentation notes for this product is called
SQLSDOC_7.2.
Release Notes Describes feature differences from earlier versions of Informix
products and how these differences might affect current
products. The le that contains the release notes for
Version 7..2 of Informix database server products is called
SERVERS_7.2.
Machine Notes Describes any special actions required to congure and use
Informix products on your computer. Machine notes are
named for the product described. For example, the machine
notes le for INFORMIX-OnLine Dynamic Server is
ONLINE_7.2.
Introducti on 29
Rel ated Readi ng
Please examine these les because they contain vital information about
application and performance issues.
Related Reading
For additional technical information on database management, consult the
following books. The rst book is an introductory text for readers who are
new to database management, while the second book is a more complex
technical work for SQL programmers and database administrators:
I Database: A Primer by C. J. Date (Addison-Wesley Publishing, 1983)
I An Introduction to Database Systems by C. J. Date (Addison-Wesley
Publishing, 1994).
To learn more about the SQL language, consider the following books:
I A Guide to the SQL Standard by C. J. Date with H. Darwen (Addison-
Wesley Publishing, 1993)
I Understanding the New SQL: A Complete Guide by J. Melton and A.
Simon (Morgan Kaufmann Publishers, 1993)
I Using SQL by J. Groff and P. Weinberg (Osborne McGraw-Hill, 1990)
This manual assumes that you are familiar with your computer operating
system. If you have limited UNIX system experience, consult your operating
system manual or a good introductory text before you read this manual. The
following texts provide a good introduction to UNIX systems:
I Introducing the UNIX System by H. McGilton and R. Morgan
(McGraw-Hill Book Company, 1983)
I Learning the UNIX Operating System by G. Todino, J. Strang, and
J. Peek (OReilly & Associates, 1993)
I A Practical Guide to the UNIX System by M. Sobell
(Benjamin/Cummings Publishing, 1989)
I UNIX for People by P. Birns, P. Brown, and J. Muster (Prentice-Hall,
1985)
I UNIX System V: A Practical Guide by M. Sobell (Benjamin/Cummings
Publishing, 1995)
30 Informi x Gui de to SQL: Syntax
Compl i ance wi th Industry Standards
Compliance with Industry Standards
The American National Standards Institute (ANSI) has established a set of
industry standards for SQL. Informix SQL-based products are fully compliant
with SQL-92 Entry Level (published as ANSI X3.135-1992), which is identical
to ISO 9075:1992 on INFORMIX-OnLine Dynamic Server. In addition, many
features of OnLine comply with the SQL-92 Intermediate and Full Level and
X/Open CAE (common applications environment) standards.
Informix SQL-based products are compliant with ANSI SQL-92 Entry Level
(published as ANSI X3.135-1992) on INFORMIX-SE with the following
exceptions:
I Effective checking of constraints
I Serializable transactions
Informix Welcomes Your Comments
Please let us know what you like or dislike about our manuals. To help us
with future versions of our manuals, please tell us about any corrections or
clarications that you would nd useful. Write to us at the following address:
Informix Software, Inc.
SCT Technical Publications Department
4100 Bohannon Drive
Menlo Park, CA 94025
If you prefer to send electronic mail, our address is:
[email protected]
Or send a facsimile to the Informix Technical Publications Department at:
415-926-6571
Introducti on 31
Informi x Wel comes Your Comments
Please include the following information:
I The name and version of the manual that you are using
I Any comments that you have about the manual
I Your name, address, and phone number
We appreciate your feedback.
1
Chapter
SQL Statements
How to Enter SQL Statements . . . . . . . . . . . . . . . 1-6
How to Enter SQL Comments . . . . . . . . . . . . . . . 1-9
Categories of SQL Statements . . . . . . . . . . . . . . . 1-12
ANSI Compliance and Extensions . . . . . . . . . . . . . 1-16
Statements . . . . . . . . . . . . . . . . . . . . . . 1-18
ALLOCATE DESCRIPTOR. . . . . . . . . . . . . . . 1-19
ALTER FRAGMENT . . . . . . . . . . . . . . . . . 1-22
ALTER INDEX . . . . . . . . . . . . . . . . . . . 1-43
ALTER TABLE . . . . . . . . . . . . . . . . . . . 1-46
BEGIN WORK . . . . . . . . . . . . . . . . . . . 1-77
CHECK TABLE. . . . . . . . . . . . . . . . . . . 1-79
CLOSE. . . . . . . . . . . . . . . . . . . . . . 1-81
CLOSE DATABASE . . . . . . . . . . . . . . . . . 1-85
COMMIT WORK . . . . . . . . . . . . . . . . . . 1-87
CONNECT . . . . . . . . . . . . . . . . . . . . 1-89
CREATE AUDIT . . . . . . . . . . . . . . . . . . 1-102
CREATE DATABASE. . . . . . . . . . . . . . . . . 1-104
CREATE INDEX . . . . . . . . . . . . . . . . . . 1-109
CREATE PROCEDURE . . . . . . . . . . . . . . . . 1-134
CREATE PROCEDURE FROM . . . . . . . . . . . . . 1-144
CREATE ROLE . . . . . . . . . . . . . . . . . . . 1-145
CREATE SCHEMA . . . . . . . . . . . . . . . . . 1-147
CREATE SYNONYM. . . . . . . . . . . . . . . . . 1-150
CREATE TABLE . . . . . . . . . . . . . . . . . . 1-154
CREATE TRIGGER . . . . . . . . . . . . . . . . . 1-192
CREATE VIEW. . . . . . . . . . . . . . . . . . . 1-224
Informi x Gui de to SQL: Syntax
DATABASE . . . . . . . . . . . . . . . . . . . . 1-229
DEALLOCATE DESCRIPTOR. . . . . . . . . . . . . . 1-232
DECLARE . . . . . . . . . . . . . . . . . . . . 1-234
DELETE . . . . . . . . . . . . . . . . . . . . . 1-252
DESCRIBE . . . . . . . . . . . . . . . . . . . . 1-255
DISCONNECT . . . . . . . . . . . . . . . . . . . 1-261
DROP AUDIT . . . . . . . . . . . . . . . . . . . 1-265
DROP DATABASE. . . . . . . . . . . . . . . . . . 1-266
DROP INDEX . . . . . . . . . . . . . . . . . . . 1-268
DROP PROCEDURE . . . . . . . . . . . . . . . . . 1-270
DROP ROLE . . . . . . . . . . . . . . . . . . . . 1-271
DROP SYNONYM. . . . . . . . . . . . . . . . . . 1-272
DROP TABLE . . . . . . . . . . . . . . . . . . . 1-274
DROP TRIGGER . . . . . . . . . . . . . . . . . . 1-277
DROP VIEW. . . . . . . . . . . . . . . . . . . . 1-279
EXECUTE. . . . . . . . . . . . . . . . . . . . . 1-281
EXECUTE IMMEDIATE . . . . . . . . . . . . . . . . 1-290
EXECUTE PROCEDURE . . . . . . . . . . . . . . . 1-293
FETCH. . . . . . . . . . . . . . . . . . . . . . 1-296
FLUSH. . . . . . . . . . . . . . . . . . . . . . 1-308
FREE . . . . . . . . . . . . . . . . . . . . . . 1-311
GET DESCRIPTOR . . . . . . . . . . . . . . . . . 1-314
GET DIAGNOSTICS . . . . . . . . . . . . . . . . . 1-321
GRANT . . . . . . . . . . . . . . . . . . . . . 1-340
GRANT FRAGMENT. . . . . . . . . . . . . . . . . 1-356
INFO . . . . . . . . . . . . . . . . . . . . . . 1-365
INSERT . . . . . . . . . . . . . . . . . . . . . 1-370
LOAD . . . . . . . . . . . . . . . . . . . . . . 1-380
LOCK TABLE . . . . . . . . . . . . . . . . . . . 1-387
OPEN . . . . . . . . . . . . . . . . . . . . . . 1-390
OUTPUT . . . . . . . . . . . . . . . . . . . . . 1-400
PREPARE . . . . . . . . . . . . . . . . . . . . . 1-402
PUT . . . . . . . . . . . . . . . . . . . . . . . 1-416
RECOVER TABLE . . . . . . . . . . . . . . . . . . 1-425
SQL Statements
RENAME COLUMN . . . . . . . . . . . . . . . . . 1-428
RENAME DATABASE . . . . . . . . . . . . . . . . . 1-431
RENAME TABLE. . . . . . . . . . . . . . . . . . . 1-432
REPAIR TABLE . . . . . . . . . . . . . . . . . . . 1-435
REVOKE . . . . . . . . . . . . . . . . . . . . . 1-437
REVOKE FRAGMENT . . . . . . . . . . . . . . . . . 1-450
ROLLBACK WORK. . . . . . . . . . . . . . . . . . 1-455
ROLLFORWARD DATABASE . . . . . . . . . . . . . . 1-457
SELECT . . . . . . . . . . . . . . . . . . . . . . 1-459
SET . . . . . . . . . . . . . . . . . . . . . . . 1-501
SET CONNECTION. . . . . . . . . . . . . . . . . . 1-527
SET DATASKIP . . . . . . . . . . . . . . . . . . . 1-534
SET DEBUG FILE TO . . . . . . . . . . . . . . . . . 1-537
SET DESCRIPTOR . . . . . . . . . . . . . . . . . . 1-540
SET EXPLAIN. . . . . . . . . . . . . . . . . . . . 1-548
SET ISOLATION . . . . . . . . . . . . . . . . . . . 1-556
SET LOCK MODE . . . . . . . . . . . . . . . . . . 1-561
SET LOG . . . . . . . . . . . . . . . . . . . . . 1-564
SET OPTIMIZATION . . . . . . . . . . . . . . . . . 1-566
SET PDQPRIORITY . . . . . . . . . . . . . . . . . . 1-568
SET ROLE . . . . . . . . . . . . . . . . . . . . . 1-571
SET SESSION AUTHORIZATION . . . . . . . . . . . . . 1-573
SET TRANSACTION . . . . . . . . . . . . . . . . . 1-575
START DATABASE . . . . . . . . . . . . . . . . . . 1-581
START VIOLATIONS TABLE . . . . . . . . . . . . . . 1-584
STOP VIOLATIONS TABLE . . . . . . . . . . . . . . . 1-603
UNLOAD . . . . . . . . . . . . . . . . . . . . . 1-605
UNLOCK TABLE. . . . . . . . . . . . . . . . . . . 1-610
UPDATE. . . . . . . . . . . . . . . . . . . . . . 1-612
UPDATE STATISTICS . . . . . . . . . . . . . . . . . 1-623
WHENEVER . . . . . . . . . . . . . . . . . . . . 1-632
Informi x Gui de to SQL: Syntax
Segments . . . . . . . . . . . . . . . . . . . . . . 1-640
Condition . . . . . . . . . . . . . . . . . . . . . 1-643
Constraint Name . . . . . . . . . . . . . . . . . . 1-658
Database Name . . . . . . . . . . . . . . . . . . . 1-660
Data Type . . . . . . . . . . . . . . . . . . . . . 1-664
DATETIME Field Qualier . . . . . . . . . . . . . . . 1-669
Expression . . . . . . . . . . . . . . . . . . . . 1-671
Identier . . . . . . . . . . . . . . . . . . . . . 1-723
Index Name . . . . . . . . . . . . . . . . . . . . 1-741
INTERVAL Field Qualier . . . . . . . . . . . . . . . 1-743
Literal DATETIME. . . . . . . . . . . . . . . . . . 1-746
Literal INTERVAL . . . . . . . . . . . . . . . . . . 1-749
Literal Number . . . . . . . . . . . . . . . . . . . 1-752
Procedure Name . . . . . . . . . . . . . . . . . . 1-754
Quoted String . . . . . . . . . . . . . . . . . . . 1-757
Relational Operator . . . . . . . . . . . . . . . . . 1-761
Synonym Name. . . . . . . . . . . . . . . . . . . 1-766
Table Name . . . . . . . . . . . . . . . . . . . . 1-768
View Name . . . . . . . . . . . . . . . . . . . . 1-772
SQL Statements 1-5
his chapter provides comprehensive reference information about SQL
statements and the SQL segments that recur in SQL statements. It is organized
into the following sections:
I How to Enter SQL Statements shows how to use the information
in the statement descriptions to enter SQL statements correctly.
I How to Enter SQL Comments shows how to enter comments for
your SQL statements in DB-Access command les, ESQL programs,
and stored procedures.
I Categories of SQL Statements divides SQL statements into several
functional categories and lists the statements within each category.
Some examples of these categories are data denition statements,
data manipulation statements, and data integrity statements.
I ANSI Compliance and Extensions explains how the SQL state-
ments in this manual comply with the ANSI SQL standard. This
section provides a list of ANSI-compliant statements, a list of ANSI-
compliant statements with Informix extensions, and a list of state-
ments that are Informix extensions to the ANSI standard.
I Statements gives comprehensive descriptions of SQL statements.
The statements are listed in alphabetical order.
I Segments gives comprehensive descriptions of SQL segments. The
segments are listed in alphabetical order. SQL segments are language
elements, such as table names and expressions, that occur in many
SQL statements. Instead of describing each segment in each
statement where it occurs, this chapter provides a comprehensive
stand-alone description of each segment. Whenever a segment
occurs within the syntax diagram for an SQL statement, the diagram
points to the stand-alone description of the segment for further
information.
T
1-6 Informi x Gui de to SQL: Syntax
How to Enter SQL Statements
The following table summarizes the sections of this chapter.
How to Enter SQL Statements
The purpose of the statement descriptions in this chapter is to help you to
enter SQL statements successfully and to understand the behavior of the
statements. Each statement description includes the following information:
I A brief introduction that explains the purpose of the statement
I A syntax diagram that shows how to enter the statement correctly
I A syntax table that explains each input parameter in the syntax
diagram
I Rules of usage, including examples that illustrate these rules
Section Starting Page Scope
How to Enter
SQL Statements
1-6 This section shows how to use the
statement descriptions to enter SQL
statements correctly.
How to Enter
SQL Comments
1-9 This section shows how to enter
comments for SQL statements.
Categories of SQL
Statements
1-12 This section lists SQL statements by
functional category.
ANSI
Compliance and
Extensions
1-16 This section lists SQL statements by
degree of ANSI compliance.
Statements 1-18 This section gives reference descriptions
of all SQL statements.
Segments 1-640 This section gives reference descriptions
of all SQL segments.
SQL Statements 1-7
How to Enter SQL Statements
If a statement consists of multiple clauses, the statement description provides
the same set of information for each clause.
Each statement description concludes with references to related information
in this manual and other manuals.
The major aids for entering SQL statements successfully include:
I the combination of the syntax diagram and syntax table.
I the examples of syntax that appear in the rules of usage.
I the references to related information.
Using Syntax Diagrams and Syntax Tables
Before you try to use the syntax diagrams in this chapter, it is helpful to read
the Syntax Conventions on page 19 of the Introduction. This section is the
key to understanding the syntax diagrams in the statement descriptions.
The Syntax Conventions section explains the elements that can appear in a
syntax diagram and the paths that connect the elements to each other. This
section also includes a sample syntax diagram that illustrates the major
elements of all syntax diagrams. The narrative that follows the sample
diagram shows how to read the diagram in order to enter the statement
successfully.
When a syntax diagram within a statement description includes input
parameters, the syntax diagram is followed by a syntax table that shows how
to enter the parameters without generating errors. Each syntax table includes
the following columns:
I The Elements column lists the name of each parameter as it appears
in the syntax diagram.
I The Purpose column briey states the purpose of the parameter. If
the parameter has a default value, it is listed in this column.
I The Restrictions column summarizes the restrictions on the
parameter, such as acceptable ranges of values.
I The Syntax column points to the SQL segment that gives the detailed
syntax for the parameter.
1-8 Informi x Gui de to SQL: Syntax
How to Enter SQL Statements
Using Examples
To understand the main syntax diagram and subdiagrams for a statement,
study the examples of syntax that appear in the rules of usage for each
statement. These examples have two purposes:
I To show how to accomplish particular tasks with the statement or its
clauses
I To show how to use the syntax of the statement or its clauses in a
concrete way
Tip: An ef cient way to understand a syntax diagram is to nd an example of the
syntax and compare it with the keywords and parameters in the syntax diagram. By
mapping the concrete elements of the example to the abstract elements of the syntax
diagram, you can understand the syntax diagram and use it more effectively.
For an explanation of the conventions used in the examples in this manual,
see Sample-Code Conventions on page 24 of the Introduction.
Using References
For help in understanding the concepts and terminology in the SQL
statement description, check the References section at the end of the
description.
The References section points to related information in this manual and
other manuals that helps you to understand the statement in question. This
section provides some or all of the following information:
I The names of related statements that might contain a fuller
discussion of topics in this statement
I The titles of other manuals that provide extended discussions of
topics in this statement
I The chapters in the Informix Guide to SQL: Tutorial that provide a task-
oriented discussion of topics in this statement
Tip: If you do not have extensive knowledge and experience with SQL, the Informix
Guide to SQL: Tutorial gives you the basic SQL knowledge that you need to under-
stand and use the statement descriptions in this manual.
SQL Statements 1-9
How to Enter SQL Comments
How to Enter SQL Comments
You can add comments to clarify the purpose or effect of particular SQL state-
ments. Your comments can help you or others to understand the role of the
statement within a program, stored procedure, or command le. The code
examples in this manual sometimes include comments that clarify the role of
an SQL statement within the code.
The following table shows the SQL comment symbols that you can enter in
your code. A Y in a column signies that you can use the symbol with the
product or database type named in the column heading. An N in a column
signies that you cannot use the symbol with the product or database type
that the column heading names.
Comment
Symbol
SQL
APIs
Stored
Procedures
(SPL)
DB-Access ANSI-
Compliant
Databases
Databases
That Are
Not ANSI
Compliant
Description
double
dash
(--)
Y Y Y Y Y The double dash precedes the
comment. The double dash can
comment only a single line. If
you want to use the double dash
to comment more than one line,
you must put the double dash at
the beginning of each comment
line.
curly
brackets
({})
N Y Y Y Y Curly brackets enclose the
comment. The { precedes the
comment, and the } follows the
comment. You can use curly
brackets for single-line
comments or for multiple-line
comments.
1-10 Informi x Gui de to SQL: Syntax
How to Enter SQL Comments
If the product that you are using supports both comment symbols, your
choice of a comment symbol depends on your requirements for ANSI
compliance:
I The double dash (--) complies with the ANSI SQL standard.
I Curly brackets ({}) are an Informix extension to the standard.
If ANSI compliance is not an issue, your choice of comment symbols is a mat-
ter of personal preference.
You can use either comment symbol when you enter SQL statements with the
SQL editor and when you create SQL command les with the SQL editor or a
system editor. An SQL command le is an operating-system le that contains
one or more SQL statements. Command les are also known as command
scripts. For more information about command les, see the discussion of
command scripts in the Informix Guide to SQL: Tutorial. For information on
creating and modifying command les with the SQL editor or a system editor
in DB-Access, see the DB-Access User Manual.
You can use either comment symbol in any line of a stored procedure. See
Adding Comments to the Procedure on page 1-138 for further information.
Also see the discussion of commenting and documenting a procedure in the
Informix Guide to SQL: Tutorial.
You can use the double dash (--) to comment SQL statements in your SQL API.
See the manual for your SQL API for further information on the use of SQL
comment symbols and language-specic comment symbols in application
programs.
Examples of SQL Comment Symbols
Some simple examples can help to illustrate the different ways of using the
SQL comment symbols.
Examples of the Double-Dash Symbol
The following example shows the use of the double dash (--) to comment an
SQL statement. In this example, the comment appears on the same line as the
statement.
SELECT * FROM customer -- Selects all columns and rows
D/B
SPL
ESQL
SQL Statements 1-11
How to Enter SQL Comments
In the following example, the user enters the same SQL statement and the
same comment as in the preceding example, but the user places the comment
on a line by itself:
SELECT * FROM customer
-- Selects all columns and rows
In the following example, the user enters the same SQL statement as in the
preceding example but now enters a multiple-line comment:
SELECT * FROM customer
-- Selects all columns and rows
-- from the customer table
Examples of the Curly-Brackets Symbols
The following example shows the use of curly brackets ({}) to comment an
SQL statement. In this example, the comment appears on the same line as the
statement.
SELECT * FROM customer {Selects all columns and rows}
In the following example, the user enters the same SQL statement and the
same comment as in the preceding example but places the comment on a line
by itself:
SELECT * FROM customer
{Selects all columns and rows}
In the following example, the user enters the same SQL statement as in the
preceding example but enters a multiple-line comment:
SELECT * FROM customer
{Selects all columns and rows
from the customer table}
References
See the CLOSE DATABASE, CONNECT TO, DATABASE, DROP DATABASE, and
START DATABASE statements in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of creating a database
in Chapter 9.
SQL Statements 1-109
CREATE INDEX
CREATE INDEX
Use the CREATE INDEX statement to create an index for one or more columns
in a table and, optionally, to cluster the physical table in the order of the
index. When more than one column is listed, the concatenation of the set of
columns is treated as a single composite column for indexing. The indexes
can be fragmented into separate dbspaces. You can create a unique or
duplicate index, and you can set the object mode of either type of index.
Syntax
Element Purpose Restrictions Syntax
dbspace The name of the dbspace in
which you want to place the
index
The dbspace must exist at the
time you execute the statement.
Identier, p. 1-723
percent The percentage of each index
page that is lled by index data
when the index is created. The
default value is 90.
Value must be in the range 1 to
100.
Literal Number,
p. 1-752
INDEX CREATE
Index
Denition
p. 1-111
IN dbspace
FRAGMENT
BY
EXPRESSION
Clause
p. 1-124
CLUSTER
+
OL
OL
FILLFACTOR percent
UNIQUE
DISTINCT
Object Modes
for Unique
Indexes
p. 1-128
Object Modes
for Duplicate
Indexes
p. 1-131
1-110 Informi x Gui de to SQL: Syntax
CREATE INDEX
Usage
When you issue the CREATE INDEX statement, the table is locked in exclusive
mode. If another process is using the table, the database server cannot
execute the CREATE INDEX statement and returns an error.
You cannot use a ROLLBACK WORK statement to undo a CREATE INDEX
statement. If you roll back a transaction that contains a CREATE INDEX
statement, the index remains, and you do not receive an error message.
UNIQUE Option
The following example creates a unique index:
CREATE UNIQUE INDEX c_num_ix ON customer (customer_num)
A unique index prevents duplicates in the customer_num column. A column
with a unique index can have, at most, one null value. The DISTINCT
keyword is a synonym for the keyword UNIQUE, so the following statement
would accomplish the same task:
CREATE DISTINCT INDEX c_num_ix ON customer (customer_num)
The index in either example is maintained in ascending order, which is the
default order.
If you do not specify the UNIQUE or DISTINCT keywords in a CREATE INDEX
statement, a duplicate index is created. A duplicate index allows duplicate
values in the indexed column.
You can also prevent duplicates in a column or set of columns by creating a
unique constraint with the CREATE TABLE or ALTER TABLE statement. See the
CREATE TABLE or ALTER TABLE statements for more information on creating
unique constraints.
SE
SQL Statements 1-111
CREATE INDEX
How Unique and Referential Constraints Affect Indexes
Internal indexes are created for unique and referential constraints. If a unique
or referential constraint is added after the table is created, the user-created
indexes are used, if appropriate. An appropriate index is one that indexes the
same columns that are used in the referential or unique constraint. If an
appropriate index is not available, a nonfragmented index is created in the
database dbspace.
CLUSTER Option
Use the CLUSTER option to reorder the physical table in the order designated
by the index. The CREATE CLUSTER INDEX statement fails if a CLUSTER index
already exists.
CREATE CLUSTER INDEX c_clust_ix ON customer (zipcode)
This statement creates an index on the customer table that orders the table
physically by zip code.
You cannot create a CLUSTER index on a table that has an audit trail.
If the CLUSTER option is specied in addition to fragments on an index, the
data is clustered only within the context of the fragment and not globally
across the entire table.
Index Denition
SE
Synonym
Name
p. 1-766
Index
Denition
ON
,
column name
DESC
( )
Index
Name
p. 1-741
ASC
table name
1-112 Informi x Gui de to SQL: Syntax
CREATE INDEX
Use the Index Denition portion of the CREATE INDEX statement to give a
name to the index, specify the table on which the index is created, and specify
the column or columns to be used for the index. In addition, the ASC and
DESC keywords allow you to specify whether the index will be sorted in
ascending or descending order.
Restrictions on the Column Name Variable in CREATE INDEX
Observe the following restrictions when you specify the column name
variable:
I All the columns you specify must exist and must belong to the same
table.
I The maximum number of columns and the total width of all columns
vary with the database server. See Composite Indexes on
page 1-113.
I You cannot add an ascending index to a column or column list that
already has a unique constraint on it. See The ASC and DESC
Keywords on page 1-113.
I The number of indexes you can create on the same column or same
sequence of columns is restricted. See Number of Indexes Allowed
on page 1-120.
Element Purpose Restrictions Syntax
column name The name of the column or
columns that you want to index
You must observe restrictions on
the location of the columns, the
maximum number of columns,
the total width of the columns,
existing constraints on the
columns, and the number of
indexes allowed on the same
columns. See Restrictions on
the Column Name Variable in
CREATE INDEX below.
Identier, p. 1-723
table name The name of the table on which
the index is created
The table must exist. The table
can be a regular database table
or a temporary table.
Identier, p. 1-723
SQL Statements 1-113
CREATE INDEX
Composite Indexes
The following example creates a composite index using the stock_num and
manu_code columns of the stock table:
CREATE UNIQUE INDEX st_man_ix ON stock (stock_num, manu_code)
The index prevents any duplicates of a given combination of stock_num and
manu_code. The index is in ascending order by default.
You can include 16 columns in a composite index. The total width of all
indexed columns in a single CREATE INDEX statement cannot exceed
255 bytes.
You can use up to eight columns in a composite index. The total width of all
indexed columns in a single CREATE INDEX statement cannot exceed
120 bytes.
Place columns in the composite index in the order from most frequently used
to least frequently used.
The ASC and DESC Keywords
Use the ASC option to specify an index that is maintained in ascending order.
The ASC option is the default ordering scheme. Use the DESC option to
specify an index that is maintained in descending order. When a column or
list of columns is dened as unique in a CREATE TABLE or ALTER TABLE
statement, the database server implements that UNIQUE CONSTRAINT by
creating a unique ascending index. Thus, you cannot use the CREATE INDEX
statement to add an ascending index to a column or column list that is
already dened as unique.
SE
1-114 Informi x Gui de to SQL: Syntax
CREATE INDEX
You can create a descending index on such columns, and you can include
such columns in composite ascending indexes in different combinations. For
example, the following sequence of statements is allowed:
CREATE TABLE customer (
customer_num SERIAL(101) UNIQUE,
fname CHAR(15),
lname CHAR(15),
company CHAR(20),
address1 CHAR(20),
address2 CHAR(20),
city CHAR(15),
state CHAR(2),
zipcode CHAR(5),
phone CHAR(18)
)
CREATE INDEX cathtmp ON customer (customer_num DESC)
CREATE INDEX c_temp2 ON customer (customer_num, zipcode)
Bidirectional Traversal of Indexes
When you create an index on a column but do not specify the ASC or DESC
keywords, the database server stores the key values in ascending order by
default. If you specify the ASC keyword, the database server stores the key
values in ascending order. If you specify the DESC keyword, the database
server stores the key values in descending order.
Ascending order means that the key values are stored in order from the
smallest key to the largest key. For example, if you create an ascending index
on the lname column of the customer table, last names are stored in the index
in the following order: Albertson, Beatty, Currie.
Descending order means that the key values are stored in order from the
largest key to the smallest key. For example, if you create a descending index
on the lname column of the customer table, last names are stored in the index
in the following order: Currie, Beatty, Albertson.
However, the bidirectional traversal capability of the database server lets you
create just one index on a column and use that index for queries that specify
sorting of results in either ascending or descending order of the sort column.
SQL Statements 1-115
CREATE INDEX
Example of Bidirectional Traversal of an Index
An example can help to illustrate the bidirectional traversal of indexes by the
database server. Suppose that you want to enter the following two queries:
SELECT lname, fname FROM customer ORDER BY lname ASC;
SELECT lname, fname FROM customer ORDER BY lname DESC;
When you specify the ORDER BY clause in SELECT statements such as these,
you can improve the performance of the queries by creating an index on the
ORDER BY column. Because of the bidirectional traversal capability of the
database server, you only need to create a single index on the lname column.
For example, you can create an ascending index on the lname column with
the following statement:
CREATE INDEX lname_bothways ON customer (lname ASC)
The database server will use the ascending index lname_bothways to sort
the results of the rst query in ascending order and to sort the results of the
second query in descending order.
In the rst query, you want to sort the results in ascending order. So the
database server traverses the pages of the lname_bothways index from left
to right and retrieves key values from the smallest key to the largest key. The
query result is as follows.
lname fname
Albertson Frank
Beatty Lana
Currie Philip
.
.
.
Vector Raymond
Wallack Jason
Watson George
1-116 Informi x Gui de to SQL: Syntax
CREATE INDEX
Traversing the index from left to right means that the database server starts
at the leftmost leaf node of the index and continues to the rightmost leaf node
of the index. For an explanation of leaf nodes in indexes, see the
INFORMIX-OnLine Dynamic Server Administrators Guide.
In the second query, you want to sort the results in descending order. So the
database server traverses the pages of the lname_bothways index from right
to left and retrieves key values from the largest key to the smallest key. The
query result is as follows.
Traversing the index from right to left means that the database server starts
at the rightmost leaf node of the index and continues to the leftmost leaf node
of the index. For an explanation of leaf nodes in indexes, see the
INFORMIX-OnLine Dynamic Server Administrators Guide.
lname fname
Watson George
Wallack Jason
Vector Raymond
.
.
.
Currie Philip
Beatty Lana
Albertson Frank
SQL Statements 1-117
CREATE INDEX
Choosing an Ascending or Descending Index
In the preceding example, you created an ascending index on the lname
column of the customer table by specifying the ASC keyword in the CREATE
INDEX statement. Then the database server used this index to sort the results
of the rst query in ascending order of lname values and to sort the results of
the second query in descending order of lname values. However, you could
have achieved exactly the same results if you had created the index as a
descending index.
For example, the following statement creates a descending index that the
database server can use to process both queries:
CREATE INDEX lname_bothways2 ON customer (lname DESC)
The resulting lname_bothways2 index stores the key values of the lname
column in descending order, from the largest key to the smallest key. When
the database server processes the rst query, it traverses the index from right
to left to perform an ascending sort of the results. When the database server
processes the second query, it traverses the index from left to right to perform
a descending sort of the results.
So it does not matter whether you create a single-column index as an
ascending or descending index. Whichever storage order you choose for an
index, the database server can traverse that index in ascending or descending
order when it processes queries.
Use of the ASC and DESC Keywords in Composite Indexes
If you want to place an index on a single column of a table, you do not need
to specify the ASC or DESC keywords because the database server can
traverse the index in either ascending or descending order. The database
server will create the index in ascending order by default, but the server can
traverse this index in either ascending or descending order when it uses the
index in a query.
However, if you create a composite index on a table, the ASC and DESC
keywords might be required. For example, if you want to enter a SELECT
statement whose ORDER BY clause sorts on multiple columns and sorts each
column in a different order, and you want to use an index for this query, you
need to create a composite index that corresponds to the ORDER BY columns.
1-118 Informi x Gui de to SQL: Syntax
CREATE INDEX
For example, suppose that you want to enter the following query:
SELECT stock_num, manu_code, description, unit_price
FROM stock
ORDER BY manu_code ASC, unit_price DESC
This query sorts rst in ascending order by the value of the manu_code
column and then in descending order by the value of the unit_price column.
To use an index for this query, you need to issue a CREATE INDEX statement
that corresponds to the requirements of the ORDER BY clause. For example,
you can enter either of following statements to create the index:
CREATE INDEX stock_idx1 ON stock
(manu_code ASC, unit_price DESC);
CREATE INDEX stock_idx2 ON stock
(manu_code DESC, unit_price ASC);
Now, when you execute the query, the database server uses the index that
you created (either stock_idx1 or stock_idx2) to sort the query results in
ascending order by the value of the manu_code column and then in
descending order by the value of the unit_price column. If you created the
stock_idx1 index, the database server traverses the index from left to right
when it executes the query. If you created the stock_idx2 index, the database
server traverses the index from right to left when it executes the query.
SQL Statements 1-119
CREATE INDEX
Regardless of which index you created, the query result is as follows.
stock_num manu_code description unit_price
8 ANZ volleyball $840.00
205 ANZ 3 golf balls $312.00
110 ANZ helmet $244.00
304 ANZ watch $170.00
301 ANZ running shoes $95.00
310 ANZ kick board $84.00
201 ANZ golf shoes $75.00
313 ANZ swimcap $60.00
6 ANZ tennis ball $48.00
9 ANZ volleyball net $20.00
5 ANZ tennis racquet $19.80
309 HRO ear drops $40.00
302 HRO ice pack $4.50
.
.
.
113 SHM 18-spd, assmbld $685.90
1 SMT baseball gloves $450.00
6 SMT tennis ball $36.00
5 SMT tennis racquet $25.00
1-120 Informi x Gui de to SQL: Syntax
CREATE INDEX
The composite index that was used for this query (stock_idx1 or stock_idx2)
cannot be used for queries in which you specify the same sort direction for
the two columns in the ORDER BY clause. For example, suppose that you
want to enter the following queries:
SELECT stock_num, manu_code, description, unit_price
FROM stock
ORDER BY manu_code ASC, unit_price ASC;
SELECT stock_num, manu_code, description, unit_price
FROM stock
ORDER BY manu_code DESC, unit_price DESC;
If you want to use a composite index to improve the performance of these
queries, you need to enter one of the following CREATE INDEX statements.
You can use either one of the created indexes (stock_idx3 or stock_idx4) to
improve the performance of the preceding queries.
CREATE INDEX stock_idx3 ON stock
(manu_code ASC, unit_price ASC);
CREATE INDEX stock_idx4 ON stock
(manu_code DESC, unit_price DESC);
Number of Indexes Allowed
Restrictions exist on the number of indexes that you can create on the same
column or the same sequence of columns.
Restrictions on the Number of Indexes on a Single Column
You can create only one ascending index and one descending index on a
single column. For example, if you wanted to create all possible indexes on
the stock_num column of the stock table, you could create the following
indexes:
I The stock_num_asc index on the stock_num column in ascending
order
I The stock_num_desc index on the stock_num column in descending
order
SQL Statements 1-121
CREATE INDEX
Because of the bidirectional traversal capability of the database server, you
do not need to create both indexes in practice. You only need to create one of
the indexes. Both of these indexes would achieve exactly the same results for
an ascending or descending sort on the stock_num column. For further infor-
mation on the bidirectional traversal capability of the database server, see
Bidirectional Traversal of Indexes on page 1-114.
Restrictions on the Number of Indexes on a Sequence of Columns
You can create multiple indexes on a sequence of columns, provided that
each index has a unique combination of ascending and descending columns.
For example, to create all possible indexes on the stock_num andmanu_code
columns of the stock table, you could create the following indexes:
I The ix1 index on both columns in ascending order
I The ix2 index on both columns in descending order
I The ix3 index on stock_num in ascending order and on manu_code
in descending order
I The ix4 index on stock_num in descending order and on manu_code
in ascending order
Because of the bidirectional-traversal capability of the database server, you
do not need to create these four indexes in practice. You only need to create
two indexes:
I The ix1 and ix2 indexes achieve exactly the same results for sorts in
which the user species the same sort direction (ascending or
descending) for both columns. Therefore, you only need to create
one index of this pair.
I The ix3 and ix4 indexes achieve exactly the same results for sorts in
which the user species different sort directions for the two columns
(ascending on the rst column and descending on the second column
or vice versa). Therefore, you only need to create one index of this
pair.
For further information on the bidirectional-traversal capability of the
database server, see Bidirectional Traversal of Indexes on page 1-114.
1-122 Informi x Gui de to SQL: Syntax
CREATE INDEX
FILLFACTOR Clause
Use the FILLFACTOR clause to provide for expansion of the index at a later
date or to create compacted indexes. You provide a percent value ranging
from 1 to 100, inclusive. The default percent value is 90.
When the index is created, OnLine initially lls only that percentage of the
nodes specied with the FILLFACTOR value. If you provide a low percentage
value, such as 50, you allow room for growth in your index. The nodes of the
index initially ll to a certain percentage and contain space for inserts. The
amount of available space depends on the number of keys in each page as
well as the percentage value. For example, with a 50-percent FILLFACTOR
value, the page would be half full and could accommodate doubling in
growth. A low percentage value can result in faster inserts and can be used
for indexes that you expect to grow.
If you provide a high percentage value, such as 99, your indexes are com-
pacted, and any new index inserts result in splitting nodes. The maximum
density is achieved with 100 percent. With a 100-percent FILLFACTOR value,
the index has no room available for growth; any additions to the index result
in splitting the nodes. A 99-percent FILLFACTOR value allows room for at
least one insertion per node. A high percentage value can result in faster
selects and can be used for indexes that you do not expect to grow or for
mostly read-only indexes.
This option takes effect only when you build an index on a table that contains
more than 5,000 rows and uses more than 100 table pages, when you create
an index on a fragmented table, or when you create a fragmented index on a
nonfragmented table. The FILLFACTOR can also be set as a parameter in the
ONCONFIG le. The FILLFACTOR clause on the CREATE INDEX statement
overrides the setting in the ONCONFIG le.
For more information about the ONCONFIG le and the parameters you can
use with ONCONFIG, see the INFORMIX-OnLine Dynamic Server Adminis-
trators Guide.
SQL Statements 1-123
CREATE INDEX
Attached and Detached Indexes
When you fragment a table and, at a later time, create an index for that table,
the index uses the same fragmentation strategy as the table unless you
specify otherwise with the FRAGMENT BY EXPRESSION clause or the IN
dbspace clause. Any changes to the table fragmentation result in a corre-
sponding change to the index fragmentation. Attached indexes are indexes
created without a fragmentation strategy. Indexes are detached indexes when
they are created with a fragmentation strategy or stored in separate dbspaces
from the table.
For information on the INdbspace clause, see The IN dbspace Clause below.
For information on the FRAGMENT BY EXPRESSION clause, see The
FRAGMENT BY EXPRESSION Clause on page 1-124.
The IN dbspace Clause
Use the IN dbspace clause to specify the dbspace where you want your index
to reside. With this clause, you create a detached index, even though the
index is not fragmented. The dbspace that you specify must already exist. If
you do not specify the IN dbspace clause, the index is created in the dbspace
where the table was created. In addition, if you do not specify the IN dbspace
clause, but the underlying table is fragmented, the index is created as a
detached index, subject to all the restrictions on fragmented indexes. See
The FRAGMENT BY EXPRESSION Clause on page 1-124 for more
information about fragmented indexes.
The IN dbspace clause allows you to isolate an index. For example, if the
customer table is created in the custdata dbspace, but you want to create an
index in a separate dbspace called custind, use the following statements:
CREATE TABLE customer
.
.
.
IN custdata EXTENT SIZE 16
CREATE INDEX idx_cust ON customer (customer_num)
IN custind
1-124 Informi x Gui de to SQL: Syntax
CREATE INDEX
The FRAGMENT BY EXPRESSION Clause
Element Purpose Restrictions Syntax
dbspace The dbspace that will contain an
index fragment that
frag-expression denes
You must specify at least two
dbspaces. You can specify a
maximum of 2,048 dbspaces.
The dbspaces must exist at the
time you execute the statement.
Identier, p. 1-723
(1 of 2)
FRAGMENT BY
EXPRESSION
Clause
FRAGMENT BY
EXPRESSION
REMAINDER IN
remainder
dbspace ,
frag-expression
IN dbspace
,
frag-expression
IN dbspace
,
SQL Statements 1-125
CREATE INDEX
You use the FRAGMENT BY EXPRESSION clause to dene the expression-
based distribution scheme.
frag-expression An expression that denes a
fragment where an index key is
to be stored using a range, hash,
or arbitrary rule
If you specify a value for
remainder dbspace, you must
specify at least one fragment
expression. If you do not specify
a value for remainder dbspace, you
must specify at least two
fragment expressions. You can
specify a maximum of 2,048
fragment expressions. Each
fragment expression can contain
only columns from the current
table and only data values from
a single row. The columns
contained in a fragment
expression must be the same as
the indexed columns, or a subset
of the indexed columns. No
subqueries, stored procedures,
current date/time functions, or
aggregates are allowed in a
fragment expression.
Expression, p. 1-671,
and Condition,
p. 1-643
remainder
dbspace
The dbspace that contains index
keys that do not meet the condi-
tions dened in any fragment
expression
If you specify two or more
fragment expressions, remainder
dbspace is optional. If you specify
only one fragment expression,
remainder dbspace is required.
The dbspace specied in
remainder dbspace must exist at
the time you execute the
statement.
Identier, p. 1-723
Element Purpose Restrictions Syntax
(2 of 2)
1-126 Informi x Gui de to SQL: Syntax
CREATE INDEX
In an expression-based distribution scheme, each fragment expression in a rule
species a dbspace. Each fragment expression within the rule isolates data
and aids the database server in searching for index keys. You can specify one
of the following rules:
I Range rule
A range rule species fragment expressions that use a range to
specify which index keys are placed in a fragment, as the following
example shows:
.
.
.
FRAGMENT BY EXPRESSION
c1 < 100 IN dbsp1,
c1 >= 100 and c1 < 200 IN dbsp2,
c1 >= 200 IN dbsp3;
I Hash rule
A hash rule species fragment expressions that are created when you
use a hash algorithm, which is often implemented with the MOD
function, as the following example shows:
.
.
.
FRAGMENT BY EXPRESSION
MOD(id_num, 3) = 0 IN dbsp1,
MOD(id_num, 3) = 1 IN dbsp2,
MOD(id_num, 3) = 2 IN dbsp3;
I Arbitrary rule
An arbitrary rule species fragment expressions based on a
predened SQL expression that typically includes the use of OR
clauses to group data, as the following example shows:
.
.
.
FRAGMENT BY EXPRESSION
zip_num = 95228 OR zip_num = 95443 IN dbsp2,
zip_num = 91120 OR zip_num = 92310 IN dbsp4,
REMAINDER IN dbsp5;
SQL Statements 1-127
CREATE INDEX
Warning: When you specify a date value in a fragment expression, make sure to spec-
ify 4 digits instead of 2 digits for the year. When you specify a 4-digit year, the
DBCENTURY environment variable has no effect on the distribution scheme. When
you specify a 2-digit year, the DBCENTURY environment variable can affect the dis-
tribution scheme and can produce unpredictable results. See the Informix Guide to
SQL: Reference for more information on the DBCENTURY environment variable.
Creating Index Fragments
When you fragment a table, all indexes for the table become fragmented the
same as the table, unless you specify a different fragmentation strategy.
Fragmentation of Unique Indexes
You can fragment unique indexes only with a table that uses an expression-
based distribution scheme. The columns referenced in the fragment
expression must be part of the indexed columns. If your CREATE INDEX
statement fails to meet either of these restrictions, the CREATE INDEX fails,
and work is rolled back.
Fragmentation of System Indexes
System indexes (such as those used in referential constraints and unique
constraints) utilize user indexes if they exist. If no user indexes can be
utilized, system indexes remain nonfragmented and are moved to the
dbspace where the database was created. To fragment a system index, create
the fragmented index on the constraint columns, and then add the constraint
using the ALTER TABLE statement.
Fragmentation of Indexes on Temporary Tables
You can create explicit temporary tables with the TEMP TABLE clause of the
CREATE TABLE statement or with the INTO TEMP clause of the SELECT
statement. If you specied more than one dbspace in the DBSPACETEMP
environment variable, but you did not specify an explicit fragmentation
strategy, the database server fragments the temporary table round-robin
across the dbspaces that DBSPACETEMP species.
1-128 Informi x Gui de to SQL: Syntax
CREATE INDEX
If you then try to create a unique index on the temporary table, but you do
not specify a fragmentation strategy for the index, the index is not
fragmented in the same way as the table. You can fragment a unique index
only if the underlying table uses an expression-based distribution scheme,
but the temporary table is fragmented according to a round-robin distri-
bution scheme.
Instead of fragmenting the unique index on the temporary table, the database
server creates the index in the rst dbspace that the DBSPACETEMP
environment variable species. To avoid this result, use the FRAGMENT BY
EXPRESSION clause to specify a fragmentation strategy for the index.
For more information on the DBSPACETEMP environment variable, see the
Informix Guide to SQL: Reference.
Object Modes for Unique Indexes
Object Modes for
Unique Indexes
ENABLED
DISABLED
WITHOUT
ERROR
WITH
ERROR
FILTERING
SQL Statements 1-129
CREATE INDEX
You can set unique indexes in the following modes: disabled, enabled, and
ltering. The following list explains these modes.
If you specify ltering mode, you can also specify one of the following error
options.
Object Mode Effect
disabled A unique index created in disabled mode is not updated after
insert, delete, and update operations that modify the base table.
Because the contents of the disabled index are not up to date, the
optimizer does not use the index during the execution of queries.
enabled A unique index created in enabled mode is updated after insert,
delete, and update operations that modify the base table. Because
the contents of the enabled index are up to date, the optimizer uses
the index during the execution of queries. If an insert or update
operation causes a duplicate key value to be added to a unique
enabled index, the statement fails.
ltering A unique index created in ltering mode is updated after insert,
delete, and update operations that modify the base table. Because
the contents of the ltering mode index are up to date, the optimizer
uses the index during the execution of queries. If an insert or update
operation causes a duplicate key value to be added to a unique
index in ltering mode, the statement continues processing, but the
bad row is written to the violations table associated with the base
table. Diagnostic information about the unique-index violation is
written to the diagnostics table associated with the base table.
Error Option Effect
WITHOUT
ERROR
When a unique-index violation occurs during an insert or update
operation, no integrity-violation error is returned to the user. You
can specify this option only with the ltering-object mode.
WITH ERROR When a unique-index violation occurs during an insert or update
operation, an integrity-violation error is returned to the user. You
can specify this option only with the ltering-object mode.
1-130 Informi x Gui de to SQL: Syntax
CREATE INDEX
Specifying Object Modes for Unique Indexes
You must observe the following rules when you specify object modes for
unique indexes in CREATE INDEX statements:
I You can set a unique index to the enabled, disabled, or ltering
modes.
I If you do not specify the object mode of a unique index explicitly, the
default mode is enabled.
I If you do not specify the WITHERRORor WITHOUTERRORoption for
a ltering-mode unique index, the default error option is WITHOUT
ERROR.
I When you add a new unique index to an existing base table and
specify the disabled object mode for the index, your CREATE INDEX
statement succeeds even if duplicate values in the indexed column
would cause a unique-index violation.
I When you add a new unique index to an existing base table and
specify the enabled or ltering-object mode for the index, your
CREATE INDEX statement succeeds provided that no duplicate
values exist in the indexed column that would cause a unique-index
violation. However, if any duplicate values exist in the indexed
column, your CREATE INDEX statement fails and returns an error.
I When you add a new unique index to an existing base table in the
enabled or ltering mode, and duplicate values exist in the indexed
column, erroneous rows in the base table are not ltered to the viola-
tions table. Thus, you cannot use a violations table to detect the
erroneous rows in the base table.
Adding a Unique Index When Duplicate Values Exist in the Column
If you attempt to add a unique index in the enabled mode but receive an error
message because duplicate values are in the indexed column, take the
following steps to add the index successfully:
1. Add the index in the disabled mode. Issue the CREATE INDEX
statement again, but this time specify the DISABLED keyword.
2. Start a violations and diagnostics table for the target table with the
START VIOLATIONS TABLE statement.
SQL Statements 1-131
CREATE INDEX
3. Issue a SET statement to switch the object mode of the index to the
enabled mode. When you issue this statement, existing rows in the
target table that violate the unique-index requirement are duplicated
in the violations table. However, you receive an integrity-violation
error message, and the index remains disabled.
4. Issue a SELECT statement on the violations table to retrieve the non-
conforming rows that are duplicated from the target table. You might
need to join the violations and diagnostics tables to get all the neces-
sary information.
5. Take corrective action on the rows in the target table that violate the
unique-index requirement.
6. After you x all the nonconforming rows in the target table, issue the
SET statement again to switch the disabled index to the enabled
mode. This time the index is enabled, and no integrity violation error
message is returned because all rows in the target table now satisfy
the new unique-index requirement.
Object Modes for Duplicate Indexes
Object Modes for
Duplicate Indexes
ENABLED
DISABLED
1-132 Informi x Gui de to SQL: Syntax
CREATE INDEX
If you create a duplicate index, you can set the object mode of the index to the
disabled or enabled mode. The following table explains these modes.
Specifying Object Modes for Duplicate Indexes
You must observe the following rules when you specify object modes for
duplicate indexes in CREATE INDEX statements:
I You can set a duplicate index to the enabled or disabled mode, but
you cannot set a duplicate index to the ltering mode.
I If you do not specify the object mode of a duplicate index explicitly,
the default mode is enabled.
How the Database Server Treats Disabled Indexes
Whether a disabled index is a unique or duplicate index, the database server
effectively ignores the index during data-manipulation operations.
When an index is disabled, the database server stops updating it and stops
using it during queries, but the catalog information about the disabled index
is retained. So you cannot create a new index on a column or set of columns
if a disabled index on that column or set of columns already exists.
Similarly, you cannot create an active (not disabled) unique, foreign-key, or
primary-key constraint on a column or set of columns if the indexes needed
by the active constraint exist and are disabled.
Object Mode Effect
disabled A duplicate index is created in disabled mode. The disabled index
is not updated after insert, delete, and update operations that
modify the base table. Because the contents of the disabled index
are not up to date, the optimizer does not use the index during the
execution of queries.
enabled A duplicate index is created in enabled mode. The enabled index is
updated after insert, delete, and update operations that modify the
base table. Because the contents of the enabled index are up to date,
the optimizer uses the index during the execution of queries. If an
insert or update operation causes a duplicate key value to be added
to a duplicate enabled index, the statement does not fail.
SQL Statements 1-133
CREATE INDEX
References
See the ALTER INDEX, DROP INDEX, and CREATE TABLE statements in this
manual.
In the Informix Guide to SQL: Tutorial, see the discussions of indexes in
Chapter 3. In addition, see the INFORMIX-OnLine Dynamic Server Perfor-
mance Guide for information about performance issues with indexes.
In the Guide to GLS Functionality, see the discussion of the GLS aspects of the
CREATE INDEX statement.
1-134 Informi x Gui de to SQL: Syntax
CREATE PROCEDURE
CREATE PROCEDURE
Use the CREATE PROCEDURE statement to name and dene a stored
procedure.
Syntax
Usage
You must have the Resource privilege on a database to create a procedure.
The entire length of a CREATE PROCEDURE statement must be less than 64
kilobytes. This length is the literal length of the CREATE PROCEDURE
statement, including blank space and tabs.
Element Purpose Restrictions Syntax
pathname The pathname and lename of
the listing le that is to contain
warnings generated during the
compilation of the procedure.
See WITH LISTING IN Option
on page 1-139 for the default
action taken when you omit the
pathname.
The specied pathname must
exist on the computer where the
database resides.
The pathname and
lename must
conform to the
conventions of your
operating system.
Procedure
Name
p. 1-754
Statement
Block
p. 1-140
CREATE PROCEDURE
END
PROCEDURE
( )
DBA
,
Parameter
p. 1-136
RETURNING
Clause
p. 1-138
,
Quoted String
p. 1-757
DOCUMENT
WITH
LISTING IN
' pathname '
;
+
SQL Statements 1-135
CREATE PROCEDURE
If the statement block portion of the CREATE PROCEDURE statement is empty,
no operation takes place when you call the procedure. You might use such a
procedure in the development stage when you want to establish the existence
of a procedure but have not yet coded it.
Warning: When you specify a date value in an expression in any statement in the
statement block, make sure to specify 4 digits instead of 2 digits for the year. When
you specify a 4-digit year, the DBCENTURY environment variable has no effect on
how the database server interprets the date value. When you specify a 2-digit year,
the DBCENTURY environment variable can affect how the database server interprets
the date value, so the stored procedure might produce unpredictable results. See the
Informix Guide to SQL: Reference for more information on the DBCENTURY
environment variable.
You can use a CREATE PROCEDURE statement only within a PREPARE
statement. If you want to create a procedure for which the text is known at
compile time, you must use a CREATE PROCEDURE FROM statement.
You cannot use a ROLLBACK WORK statement to undo a CREATE
PROCEDURE statement. If you roll back a transaction that contains a CREATE
PROCEDURE statement, the procedure remains, and you do not receive an
error message.
DBA Option
If you create a procedure using the DBA option, it is known as a DBA-
privileged procedure. If you do not use the DBA option, the procedure is
known as an owner-privileged procedure. The privileges associated with the
execution of a procedure are determined by whether the procedure is created
with the DBA keyword. See Chapter 12 of the Informix Guide to SQL: Tutorial
for more information.
If you create an owner-privileged procedure in a database that is not
ANSI-compliant, the NODEFDAC environment variable prevents privileges
on that procedure from being granted to PUBLIC. See the Informix Guide to
SQL: Reference for further information on the NODEFDAC environment
variable.
ESQL
SE
1-136 Informi x Gui de to SQL: Syntax
CREATE PROCEDURE
Parameter Syntax and Use
To dene a parameter within the CREATE PROCEDURE statement, you must
specify its name. You must also specify its data type. You can specify the data
type directly or use the LIKE or REFERENCES clauses to identify the data type.
Specifying a Default Value for a Parameter
You can use the DEFAULT keyword followed by an expression to specify a
default value for a parameter. If you provide a default value for a parameter,
and the procedure is called with fewer arguments than were dened for that
procedure, the default value is used. If you do not provide a default value for
a parameter, and the procedure is called with fewer arguments than were
dened for that procedure, the calling application receives an error.
Element Purpose Restrictions Syntax
column name The name of a column whose
data type is assigned as variable
name
The column must exist in the
specied table.
Identier, p. 1-723
default value The default value that a
procedure uses if you do not
supply a value for variable name
when you call the procedure
The default value must conform
to the data type of variable name.
Expression, p. 1-671
table name The name of the table that
contains column name
The table must exist in the
database.
Identier, p. 1-723
variable name The name of a parameter for
which you supply a value when
you call the procedure
You can specify zero, one, or
more parameters in a CREATE
PROCEDURE statement.
Identier, p. 1-723
Parameter
. LIKE
variable
name
SQL Data Type
(Subset)
p. 1-137
table
name
column
name
default
value
REFERENCES BYTE
TEXT
DEFAULT
NULL
DEFAULT
SQL Statements 1-137
CREATE PROCEDURE
The following example shows a CREATE PROCEDURE statement that species
a default value for a parameter. This procedure nds the square of the i
parameter. If the procedure is called without specifying the argument for the
i parameter, the database server uses the default value 0 for the i parameter.
CREATE PROCEDURE square_w_default
(i INT DEFAULT 0) {Specifies default value of i}
RETURNING INT; {Specifies return of INT value}
DEFINE j INT; {Defines procedure variable j}
LET j = i * i; {Finds square of i and assigns it to j}
RETURN j; {Returns value of j to calling module}
END PROCEDURE;
Warning: When you specify a date value as the default value for a parameter, make
sure to specify 4 digits instead of 2 digits for the year. When you specify a 4-digit year,
the DBCENTURY environment variable has no effect on how the database server
interprets the date value. When you specify a 2-digit year, the DBCENTURY environ-
ment variable can affect how the database server interprets the date value, so the
stored procedure might not use the default value that you intended. See the Informix
Guide to SQL: Reference for more information on the DBCENTURY environment
variable.
Subset of SQL Data Types Allowed in the Parameter List
The SQL Data Type subset includes all the SQL data types except SERIAL,
TEXT, and BYTE. For the complete syntax of all the SQL data types, see
page 1-664.
To use a TEXT or BYTE data type, use the REFERENCES keyword, as the
diagram on page 1-136 shows.
Referencing TEXT or BYTE Values
Use the REFERENCES clause to specify that a parameter contains TEXT or
BYTE data. If you use the DEFAULT NULL option in the REFERENCES clause,
and you call the procedure without a parameter, a null value is used.
1-138 Informi x Gui de to SQL: Syntax
CREATE PROCEDURE
RETURNING Clause
In the following examples, the RETURNING clause can be a noncursory
procedure or a cursory procedure. In the rst example, the RETURNING
clause can return zero or one value if it is a noncursory procedure. However,
if this clause is associated with a cursory procedure, it returns more than one
row from a table, and each returned row contains zero or one value. In the
second example, the RETURNING clause can return zero or two values if it is
a noncursory procedure. However, if this clause is associated with a cursory
procedure, it returns more than one row from a table and each returned row
contains zero or two values.
RETURNING INT;
RETURNING INT, INT;
The receiving procedure or program must be written appropriately to accept
the information.
Adding Comments to the Procedure
To add a comment to any line of a procedure, place a double-dash (--) before
the comment or enclose the comment in curly brackets ({}). The double dash
complies with the ANSI standard. The curly brackets are an Informix
extension to the ANSI standard.
For examples of comments in procedures, see Specifying a Default Value for
a Parameter on page 1-136. For detailed information on the double-dash (--)
and curly-brackets ({}) symbols, see How to Enter SQL Comments on
page 1-9.
,
SQL Data Type
(Subset)
p. 1-137
;
BYTE
RETURNING
TEXT
REFERENCES
RETURNING
Clause
SQL Statements 1-139
CREATE PROCEDURE
Describing the Procedure in the DOCUMENT Clause
The quoted string or strings in the DOCUMENT clause provide a synopsis and
description of the procedure. The DOCUMENT text is intended for the user of
the procedure. Anyone with access to the database can query the
sysprocbody system catalog table to obtain a description of one or all the
procedures stored in the database.
For example, to nd the description of the procedure called do_something,
execute the following query:
SELECT data FROM sysprocbody b, sysprocedures p
WHERE b.procid = p.procid {join between the two catalogs}
AND
p.procname = 'do_something' {look for procedure do_something}
AND b.datakey = 'D' { want user document }
ORDER BY b.seqno; { ... in order }
The rows returned are the complete text as supplied in the DOCUMENT
clause of the CREATE PROCEDURE statement.
CREATE PROCEDURE ret_sal (dep_no INT, name CHAR(8) default user)
RETURNING INT;
.
.
.
END PROCEDURE
DOCUMENT
'Usage: salary (dept [required], name [default: your name])',
'returns your (or someone elses) salary',
'Warning: This procedure sends mail on illegal use'
WITH LISTING IN '/usr/tmp/sal.warnings';
WITH LISTING IN Option
The WITH LISTING IN option species a lename where compile time
warnings are sent. This listing le is created on the computer where the
database resides. After you compile a procedure, this le holds one or more
warning messages.
If you specify a lename but not a directory in the pathname variable, the
default directory is your home directory on the computer where the database
resides. If you do not have a home directory on this computer, the le is
created in the root directory (the directory named /).
If you do not use the WITH LISTING IN option, the compiler does not generate
a list of warnings.
1-140 Informi x Gui de to SQL: Syntax
CREATE PROCEDURE
The Statement Block
Statement
Block BEGIN END
CONTINUE
Statement
p. 2-7
IF Statement
p. 2-27
EXIT Statement
p. 2-16
FOR Statement
p. 2-18
FOREACH Statement
p. 2-23
LET Statement
p. 2-31
RAISE EXCEPTION
Statement
p. 2-39
RETURN Statement
p. 2-41
TRACE Statement
p. 2-46
WHILE Statement
p. 2-49
SYSTEM Statement
p. 2-43
EXECUTE PROCEDURE
Statement
p. 1-293
CALL Statement
p. 2-4
ON
EXCEPTION
Statement
p. 2-34
DEFINE
Statement
p. 2-8
Statement Block
Subset of SQL
Statement
p. 1-141
;
SQL Statements 1-141
CREATE PROCEDURE
The statement block can be empty, which results in a procedure that does
nothing. Also, you cannot close the current database or select a new database
within a procedure. And you cannot drop the current procedure within a
procedure. You can, however, drop another procedure.
Subset of SQL Statements Allowed in the Statement Block
You can use any SQL statement in the statement block, except those listed in
Figure 1-1.
Figure 1-1
SQL Statements That Cannot Be Used in a Stored Procedure
Restrictions on SELECT Statement
You can use a SELECT statement in only two cases:
I You can use the INTO TEMP clause to put the results of the SELECT
statement into a temporary table.
I You can use the SELECT...INTO form of the SELECT statement to put
the resulting values into procedure variables.
CHECK TABLE FREE
CLOSE GET DESCRIPTOR
CLOSE DATABASE INFO
CONNECT LOAD
CREATE DATABASE OPEN
CREATE PROCEDURE OUTPUT
CREATE PROCEDURE FROM PREPARE
DATABASE PUT
DECLARE REPAIR
DESCRIBE ROLLFORWARD DATABASE
EXECUTE SET DESCRIPTOR
EXECUTE IMMEDIATE START DATABASE
FETCH UNLOAD
FLUSH WHENEVER
1-142 Informi x Gui de to SQL: Syntax
CREATE PROCEDURE
Support for Roles and User Identity
You can use roles with stored procedures. You can execute role-related
statements (CREATE ROLE, DROP ROLE, and SET ROLE) and SET SESSION
AUTHORIZATION statements within a stored procedure. You can also grant
privileges to roles with the GRANT statement within a procedure. Privileges
that a user has acquired through enabling a role or by a SET SESSION
AUTHORIZATION statement are not relinquished when a procedure is
executed.
For further information about roles, see the CREATE ROLE, DROP ROLE,
GRANT, REVOKE, and SET ROLE statements in this guide.
Restrictions on a Procedure Called in a Data Manipulation Statement
If a stored procedure is called as part of an INSERT, UPDATE, DELETE, or
SELECT statement, the called procedure cannot execute any statement listed
in Figure 1-2. This restriction ensures that the stored procedure cannot make
changes that affect the SQL statement that contains the procedure call.
Figure 1-2
SQL Statements Not Allowed in a Procedure That a Data Manipulation Statement Calls
ALTER FRAGMENT DROP SYNONYM
ALTER INDEX DROP TABLE
ALTER OPTICAL DROP TRIGGER
ALTER TABLE DROP VIEW
BEGIN WORK INSERT
COMMIT WORK RENAME COLUMN
CREATE TRIGGER RENAME TABLE
DELETE ROLLBACK WORK
DROP DATABASE SET CONSTRAINTS
DROP INDEX UPDATE
DROP OPTICAL
SQL Statements 1-143
CREATE PROCEDURE
For example, if you use the following INSERT statement, the execution of the
called procedure dup_name is restricted:
CREATE PROCEDURE sp_insert ()
.
.
.
INSERT INTO q_customer
VALUES (SELECT * FROM customer
WHERE dup_name ('lname') = 2)
.
.
.
END PROCEDURE;
In this example, dup_name cannot execute the statements listed in
Figure 1-2. However, if dup_name is called within a statement that is not an
INSERT, UPDATE, SELECT, or DELETE statement (namely EXECUTE
PROCEDURE), dup_name can execute the statements listed in Figure 1-2.
You can use the BEGIN WORK and COMMIT WORK statements in procedures.
You can start a transaction, nish a transaction, or start and nish a trans-
action in a procedure. If you start a transaction in a procedure that is executed
remotely, you must nish the transaction before the procedure exits.
References
See the CREATE PROCEDURE FROM, DROP PROCEDURE, GRANT, EXECUTE
PROCEDURE, PREPARE, UPDATE STATISTICS, and REVOKE statements in this
manual.
In the Informix Guide to SQL: Tutorial, see the discussion of creating and using
stored procedures in Chapter 12.
1-144 Informi x Gui de to SQL: Syntax
CREATE PROCEDURE FROM
CREATE PROCEDURE FROM
Use the CREATE PROCEDURE FROM statement to create a procedure. The
actual text of the procedure resides in a separate le.
Syntax
Usage
The lename that is provided in this statement is relative; if a simple lename
is provided, the database server looks for the le in the current directory.
References
See the CREATE PROCEDURE statement in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of creating and using
stored procedures in Chapter 12.
Element Purpose Restrictions Syntax
lename The pathname and lename of
the le that contains the full text
of a CREATE PROCEDURE
statement. The default
pathname is the current
directory.
The specied le must exist. The pathname and
lename must
conform to the
conventions of your
operating system.
variable name The name of a program variable
that holds the value of lename
The le that is specied in the
program variable must exist.
The name must
conform to
language-specic
rules for variable
names.
ESQL
' lename'
variable
name
CREATE PROCEDURE FROM
+
SQL Statements 1-145
CREATE ROLE
CREATE ROLE
Use the CREATE ROLE statement to create a new role.
Syntax
Usage
The database administrator (DBA) uses the CREATE ROLE statement to create
a new role. A role can be considered as a classication, with privileges on
database objects granted to the role. The DBA can assign the privileges of a
related work task, such as engineer, to a role and then grant that role to users,
instead of granting the same set of privileges to every user.
After a role is created, the DBA can use the GRANT statement to grant the role
to users or to other roles. When a role is granted to a user, the user must use
the SET ROLE statement to enable the role. Only then can the user use the
privileges of the role.
Element Purpose Restrictions Syntax
role name Name assigned to a role created
by the DBA
Maximum number of characters
is 8.
Identier, p. 1-723
A role name cannot be a user
name known to the database
server or the operating system of
the database server. A role name
cannot be in the username
column of the sysusers system
catalog table or in the grantor or
grantee columns of the
systabauth, syscolauth,
sysprocauth, sysfragauth, and
sysroleauth system catalog
tables.
+
CREATE ROLE role name
OL
1-146 Informi x Gui de to SQL: Syntax
CREATE ROLE
The CREATE ROLE statement, when used with the GRANT and SET ROLE
statements, allows a DBA to create one set of privileges for a role and then
grant the role to many users, instead of granting the same set of privileges to
many users.
A role exists until it is dropped either by the DBA or by a user to whom the
role was granted with the WITH GRANT OPTION. Use the DROP ROLE
statement to drop a role.
To create the role engineer, enter the following statement:
CREATE ROLE engineer
References
See the DROP ROLE, GRANT, REVOKE, and SET ROLE statements in this
manual.
SQL Statements 1-147
CREATE SCHEMA
CREATE SCHEMA
Purpose
The CREATE SCHEMA statement allows you to issue a block of CREATE and
GRANT statements as a unit. It allows you to specify an owner of your choice
for all objects that the CREATE SCHEMA statement creates.
Syntax
+
CREATE INDEX
Statement
p. 1-109
CREATE VIEW
Statement
p. 1-224
CREATE SYNONYM
Statement
p. 1-150
GRANT
Statement
p. 1-340
+
user
name
CREATE SCHEMA
AUTHORIZATION
CREATE TABLE
Statement
p. 1-154
DB
CREATE TRIGGER
Statement
p. 1-192
CREATE OPTICAL
CLUSTER
Statement
see INFORMIX-
OnLine/Optical
User Manual
OP
1-148 Informi x Gui de to SQL: Syntax
CREATE SCHEMA
Usage
You cannot issue the CREATE SCHEMA statement until you create the affected
database.
Users with the Resource privilege can create a schema for themselves. In this
case, user name must be the name of the person with the Resource privilege
who is running the CREATE SCHEMA statement. Anyone with the DBA
privilege can also create a schema for someone else. In this case, user name can
identify a user other than the person who is running the CREATE SCHEMA
statement.
You can put CREATE and GRANT statements in any logical order within the
statement, as the following example shows. Statements are considered part
of the CREATE SCHEMA statement until a semicolon or an end-of-le symbol
is reached.
CREATE SCHEMA AUTHORIZATION sarah
CREATE TABLE mytable (mytime DATE, mytext TEXT)
GRANT SELECT, UPDATE, DELETE ON mytable TO rick
CREATE VIEW myview AS
SELECT * FROM mytable WHERE mytime > '12/31/1993'
CREATE INDEX idxtime ON mytable (mytime);
Element Purpose Restrictions Syntax
user name The name of the user who will
own the objects that the CREATE
SCHEMA statement creates
If the user who issues the
CREATE SCHEMA statement has
the Resource privilege, user name
must be the name of this user. If
the user who issues the CREATE
SCHEMA statement has the DBA
privilege, user name can be the
name of this user or another
user.
Identier, p. 1-723
SQL Statements 1-149
CREATE SCHEMA
Creating Objects Within CREATE SCHEMA
All objects that a CREATE SCHEMA statement creates are owned by user name,
even if you do not explicitly name each object. If you are the DBA, you can
create objects for another user. If you are not the DBA, and you try to create
an object for an owner other than yourself, you receive an error message.
Granting Privileges Within CREATE SCHEMA
You can only grant privileges with the CREATE SCHEMA statement; you
cannot revoke or drop privileges.
Creating Objects or Granting Privileges Outside CREATE
SCHEMA
If you create an object or use the GRANT statement outside a CREATE
SCHEMA statement, you receive warnings if you use the -ansi ag or set
DBANSIWARN.
References
See the CREATE INDEX, CREATE SYNONYM, CREATE TABLE, CREATE VIEW,
and GRANT statements in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of creating the
database in Chapter 9.
1-150 Informi x Gui de to SQL: Syntax
CREATE SYNONYM
CREATE SYNONYM
Use the CREATE SYNONYM statement to provide an alternative name for a
table or view.
Syntax
Usage
Users have the same privileges for a synonym that they have for the table to
which the synonym applies.
The synonym name must be unique; that is, the synonym name cannot be the
same as another database object, such as a table, view, or temporary table.
Once a synonym is created, it persists until the owner executes the DROP
SYNONYM statement. This property distinguishes a synonym from an alias
that you can use in the FROM clause of a SELECT statement. The alias persists
for the existence of the SELECT statement. If a synonym refers to a table or
view in the same database, the synonym is automatically dropped if you
drop the referenced table or view.
You cannot create a synonym for a synonym in the same database.
The owner of the synonym(owner.synonym) qualies the name of a synonym.
The identier owner.synonym must be unique among all the synonyms, tables,
temporary tables, and views in the database. You must specify owner when
you refer to a synonym that another user owns. The following example
shows this convention:
CREATE SYNONYM emp FOR accting.employee
View Name
p. 1-772
+
CREATE SYNONYM FOR
PUBLIC
PRIVATE
Synonym
Name
p. 1-766
Table Name
p. 1-768
ANSI
SQL Statements 1-151
CREATE SYNONYM
You cannot use a ROLLBACK WORK statement to undo a CREATE SYNONYM
statement. If you roll back a transaction that contains a CREATE SYNONYM
statement, the synonym remains, and you do not receive an error message.
You can create a synonym for any table or view in any database on your
database server. Use the owner. convention if the table is part of an
ANSI-compliant database. The following example shows a synonym for a
table outside the current database. It assumes that you are working on the
same database server that contains the payables database.
CREATE SYNONYM mysum FOR payables:jean.summary
You can create a synonym for any table or view that exists on any networked
database server as well as on the database server that contains your current
database. The database server that holds the table must be on-line when you
create the synonym. In a network, INFORMIX-OnLine Dynamic Server veries
that the object of the synonym exists when you create the
synonym.
The following example shows how to create a synonym for an object that is
not in the current database:
CREATE SYNONYM mysum FOR payables@phoenix:jean.summary
The identier mysum now refers to the table jean.summary, which is in the
payables database on the phoenix database server. Note that if the summary
table is dropped from the payables database, the mysum synonym is left
intact. Subsequent attempts to use mysum return the error Table not found.
PUBLIC and PRIVATE Synonyms
If you use the PUBLIC keyword (or no keyword at all), anyone who has access
to the database can use your synonym. If a synonym is public, a user does not
need to know the name of the owner of the synonym. Any synonym in a
database that is not ANSI compliant and was created before Version 5.0 of the
database server is a public synonym.
Synonyms are always private. If you use the PUBLIC or PRIVATE keywords,
you receive a syntax error.
SE
ANSI
1-152 Informi x Gui de to SQL: Syntax
CREATE SYNONYM
If you use the PRIVATE keyword, the synonym can be used only by the owner
of the synonym or if the owners name is specied explicitly with the
synonym. More than one private synonym with the same name can exist in
the same database. However, a different user must own each synonym with
that name.
You can own only one synonym with a given name; you cannot create both
private and public synonyms with the same name. For example, the
following code generates an error:
CREATE SYNONYM our_custs FOR customer;
CREATE PRIVATE SYNONYM our_custs FOR cust_calls;-- ERROR!!!
Synonyms with the Same Name
If you own a private synonym, and a public synonym exists with the same
name, when you use the synonym by its unqualied name, the private
synonym is used.
If you use DROP SYNONYM with a synonym, and multiple synonyms exist
with the same name, the private synonym is dropped. If you issue the DROP
SYNONYM statement again, the public synonym is dropped.
Chaining Synonyms with INFORMIX-OnLine Dynamic Server
If you create a synonym for a table that is not in the current database, and this
table is dropped, the synonym stays in place. You can create a new synonym
for the dropped table, with the name of the dropped table as the synonym
name, which points to another external or remote table. In this way, you can
move a table to a new location and chain synonyms together so that the
original synonyms remain valid. (You can chain as many as 16 synonyms in
this manner.)
The following steps chain two synonyms together for the customer table,
which will ultimately reside on the zoo database server (the CREATE TABLE
statements are not complete):
1. In the stores7 database on the database server that is called training,
issue the following statement:
CREATE TABLE customer (lname CHAR(15)...)
2. On the database server called accntg, issue the following statement:
CREATE SYNONYM cust FOR stores7@training:customer
SQL Statements 1-153
CREATE SYNONYM
3. On the database server called zoo, issue the following statement:
CREATE TABLE customer (lname CHAR(15)...)
4. On the database server called training, issue the following
statement:
DROP TABLE customer
CREATE SYNONYM customer FOR stores7@zoo:customer
The synonymcust on the accntg database server now points to the customer
table on the zoo database server.
The following steps show an example of chaining two synonyms together
and changing the table to which a synonym points:
1. On the database server called training, issue the following
statement:
CREATE TABLE customer (lname CHAR(15)...)
2. On the database server called accntg, issue the following statement:
CREATE SYNONYM cust FOR stores7@training:customer
3. On the database server called training, issue the following
statement:
DROP TABLE customer
CREATE TABLE customer (lastname CHAR(20)...)
The synonymcust on the accntg database server now points to a newversion
of the customer table on the training database server.
References
See the DROP SYNONYM statement in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of synonyms in
Chapter 5 and Chapter 11.
1-154 Informi x Gui de to SQL: Syntax
CREATE TABLE
CREATE TABLE
Use the CREATE TABLE statement to create a new table in the current
database, place data-integrity constraints on its columns or on a combination
of its columns, designate the size of its initial and subsequent extents, and
specify how to lock each table. The statement is also used to fragment tables
into separate dbspaces.
Syntax
Usage
Table names must be unique within a database. However, although
temporary table names must be different from existing table, view, or
synonym names in the current database, they need not be different from
other temporary table names used by other users.
In an ANSI-compliant database, the combination owner.tablename must be
unique within the database.
You cannot use a ROLLBACK WORK statement to undo a CREATE TABLE
statement. If you roll back a transaction that contains a CREATE TABLE
statement, the table remains, and you do not receive an error message.
Using the CREATE TABLE statement outside the CREATE SCHEMA statement
generates warnings if you use the -ansi ag or set DBANSIWARN.
,
TABLE CREATE
Storage
Option
p. 1-183
Table
Name
p. 1-768
,
,
Column
Denition
p. 1-158
( )
Table-Level
Constraint
Denition
p. 1-174 Temp
Table
Clause
p. 1-177
+
WITH
ROWIDS
p. 1-182
OL
ANSI
SE
DB
SQL Statements 1-155
CREATE TABLE
Using the CREATE TABLE statement generates warnings if you use the -ansi
ag or set DBANSIWARN.
Privileges on Tables
By default, all users who have been granted the Connect privilege to a
database have all access privileges (except Alter and References) to the new
table. To further restrict access, use the REVOKE statement to take all access
away fromPUBLIC (everyone on the system). Then, use the GRANT statement
to designate the access privileges that you want to give to specic users.
When set to yes, the environment variable NODEFDAC prevents default
privileges on a new table in a database that is not ANSI compliant from being
granted to PUBLIC. For information about preventing privileges from being
granted to PUBLIC, see the NODEFDAC environment variable in the Informix
Guide to SQL: Reference.
In an ANSI-compliant database, no default table-level privileges exist. You
must grant these privileges explicitly.
Dening Constraints
When you create a table, several elements must be dened. For example, the
table and columns within that table must have unique names. Also, every
table column must have at least a data type associated with it. You can also,
optionally, place several constraints on a given column. For example, you can
indicate that the column has a specic default value or that data entered into
the column must be checked to meet a specic data requirement.
Putting a constraint on a column is similar to putting an index on a column
(using the CREATE INDEX statement). However, if you use constraints instead
of indexes, you can also implement data-integrity constraints and turn
effective checking off and on. For information on data-integrity constraints,
refer to Chapter 3 of the Informix Guide to SQL: Tutorial. For information on
effective checking, see the SET statement on page 1-501.
Important: In a database without logging, detached checking is the only constraint-
checking mode available. Detached checking means that constraint checking is
performed on a row-by-row basis.
ESQL
ANSI
1-156 Informi x Gui de to SQL: Syntax
CREATE TABLE
You can dene constraints at either the column or table level. If you choose to
dene constraints at the column level, you cannot have multiple-column
constraints. In other words, the constraint created at the column level can
apply only to a single column. If you choose to dene constraints at the table
level, you can apply constraints to single or multiple columns. At either level,
single-column constraints are treated the same way.
Whenever you place a data restriction on a column, a constraint is created
automatically. You have the option of specifying a name for the constraint. If
you choose not to specify a name for the constraint, the database server
creates a default constraint name for you automatically.
When you create a constraint of any type, the name of the constraint must be
unique within the database.
When you create a constraint of any type, the owner.name combination (the
combination of the owner name and constraint name) must be unique within
the database.
Limits on Constraint Denitions
You can include 16 columns in a list of columns for a unique, primary-key, or
referential constraint. The total length of all columns cannot exceed 255 bytes.
You can use up to eight columns, inclusive, in an INFORMIX-SE list of
columns. The total length of all columns cannot exceed 120 bytes.
You cannot place a constraint on a violations or diagnostics table. For further
information on violations and diagnostics tables, see the START VIOLATIONS
TABLE statement on page 1-584.
Adding or Dropping Constraints
After you have used the CREATE TABLE statement to place constraints on a
column or set of columns, you must use the ALTER TABLE statement to add
or drop the constraint from the column or composite column list.
ANSI
SE
SQL Statements 1-157
CREATE TABLE
Enforcing Primary-Key, Unique, and Referential Constraints
Primary-key, unique, and referential constraints are implemented as an
ascending index that allows only unique entries or an ascending index that
allows duplicates. When one of these constraints is placed on a column, the
database server performs the following functions:
I Creates a unique index for a unique or primary-key constraint
I Creates a non-unique index for the columns specied in the
referential constraint
However, if a constraint already was created on the same column or set of
columns, another index is not built for the constraints. Instead, the existing
index is shared by the constraints. If the existing index is non-unique, it is
upgraded if a unique or primary-key constraint is placed on that column.
Because these constraints are enforced through indexes, you cannot create an
index (using the CREATE INDEX statement) for a column that is of the same
data type as the constraint placed on that column. For example, if a unique
constraint exists on a column, you can create neither an ascending unique
index for that column nor a duplicate ascending index.
Constraint Names
A row is added to the sysindexes system catalog table for each new primary-
key, unique, or referential constraint that does not share an index with an
existing constraint. The index name in the sysindexes system catalog table is
created with the following format:
[space]<tabid>_<constraint id>
In this format, tabid and constraint id are from the systables and
sysconstraints system catalog tables, respectively. For example, the index
name might be something like this: " 121_13" (quotes used to show the space).
The constraint name must be unique within the database. If you do not
specify a constraint name, the database server generates one for the
sysconstraints system catalog table using the following template:
<constraint type><tabid>_<constraint id>
1-158 Informi x Gui de to SQL: Syntax
CREATE TABLE
In this template, constraint type is the letter u for unique or primary-key
constraints, r for referential constraints, c for check constraints, and n for not
null constraints. For example, the constraint name for a unique constraint
might look like this: u111_14. If the name conicts with an existing identier,
the database server returns an error, and you must then supply a constraint
name.
Object Modes for Constraints
You can specify the object mode for any type of column-level or table-level
constraint. You can set the object mode of the constraint to the enabled,
disabled, or ltering mode. See Constraint-Mode Denitions on page 1-163
for further information on object modes.
Column-Denition Option
Use the column-denition portion of the CREATE TABLE statement to list the
name, data type, default values, and constraints of a single column as well as
to indicate whether the column does not allow duplicate values.
Element Purpose Restrictions Syntax
column name The name of a column in the
table
Name must be unique within a
table, but you can use the same
names in different tables in the
same database.
Identier, p. 1-723
column
name
DEFAULT
Clause
p. 1-159
Data Type
p. 1-664
Column
Denition
Column-Level
Constraint
Denition
p. 1-162
SQL Statements 1-159
CREATE TABLE
The DEFAULT Clause
The default value is inserted into the column when an explicit value is not
specied. If a default is not specied, and the column allows nulls, the default
is NULL. If you designate NULL as the default value for a column, you cannot
specify a not null constraint as part of the column denition.
You cannot designate default values for serial columns. If the column is TEXT
or BYTE data type, you can only designate NULL as the default value.
Element Purpose Restrictions Syntax
literal A literal term that denes alpha
or numeric constant characters
to be used as the default value
for the column
Term must be appropriate type
for the column. See Literal
Terms as Default Values on
page 1-160.
Expression, p. 1-671
DEFAULT
Clause
literal DEFAULT
DATETIME
Field Qualier
p. 1-669
USER
p. 1-678
SITENAME
p. 1-679
DBSERVERNAME
p. 1-679
TODAY
p. 1-680
NULL
CURRENT
p. 1-680
+
+
+
+
OL
1-160 Informi x Gui de to SQL: Syntax
CREATE TABLE
Literal Terms as Default Values
You can designate literal terms as default values. A literal term is a string of
character or numeric constant characters that you dene. To use a literal term
as a default value, you must adhere to the following rules.
Characters must be enclosed in quotation marks. Date literals must be of the
format specied with the DBDATE environment variable. If DBDATE is not
set, the format mm/dd/yyyy is assumed.
For information on using a literal INTERVAL, refer to the Literal INTERVAL
segment on page 1-749. For more information on using a literal DATETIME,
refer to the Literal DATETIME segment on page 1-746.
You cannot designate NULL as a default value for a column that is part of a
primary key.
Use a Literal With Columns of Data Type
INTEGER INTEGER, SMALLINT, DECIMAL, MONEY, FLOAT,
SMALLFLOAT
DECIMAL DECIMAL, MONEY, FLOAT, SMALLFLOAT
CHARACTER CHAR, NCHAR, NVARCHAR, VARCHAR, DATE
INTERVAL INTERVAL
DATETIME DATETIME
SQL Statements 1-161
CREATE TABLE
Data Type Requirements for Certain Columns
The following table indicates the data type requirements for columns that
specify the CURRENT, DBSERVERNAME, SITENAME, TODAY, or USER
functions as the default value.
Example of Default Values in Column Denitions
The following example creates a table called accounts. In accounts, the
acc_num, acc_type, and acc_descr columns have literal default values. The
acc_id column defaults to the users login name.
CREATE TABLE accounts (
acc_num INTEGER DEFAULT 0001,
acc_type CHAR(1) DEFAULT 'A',
acc_descr CHAR(20) DEFAULT 'New Account',
acc_id CHAR(8) DEFAULT USER)
Function Name Data Type Requirement
CURRENT DATETIME column with matching qualier
DBSERVERNAME CHAR, NCHAR, NVARCHAR, or VARCHAR column at least
18 characters long
SITENAME CHAR, NCHAR, NVARCHAR, or VARCHAR column at least
18 characters long
TODAY DATE column
USER CHAR or VARCHAR column at least 8 characters long
1-162 Informi x Gui de to SQL: Syntax
CREATE TABLE
Specifying a Not Null Constraint in a Column Denition
If you do not indicate a default value for a column, the default is NULL unless
you place a not null constraint on the column. In this case, no default value
exists for the column. The following example creates the newitems table. In
newitems, the column manucode does not have a default value nor does it
allow nulls.
CREATE TABLE newitems (
newitem_num INTEGER,
manucode CHAR(3) NOT NULL,
promotype INTEGER,
descrip CHAR(20))
If you place a not null constraint on a column (and no default value is
specied), you must enter a value into this column when you insert a row or
update that column in a row. If you do not enter a value, the database server
returns an error.
Column-Level Constraint-Denition Option
UNIQUE
DISTINCT
PRIMARY
KEY
REFERENCES
Clause
p. 1-165
CHECK
Clause
p. 1-172
Constraint-
Mode
Denitions
p. 1-163
+
Column-Level
Constraint
Denition
+
Constraint-
Mode
Denitions
p. 1-163
+
NOT
NULL
SQL Statements 1-163
CREATE TABLE
Unlike the table-level constraint-denition option, constraints at the column
level are limited to a single column. In other words, you cannot create not
null, check, unique, primary, or foreign-key multiple-column constraints. For
more information on the unique, primary-key, and check constraints, see
Table-Level Constraint-Denition Option on page 1-174.
The following example creates a simple table with two constraints, a
primary-key constraint named num on the acc_num column and a unique
constraint named code on the acc_code column:
CREATE TABLE accounts (
acc_num INTEGER PRIMARY KEY CONSTRAINT num,
acc_code INTEGER UNIQUE CONSTRAINT code,
acc_descr CHAR(30))
Using Blob Data Types in Constraints
You cannot place a unique, primary-key, or referential constraint on BYTE or
TEXT columns. However, you can check for null or non-null values if you
place a check constraint on a BYTE or TEXT column.
Constraint-Mode Denitions
CONSTRAINT
FILTERING
DISABLED
WITH
ERROR
Constraint-Mode
Denitions
Constraint
Name
p. 1-658
ENABLED
WITHOUT
ERROR
1-164 Informi x Gui de to SQL: Syntax
CREATE TABLE
You can use the Constraint-Mode Denitions option for the following
purposes:
I You can assign a name to a column-level or table-level constraint.
I You can set any type of column-level constraint or table-level
constraint to the disabled, enabled, or ltering-object modes.
Description of Constraint Modes
You can set constraints in the following modes: disabled, enabled, and
ltering. The following list explains these modes and options.
If you choose ltering mode, you can specify the WITHOUT ERROR or WITH
ERROR options. The following list explains these options.
Constraint
Mode Effect
disabled A constraint created in disabled mode is not enforced during insert,
delete, and update operations.
enabled A constraint created in enabled mode is enforced during insert,
delete, and update operations. If a target row causes a violation of
the constraint, the statement fails.
ltering A constraint created in ltering mode is enforced during insert,
delete, and update operations. If a target row causes a violation of
the constraint, the statement continues processing, but the bad row
is written to the violations table associated with the target table.
Diagnostic information about the constraint violation is written to
the diagnostics table associated with the target table.
Error Option Effect
WITHOUT
ERROR
When a ltering-mode constraint is violated during an insert,
delete, or update operation, no integrity-violation error is returned
to the user.
WITH ERROR When a ltering-mode constraint is violated during an insert,
delete, or update operation, an integrity-violation error is returned
to the user.
SQL Statements 1-165
CREATE TABLE
Using Constraint-Mode Denitions
You must observe the following rules concerning the use of constraint-mode
denitions:
I If you do not specify the object mode of a column-level constraint or
table-level constraint explicitly, the default mode is enabled.
I If you do not specify the WITH ERRORor WITHOUTERRORoption for
a ltering-mode constraint, the default error option is WITHOUT
ERROR.
I Constraints dened on temporary tables are always in the enabled
mode. You cannot create a constraint on a temporary table in the
disabled or ltering mode, nor can you use the SET statement to
switch the object mode of a constraint on a temporary table to the
disabled or ltering mode.
I You cannot assign a name to a not null constraint on a temporary
table.
I You cannot create a constraint on a table that is serving as a violations
or diagnostics table for another table.
The REFERENCES Clause
REFERENCES
Clause
( )
,
column
name
REFERENCES
ON DELETE CASCADE
+
OL
table
name
1-166 Informi x Gui de to SQL: Syntax
CREATE TABLE
Restrictions on the Column Name Variable in the REFERENCES Clause
You must observe the following restrictions on the column name variable.
Table Where the Column Resides
The referenced column (the column that you specify in the column name
variable) can be in the same table as the referencing column, or the referenced
column can be in a different table.
Existing Constraints on the Column
The referenced column must be a unique or primary-key column. That is, the
referenced column in the referenced table must already have a unique or
primary-key constraint placed on it.
Data Type of the Column
The data type of the referenced column must be identical to the data type of
the referencing column. The only exception is that a referencing column must
be INTEGER if the referenced column is SERIAL.
Element Purpose Restrictions Syntax
column name A referenced column or columns
in the referenced table. If the
referenced table is different from
the referencing table, the default
is the primary-key column or
columns. If the referenced table
is the same as the referencing
table, there is no default.
You must observe restrictions on
the table where the column
resides, the existing constraints
on the column, the data type of
the column, and the maximum
number of columns. See
Restrictions on the Column
Name Variable in the REFER-
ENCES Clause below.
Identier, p. 1-723
table name The name of the referenced table The referenced table can be the
same table as the referencing
table, or it can be a different
table. The referenced table must
reside in the same database as
the referencing table.
Table Name, p. 1-768
SQL Statements 1-167
CREATE TABLE
Number of Columns
You can specify only one column when you are using the REFERENCES clause
at the column level (that is, when you are using the REFERENCES clause in the
Column-Denition option).
You can specify multiple columns when you are using the REFERENCES
clause at the table level (that is, when you are using the REFERENCES clause
in the Constraint-Denition option).
The maximum number of columns and the total length of columns vary with
the database server, as the following list describes:
I If you are using INFORMIX-OnLine Dynamic Server, the maximum
number of columns is 16, and the total length of the columns cannot
exceed 255 bytes.
I If you are using INFORMIX-SE, the maximum number of columns is
8, and the total length of the columns cannot exceed 120 bytes.
Using the REFERENCES Clause
You can use the REFERENCES clause to establish a referential relationship
between two tables or within the same table.
The table referenced in the REFERENCES clause must reside in the same
database as the created table.
Referenced and Referencing Column Requirements
In a referential relationship, the referenced column is a column or set of
columns within a table that uniquely identies each row in the table. In other
words, the referenced column or set of columns must be a unique or primary-
key constraint. If the referenced columns do not meet this criteria, the
database server returns an error.
Unlike a referenced column, the referencing column or set of columns can
contain null and duplicate values. However, every non-null value in the
referencing columns must match a value in the referenced columns. When a
referencing column meets this criteria, it is called a foreign key.
1-168 Informi x Gui de to SQL: Syntax
CREATE TABLE
The relationship between referenced and referencing columns is called a
parent-child relationship, where the parent is the referenced column (primary
key) and the child is the referencing column (foreign key). This parent-child
relationship is established through a referential constraint.
A referential constraint can be established between two tables or within the
same table. For example, you can have an employee table where the emp_no
column uniquely identies every employee through an employee number.
The mgr_no column in that table contains the employee number of the
manager who manages that employee. In this case, mgr_no is the foreign key
(the child) that references emp_no, the primary key (the parent).
A referential constraint must have a one-to-one relationship between refer-
encing and referenced columns. In other words, if the primary key is a set of
columns, then the foreign key also must be a set of columns that corresponds
to the primary key. The following example creates two tables. The rst table
has a multiple-column primary key, and the second table has a referential
constraint that references this key.
CREATE TABLE accounts (
acc_num INTEGER,
acc_type INTEGER,
acc_descr CHAR(20),
PRIMARY KEY (acc_num, acc_type))
CREATE TABLE sub_accounts (
sub_acc INTEGER PRIMARY KEY,
ref_num INTEGER NOT NULL,
ref_type INTEGER NOT NULL,
sub_descr CHAR(20),
FOREIGN KEY (ref_num, ref_type) REFERENCES accounts
(acc_num, acc_type))
In this example, the foreign key of the sub_accounts table, ref_numand
ref_type, references the primary key, acc_num and acc_type, in the accounts
table. If, during an insert, you tried to insert a row into the sub_accounts
table whose value for ref_num and ref_type did not exactly correspond to
the values for acc_numand acc_type in an existing row in the accounts table,
the database server would return an error. Likewise, if you attempt to update
sub_accounts with values for ref_numand ref_type that do not correspond
to an equivalent set of values in acc_numand acc_type (from the accounts
table), the database server returns an error.
SQL Statements 1-169
CREATE TABLE
If you are referencing a primary key in another table, you do not have to state
the primary-key columns in that table explicitly. Referenced tables that do not
specify the referenced columns default to the primary-key columns. The
references section of the previous example can be rewritten, as the following
example shows:
.
.
.
FOREIGN KEY (ref_num, ref_type) REFERENCES accounts
.
.
.
Because acc_numand acc_type is the primary key of the accounts table, and
no other columns are specied, the foreign key, ref_numand ref_type,
references those columns.
Data Type Restrictions
The data types of the referencing and referenced columns must be identical
unless the column is SERIAL data type. You can specify SERIAL for the
primary key of the parent table and INTEGER for the foreign key. In the
previous example, a one-to-one correspondence exists between the data
types of the primary and foreign keys. If the primary-key column was
dened as type SERIAL, the statement would still be successfully executed.
You cannot place a referential constraint on a BYTE or TEXT column.
Locking Implications
When you create a referential constraint, an exclusive lock is placed on the
referenced table. The lock is released when the CREATE TABLE statement is
done. If you are creating a table in a database with transactions, and you are
using transactions, the lock is released at the end of the transaction.
1-170 Informi x Gui de to SQL: Syntax
CREATE TABLE
Using REFERENCES in a Column Denition
When you use the REFERENCES clause at the column-denition level, you can
reference a single column. The following example creates two tables,
accounts and sub_accounts. A referential constraint is created between the
foreign key, ref_num, in the sub_accounts table and the primary key,
acc_num, in the accounts table.
CREATE TABLE accounts (
acc_num INTEGER PRIMARY KEY,
acc_type INTEGER,
acc_descr CHAR(20))
CREATE TABLE sub_accounts (
sub_acc INTEGER PRIMARY KEY,
ref_num INTEGER REFERENCES accounts (acc_num),
sub_descr CHAR(20))
Note that ref_numis not explicitly called a foreign key in the column-
denition syntax. At the column level, the foreign-key designation is applied
automatically.
If you are referencing the primary key in another table, you do not need to
specify the referenced table column. In the preceding example, you can
simply reference the accounts table without specifying a column. Because
acc_num is the primary key of the accounts table, it becomes the referenced
column by default.
Using the ON DELETE CASCADE Clause
Cascading deletes allow you to specify whether you want rows deleted in the
child table when rows are deleted in the parent table. Unless you specify
cascading deletes, the default prevents you from deleting data in the parent
table if child tables are associated with the parent table. With the ONDELETE
CASCADE clause, when you delete a row in the parent table, any rows
associated with that row (foreign keys) in a child table are also deleted. The
principal advantage to the cascading deletes feature is that it allows you to
reduce the quantity of SQL statements you need to perform delete actions.
SQL Statements 1-171
CREATE TABLE
For example, the all_candy table contains the candy_num column as a
primary key. The hard_candy table refers to the candy_num column as a
foreign key. The following CREATE TABLE statement creates the hard_candy
table with the cascading-delete clause on the foreign key:
CREATE TABLE hard_candy (candy_num INT, candy_flavor CHAR(20),
FOREIGN KEY (candy_num) REFERENCES all_candy ON DELETE CASCADE);
With cascading deletes specied on the child table, in addition to deleting a
candy item from the all_candy table, the delete cascades to the hard_candy
table associated with the candy_num foreign key.
You specify cascading deletes with the REFERENCES clause on a column-level
or table-level constraint. You need only the References privilege to indicate
cascading deletes. You do not need the Delete privilege to perform cascading
deletes; however, you do need the Delete privilege on tables referenced in the
DELETE statement. After you indicate cascading deletes, when you delete a
row from a parent table, OnLine deletes any associated matching rows from
the child table.
What Happens to Multiple Children Tables
If you have a parent table with two child constraints, one child with
cascading deletes specied and one child without cascading deletes, and you
attempt to delete a row from the parent table that applies to both child tables,
the delete statement fails, and no rows are deleted from either the parent or
child tables.
Locking and Logging
During deletes, the database server places locks on all qualifying rows of the
referenced and referencing tables. You must turn logging on when you
perform the deletes. If logging is turned off in a database, even temporarily,
deletes do not cascade. This restriction applies because if logging is turned
off, you cannot roll back any actions. For example, if a parent row is deleted,
and the system crashes before the child rows are deleted, the database will
have dangling child records, which violates referential integrity. However,
when logging is turned back on, subsequent deletes cascade.
1-172 Informi x Gui de to SQL: Syntax
CREATE TABLE
Restriction on Cascading Deletes
Cascading deletes can be used for most deletes. The only exception is
correlated subqueries. In correlated subqueries, the subquery (or inner
SELECT) is correlated when the value it produces depends on a value
produced by the outer SELECT statement that contains it. If you have imple-
mented cascading deletes, you cannot write deletes that use a child table in
the correlated subquery. You receive an error when you attempt to delete
from a query that contains such a correlated subquery.
See Chapter 4 of the Informix Guide to SQL: Tutorial for a detailed discussion
about cascading deletes.
The CHECK Clause
Check constraints allow you to designate conditions that must be met before
data can be assigned to a column during an INSERT or UPDATE statement. If
a row evaluates to false for any check constraint dened on a table during an
insert or update, the database server returns an error.
Check constraints are dened using search conditions. The search condition
cannot contain subqueries; aggregates; host variables; rowids; the CURRENT,
USER, SITENAME, DBSERVERNAME, or TODAY functions; or stored procedure
calls.
Warning: When you specify a date value in a search condition, make sure to specify
4 digits instead of 2 digits for the year. When you specify a 4-digit year, the
DBCENTURY environment variable has no effect on how the database server
interprets the search condition. When you specify a 2-digit year, the DBCENTURY
environment variable can affect how the database server interprets the search condi-
tion, so the check constraint might not work as you intended. See the Informix
Guide to SQL: Reference for more information on the DBCENTURY environment
variable.
CHECK
Clause
( )
Condition
p. 1-643
CHECK
SQL Statements 1-173
CREATE TABLE
Dening Check Constraints at the Column Level
If you dene a check constraint at the column level, the only column that the
check constraint can check against is the column itself. In other words, the
check constraint cannot depend upon values in other columns of the table.
For example, as the following statement shows, the table acct_chk has two
columns with check constraints:
CREATE TABLE acct_chk (
chk_id SERIAL PRIMARY KEY,
debit INTEGER REFERENCES accounts (acc_num),
debit_amt MONEY CHECK (debit_amt BETWEEN 0 AND 99999),
credit INTEGER REFERENCES accounts (acc_num),
credit_amt MONEY CHECK (credit_amt BETWEEN 0 AND 99999))
Both debit_amt and credit_amt are columns of MONEY data type whose
values must be between 0 and 99999. If, however, you wanted to test that
both columns contained the same value, you would not be able to create the
check constraint at the column level. To create a constraint that checks values
in more than one column, you must dene the constraint at the table level.
Dening Check Constraints at the Table Level
When a check constraint is dened at the table level, each column in the
search condition must be a column in that table. You cannot create a check
constraint for columns across tables. The next example builds the same table
and columns as the previous example. However, the check constraint now
spans two columns in the table.
CREATE TABLE acct_chk (
chk_id SERIAL PRIMARY KEY,
debit INTEGER REFERENCES accounts (acc_num),
debit_amt MONEY,
credit INTEGER REFERENCES accounts (acc_num),
credit_amt MONEY,
CHECK (debit_amt = credit_amt))
In this example, the debit_amt and credit_amt columns must equal each
other, or the insert or update fails.
1-174 Informi x Gui de to SQL: Syntax
CREATE TABLE
Table-Level Constraint-Denition Option
Restrictions on the Column Name Variable in the Table-Level
Constraint-Denition Option
You must observe the following restrictions on the column name variable:
I General restrictions that apply regardless of the type of constraint
you are dening
I Specic restrictions that depend on the type of constraint you are
dening
Element Purpose Restrictions Syntax
column name The name of the column or
columns on which the constraint
is placed
You must observe general
restrictions that apply regardless
of the type of constraint you are
dening. You must also observe
specic restrictions that depend
on the type of constraint you are
dening. See Restrictions on
the Column Name Variable in
the Table-Level Constraint-
Denition Option below.
Identier, p. 1-723
UNIQUE
FOREIGN KEY
REFERENCES
Clause
p. 1-165
CHECK
Clause
p. 1-172
column
name
) (
Table-Level
Constraint Denition
PRIMARY
KEY ,
+
Constraint-Mode
Denitions
p. 1-163
+
DISTINCT
column
name
) (
,
SQL Statements 1-175
CREATE TABLE
General Restrictions
The column must be a column in the table, and the column cannot be a BYTE
or TEXT column.
The maximum number of columns and the total length of the columns vary
with the database server. If you are using INFORMIX-OnLine Dynamic Server,
you can include up to 16 columns in a list of columns. The total length of all
the columns cannot exceed 255 bytes. If you are using INFORMIX-SE, you can
use up to 8 columns in a list of columns. The total length of all the columns
cannot exceed 120 bytes.
Restrictions for Unique Constraints
When you dene a unique constraint (UNIQUE or DISTINCT keywords), a
column cannot appear in the constraint list more than once.
You cannot place a unique constraint on a column on which you have already
placed a primary-key constraint.
Restrictions for Primary-Key Constraints
You can dene a primary-key constraint (PRIMARY KEY keywords) on only
one column or one set of columns in a table.You cannot dene a column or
set of columns as a primary key if you have already dened another column
or set of columns as the primary key.
Restrictions for Referential Constraints
When you specify a referential constraint, the data type of the referencing
column (the column you specify after the FOREIGN KEY keywords) must
match the data type of the referenced column (the column you specify in the
REFERENCES clause). The only exception is that the referencing column must
be INTEGER if the referenced column is SERIAL.
Using the Table-Level Constraint-Denition Option
The table-level constraint-denition option allows you to create constraints
for a single column or a set of columns. You can create the following types of
constraints with this option: unique, primary-key, foreign-key (referential),
and check constraints.
1-176 Informi x Gui de to SQL: Syntax
CREATE TABLE
Dening a Column as Unique
Use the UNIQUE keyword to require that a single column or set of columns
accepts only unique data. You cannot insert duplicate values in a column that
has a unique constraint.
Each column named in a unique constraint must be a column in the table and
cannot appear in the constraint list more than once. The following example
creates a simple table that has a unique constraint on one of its columns:
CREATE TABLE accounts (a_name CHAR(12), a_code SERIAL,
UNIQUE (a_name) CONSTRAINT acc_name)
If you want to dene the constraint at the column level instead, simply
include the keywords UNIQUE and CONSTRAINT in the column denition, as
the following example shows:
CREATE TABLE accounts
(a_name CHAR(12) UNIQUE CONSTRAINT acc_name, a_code SERIAL)
You cannot place a unique constraint on a BYTE or TEXT column.
Dening a Column as a Primary Key
A primary key is a column or set of columns that contains a non-null unique
value for each row in a table. A table can have only one primary key, and a
column that is dened as a primary key cannot also be dened as unique. In
the previous two examples, a unique constraint was placed on the column
a_name. The following example creates this column as the primary key for
the accounts table:
CREATE TABLE accounts
(a_name CHAR(12), a_code SERIAL, PRIMARY KEY (a_name))
You cannot place a primary-key constraint on a BYTE or TEXT column.
Dening a Column as a Foreign Key
A foreign key joins and establishes dependencies between tables. A foreign
key references a unique or primary key in a table. For every entry in the
foreign-key columns, a matching entry must exist in the unique or primary-
key columns if all foreign-key columns contain non-null values. You cannot
make BYTE or TEXT columns foreign keys.
SQL Statements 1-177
CREATE TABLE
TEMP TABLE Clause
Temporary tables created with the CREATE TEMP TABLE statement are called
explicit temporary tables. Explicit temporary tables can also be created with
the SELECT ... INTO TEMP statement.
When an application creates an explicit temporary table, it exists until one of
the following situations occurs:
I The application terminates.
I The application closes the database where the table was created. In
this case, the table is dropped only if the database does transaction
logging, and the temporary table was not created with the WITH NO
LOG option.
I The application closes the database where the table was created and
opens a database in a different database server (a second OnLine or
an SE database server).
When any of these events occur, the temporary table is deleted.
Element Purpose Restrictions Syntax
temp table name The name that you want to
assign to the temporary table
The name must be different from
any existing table, view, or
synonym name in the current
database, but it does not have to
be different from other
temporary table names used by
other users.
Identier, p. 1-723
(
)
Temp Table
Table-Level
Constraint
p. 1-181
,
TEMP
TABLE
temp
table
name
,
,
Temporary
Table
Column
Denition
p. 1-180
Temp
Table
Clause
WITH NO LOG
1-178 Informi x Gui de to SQL: Syntax
CREATE TABLE
The INFO statement and the Info Menu Option cannot be used with
temporary tables.
Temporary table names must be different from existing table, view, or
synonym names in the current database; however, they need not be different
from other temporary table names used by other users.
Temporary tables that are created as a part of processing are called implicit
temporary tables. Implicit temporary tables are discussed in the
INFORMIX-OnLine Dynamic Server Administrators Guide.
You can specify where temporary tables are created with the CREATE TEMP
TABLE statement, environment variables, and ONCONFIG parameters.
OnLine stores temporary tables in the following order:
1. The IN dbspace clause
You can specify the dbspace where you want the temporary table
stored with the IN dbspace clause of the CREATE TABLE statement.
2. The dbspaces you specify when you fragment temporary tables
Use the FRAGMENT BY clause of the CREATE TABLE statement to
fragment regular and temporary tables.
3. The DBSPACETEMP environment variable
If you do not use the IN dbspace clause or the FRAGMENT BY clause to
fragment the table, OnLine checks to see if the DBSPACETEMP
environment variable is set. The DBSPACETEMP environment
variable lists dbspaces where temporary tables can be stored. This
list can include standard dbspaces, temporary dbspaces, or both. If
the environment variable is set, OnLine stores the temporary table in
one of the dbspaces specied in that list.
4. The ONCONFIG parameter DBSPACETEMP
You can specify a location for temporary tables with the ONCONFIG
parameter DBSPACETEMP.
If you do not use the INdbspace clause, the FRAGMENT BY clause to fragment
the table, the DBSPACETEMP environment variable, or the ONCONFIG
parameter DBSPACETEMP, the temporary tables are created in the same
dbspace as your database server.
DB
SQL Statements 1-179
CREATE TABLE
You can specify more than one dbspace for the DBSPACETEMP environment
variable. For example, you can specify the following dbspace denitions for
the DBSPACETEMP environment variable:
setenv DBSPACETEMP tempspc1:tempspc2:tempspc3
Each temporary table that you create round-robins to a dbspace. For
example, if you created three temporary tables, the rst one, temp1, would
go into the dbspace called tempspc1; the second one, temp2, would go into
tempspc2; and the third one, temp3, would go into tempspc3.
Temporary tables are created in the directory specied by the DBTEMP
environment variable. If the DBTEMP environment variable is not set,
temporary tables are created in the directory of the database (that is, the
.dbs directory).
For additional information about the DBSPACETEMP environment variable,
see Chapter 4, Environment Variables in the Informix Guide to SQL:
Reference. For additional information about the ONCONFIG parameter
DBSPACETEMP, see the INFORMIX-OnLine Dynamic Server Administrators
Guide.
If you have the Connect privilege on a database, you can create temporary
tables. Once a temporary table is created, you can build indexes on the table.
However, you are the only user who can see the temporary table.
Fragmenting Temporary Tables
You can create temporary tables with a fragmentation strategy.
SE
1-180 Informi x Gui de to SQL: Syntax
CREATE TABLE
Temporary-Table Column Denition
You dene columns for temporary tables in the same manner as you dene
columns for regular database tables. The only difference is the option for
dening column constraints, which is dened in the following section.
For more information about dening single columns for temporary tables,
see the Column-Denition Option on page 1-158.
Temporary-Table Column Constraint Denition
Element Purpose Restrictions Syntax
column name The name of a column in the
table
Name must be unique within a
table, but you can use the same
names in different tables in the
same database.
Identier, p. 1-723
column
name
NOT NULL
DEFAULT
Clause
p. 1-159
Data Type
p. 1-664
Temporary Table Column
Denition
Temp Table
Column
Constraint
Denition
p. 1-180
PRIMARY
KEY
CHECK
Clause
p. 1-172
Temp Table Column
Constraint Denition
DISTINCT
UNIQUE
+
SQL Statements 1-181
CREATE TABLE
Temporary-table column constraints are the same as column constraints for
regular tables, with the following exceptions:
I You cannot place referential constraints on columns in a temporary
table. Temporary columns cannot be referenced or referencing
columns.
I The Constraint Mode Denitions option is not available for columns
in temporary tables. You cannot assign a name to a constraint on a
temporary-table column. You cannot set the object mode of a
constraint on a temporary-table column. See Constraint-Mode
Denitions on page 1-163 for further information on this option.
For more information about column constraints in regular tables, see
Column-Level Constraint-Denition Option on page 1-162.
Table-Level Constraint for Temporary Tables
You can place a table-level constraint on one or more columns of a temporary
table.
Element Purpose Restrictions Syntax
column name The name of the column or
columns on which the constraint
is placed
See Restrictions on Table-Level
Constraints for Temporary
Tables on page 1-182.
Identier, p. 1-723
UNIQUE
column
name
,
) (
CHECK
Clause
p. 1-172
Temp Table Table-Level
Constraint
DISTINCT
PRIMARY
KEY
+
1-182 Informi x Gui de to SQL: Syntax
CREATE TABLE
Restrictions on Table-Level Constraints for Temporary Tables
Table-level constraints are dened for temporary tables in the same manner
as regular database tables, with the following exceptions:
I You cannot place referential constraints on columns in a temporary
table. In other words, temporary columns cannot be referenced or
referencing columns.
I The Constraint Mode Denitions option is not available for
constraints on columns in temporary tables. You cannot assign a
name to a constraint on a temporary-table column. You cannot set
the object mode of a constraint on a temporary-table column. See
Constraint-Mode Denitions on page 1-163 for further
information on this option.
For more information about table-level constraints on regular tables, see
Table-Level Constraint-Denition Option on page 1-174.
WITH NO LOG Option for Temporary Tables
You must use the WITH NO LOG keywords on temporary tables created in
temporary dbspaces.
Using the WITH NO LOG keywords prevents logging of temporary tables in
databases started with logging.
If you use the WITH NO LOG keywords in a CREATE TABLE statement, and the
database does not use logging, the WITH NO LOG option is ignored.
Once you turn off logging on a temporary table, you cannot turn it back on;
a temporary table is, therefore, always logged or never logged.
The following example shows how to prevent logging temporary tables in a
database that uses logging:
CREATE TEMP TABLE tab2 (fname CHAR(15), lname CHAR(15))
WITH NO LOG
SQL Statements 1-183
CREATE TABLE
The WITH ROWIDS Clause
Important: Use the WITH ROWIDS clause only on fragmented tables. In non-
fragmented tables, the rowid column remains unchanged. Informix recommends,
however, that you utilize primary keys as an access method rather than exploiting the
rowid column.
Nonfragmented tables contain a hidden column called the rowid column.
However, fragmented tables do not contain this column. If a table is
fragmented, you can use the WITH ROWIDS clause to add the rowid column
to the table. OnLine assigns each row in the rowid column a unique number
that remains stable for the life of the row. The database server uses an index
to nd the physical location of the row. Each row contains an additional
4 bytes to store the rowid column after you add it.
Storage Option
LOCK MODE
p. 1-190
Extent Option
p. 1-188
IN dbspace
FRAGMENT
BY
Clause
p. 1-186
SE
IN 'pathname'
OL
Storage
Option
1-184 Informi x Gui de to SQL: Syntax
CREATE TABLE
The storage option allows you to specify where the table is stored and the
locking granularity for the table.
The IN dbspace Clause
The IN dbspace clause allows you to isolate a table. The dbspace that you
specify must already exist. If you do not specify the IN dbspace clause, the
default is the dbspace where the current database resides. Temporary tables
do not have a default dbspace. For further information about storing
temporary tables, see the TEMP TABLE Clause on page 1-177.
Element Purpose Restrictions Syntax
dbspace The name of the dbspace in
which a database table or
temporary table is to be stored.
The default for database tables is
the dbspace in which the current
database resides.
Specied dbspace must already
exist.
Identier, p. 1-723
pathname The full operating-system
pathname and lename in which
you want to store the database
table. The default is the directory
of the database (the .dbs
directory).
You cannot use the pathname
variable for a temporary table.
You can specify any valid
directory in pathname. You
cannot add an extension to the
lename.
See The IN
pathname Option
on page 1-190.
SQL Statements 1-185
CREATE TABLE
For example, if the stores7 database is in the stockdata dbspace, but you
want the customer data placed in a separate dbspace called custdata, use the
following statements:
CREATE DATABASE stores7 IN stockdata
CREATE TABLE customer
(
customer_num SERIAL(101),
fname CHAR(15),
lname CHAR(15),
company CHAR(20),
address1 CHAR(20),
address2 CHAR(20),
city CHAR(15),
state CHAR(2),
zipcode CHAR(5),
phone CHAR(18)
)
IN custdata EXTENT SIZE 16
.
.
.
For more information about storing your tables in separate dbspaces, see the
INFORMIX-OnLine Dynamic Server Administrators Guide.
If your table has one or more blob columns, you can store the blob data with
the table data or in a separate blobspace. See the Data Type segment on
page 1-664 for more information. The following example shows how
blobspaces and dbspaces are specied.
The following statement creates the resume table. The data for the table is
stored in the employ dbspace. The data in the resume column is stored with
the table, but the data associated with the photo column is stored in a
blobspace named photo_space.
CREATE TABLE resume
(
fname CHAR(15),
lname CHAR(15),
phone CHAR(18),
recd_date DATETIME YEAR TO HOUR,
contact_date DATETIME YEAR TO HOUR,
comments VARCHAR(250, 100),
vita TEXT IN TABLE,
photo BYTE IN photo_space
)
IN employ
1-186 Informi x Gui de to SQL: Syntax
CREATE TABLE
The FRAGMENT BY Clause
The FRAGMENT BY clause allows you to create fragmented tables.
Fragmentation means that groups of rows within a table are stored together
in the same dbspace.
Element Purpose Restrictions Syntax
dbspace The dbspace that contains a table
fragment
You must specify at least two
dbspaces. You can specify a
maximum of 2,048 dbspaces.
The dbspaces must exist when
you execute the statement.
Identier, p. 1-723
frag-expression An expression that denes a
fragment where a row is to be
stored using a range, hash, or
arbitrary rule
If you specify a value for
remainder dbspace, you must
specify at least one fragment
expression. If you do not specify
a value for remainder dbspace, you
must specify at least two
fragment expressions. You can
specify a maximum of 2,048
fragment expressions. Each
fragment expression can contain
only columns from the current
table and only data values from
a single row. No subqueries,
stored procedures, current
date/time functions, or
aggregates are allowed in a
fragment expression.
Expression, p. 1-671,
and Condition,
p. 1-643
(1 of 2)
,
dbspace ROUND ROBIN IN FRAGMENT BY
EXPRESSION
,
frag-expression
IN dbspace
FRAGMENT BY
Clause
,
REMAINDER IN
remainder
dbspace
dbspace ,
frag-expression
IN dbspace
,
SQL Statements 1-187
CREATE TABLE
Use the FRAGMENT BY clause to dene the distribution scheme, either round-
robin or expression-based.
In a round-robin distribution scheme, specify at least two dbspaces where
you want the fragments to be placed. As records are inserted into the table,
they are placed in the rst available dbspace. OnLine balances the load
between the specied dbspaces as you insert records and distributes the rows
in such a way that the fragments always maintain approximately the same
number of rows. In this distribution scheme, the database server must scan
all fragments when searching for a row.
In an expression-based distribution scheme, each fragment expression in a rule
species a dbspace. Each fragment expression within the rule isolates data
and aids the database server in searching for rows. Specify one of the
following rules:
I Range rule
A range rule species fragment expressions that use a range to
specify which rows are placed in a fragment, as the following
example shows:
...
FRAGMENT BY EXPRESSION
c1 < 100 IN dbsp1,
c1 >= 100 and c1 < 200 IN dbsp2,
c1 >= 200 IN dbsp3;
remainder
dbspace
The dbspace that contains table
rows that do not meet the condi-
tions dened in any fragment
expression
If you specify two or more
fragment expressions, remainder
dbspace is optional. If you specify
only one fragment expression,
remainder dbspace is required.
The dbspace specied in
remainder dbspace must exist at
the time you execute the
statement.
Identier, p. 1-723
Element Purpose Restrictions Syntax
(2 of 2)
1-188 Informi x Gui de to SQL: Syntax
CREATE TABLE
I Hash rule
A hash rule species fragment expressions that are created when you
use a hash algorithm, which is often implemented with the MOD
function, as the following example shows:
...
FRAGMENT BY EXPRESSION
MOD(id_num, 3) = 0 IN dbsp1,
MOD(id_num, 3) = 1 IN dbsp2,
MOD(id_num, 3) = 2 IN dbsp3;
I Arbitrary rule
An arbitrary rule species fragment expressions based on a
predened SQL expression that typically includes the use of OR
clauses to group data, as the following example shows:
...
FRAGMENT BY EXPRESSION
zip_num = 95228 OR zip_num = 95443 IN dbsp2,
zip_num = 91120 OR zip_num = 92310 IN dbsp4,
REMAINDER IN dbsp5;
Warning: When you specify a date value in a fragment expression, make sure to
specify 4 digits instead of 2 digits for the year. When you specify a 4-digit year, the
DBCENTURY environment variable has no effect on the distribution scheme. When
you specify a 2-digit year, the DBCENTURY environment variable can affect the dis-
tribution scheme and can produce unpredictable results. See the Informix Guide to
SQL: Reference for more information on the DBCENTURY environment variable.
Extent Option
Extent Option
NEXT SIZE
next
kbytes
EXTENT SIZE
rst
kbytes
SQL Statements 1-189
CREATE TABLE
See the INFORMIX-OnLine Dynamic Server Performance Guide for a discussion
about calculating extent sizes.
The following example species a rst extent of 20 kilobytes and allows the
rest of the extents to use the default size:
CREATE TABLE emp_info
(
f_name CHAR(20),
l_name CHAR(20),
position CHAR(20),
start_date DATETIME YEAR TO DAY,
comments VARCHAR(255)
)
EXTENT SIZE 20
Revising Extent Sizes for Unloaded Tables
You can revise the CREATE TABLE statements in generated schema les to
revise the extent and next-extent sizes of unloaded tables. See the
INFORMIX-OnLine Dynamic Server Administrators Guide for information
about revising extent sizes.
Element Purpose Restrictions Syntax
rst kbytes The length in kilobytes of the
rst extent for the table. The
default length is eight times the
disk page size on your system.
For example, if you have a
2-kilobyte page system, the
default length is 16 kilobytes.
The minimum length is four
times the disk page size on your
system. For example, if you have
a 2-kilobyte page system, the
minimum length is eight
kilobytes. The maximum length
is equal to the chunk size.
Expression, p. 1-671
next kbytes The length in kilobytes for the
subsequent extents. The default
length is eight times the disk
page size on your system. For
example, if you have a 2-kilobyte
page system, the default length
is 16 kilobytes.
The minimum length is four
times the disk page size on your
system. For example, if you have
a 2-kilobyte page system, the
minimum length is
8 kilobytes.The maximum
length is equal to the chunk size.
Expression, p. 1-671
1-190 Informi x Gui de to SQL: Syntax
CREATE TABLE
LOCK MODE Clause
The default locking granularity is a page.
Row-level locking provides the highest level of concurrency. However, if you
are using many rows at one time, the lock-management overhead can
become signicant. You can also exceed the maximum number of locks
available, depending on the conguration of your OnLine system.
Page locking allows you to obtain and release one lock on a whole page of
rows. Page locking is especially useful when you know that the rows are
grouped into pages in the same order that you are using to process all the
rows. For example, if you are processing the contents of a table in the same
order as its cluster index, page locking is especially appropriate.
You can change the lock mode of an existing table with the ALTER TABLE
statement.
The IN pathname Option
The pathname in an IN clause can specify any valid directory and is not
restricted to the directory that contains the current database. This allows you
to spread your tables over multiple disks.
In UNIX, pathname cannot be longer than 64 characters and must be within
quotes ('). A pathname must appear in the following form:
[/directory-name/...]filename
If pathname in an IN clause species a lename that is different fromtable
name, always use table name (rather than the lename) to refer to the table in
subsequent <vk>SQL statements.
The creator of the table must have search permissions on all directories in the
path and write permissions on the directory that is to contain the les.
LOCK MODE Clause
LOCK MODE
ROW
PAGE
SE
SQL Statements 1-191
CREATE TABLE
References
See the ALTER TABLE, CREATE INDEX, CREATE DATABASE, DROP TABLE, and
SET statements in this manual. Also see the Condition, Data Type, Identier,
and Table Name segments.
In the Informix Guide to SQL: Tutorial, see the discussion of data-integrity
constraints and the discussion of the ON DELETE CASCADE clause in
Chapter 4. Also see the discussion of creating a database and tables in
Chapter 9.
In the INFORMIX-OnLine Dynamic Server Performance Guide, see the
discussion of extent sizing.
1-192 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
CREATE TRIGGER
Use the CREATE TRIGGER statement to create a trigger on a table in the
database. A trigger is a database object that automatically sets off a specied
set of SQL statements when a specied event occurs.
Syntax
Trigger
Name
p. 1-195
CREATE TRIGGER
DB
DELETE
UPDATE
Clause
p. 1-197
ON
ON
Insert
REFERENCING
Clause
p. 1-202
Action
Clause
p. 1-199
Table
Name
p. 1-768
Delete
REFERENCING
Clause
p. 1-203
Action
Clause
p. 1-199
Table
Name
p. 1-768
Update
REFERENCING
Clause
p. 1-204
Action
Clause
p. 1-199
Table
Name
p. 1-768
INSERT ON
Action
Clause
Referencing
p. 1-205
Action
Clause
Referencing
p. 1-205
Action
Clause
Referencing
p. 1-205
ESQL
+
Trigger Object
Modes
p. 1-222
SQL Statements 1-193
CREATE TRIGGER
Usage
You must be either the owner of the table or have the DBA status to create a
trigger on a table.
You can use roles with triggers. Role-related statements (CREATE ROLE,
DROP ROLE, and SET ROLE) and SET SESSION AUTHORIZATION statements
can be triggered inside a trigger. Privileges that a user has acquired through
enabling a role or through a SET SESSION AUTHORIZATION statement are not
relinquished when a trigger is executed.
You can dene a trigger with a stand-alone CREATE TRIGGER statement.
You can dene a trigger as part of a schema by placing the CREATE TRIGGER
statement inside a CREATE SCHEMA statement.
You can create a trigger only on a table in the current database. You cannot
create a trigger on a temporary table, a view, or a system catalog table.
You cannot create a trigger inside a stored procedure if the procedure is called
inside a data manipulation statement. For example, you cannot create a
trigger inside the stored procedure sp_items in the following INSERT
statement:
INSERT INTO items EXECUTE PROCEDURE sp_items
See Data Manipulation Statements on page 1-13 for a list of data
manipulation statements.
If you are embedding the CREATE TRIGGER statement in an ESQL/C or
ESQL/COBOL program, you cannot use a host variable in the trigger
specication.
You cannot use a stored procedure variable in a CREATE TRIGGER statement.
You cannot use a ROLLBACK WORK statement to undo a CREATE TRIGGER
statement. If you roll back a transaction that contains a CREATE TRIGGER
statement, the trigger remains, and you do not receive an error message.
DB
ESQL
SE
1-194 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
The Trigger Event
The trigger event species the type of statement that activates a trigger. The
trigger event can be an INSERT, DELETE, or UPDATE statement. Each trigger
can have only one trigger event. The occurrence of the trigger event is the
triggering statement.
For each table, you can dene only one trigger that is activated by an INSERT
statement and only one trigger that is activated by a DELETE statement. For
each table, you can dene multiple triggers that are activated by UPDATE
statements. See UPDATE Clause on page 1-197 for more information about
multiple triggers on the same table.
You cannot dene a DELETE trigger event on a table with a referential
constraint that species ON DELETE CASCADE.
You are responsible for guaranteeing that the triggering statement returns the
same result with and without the triggered actions. See Action Clause on
page 1-199 and Triggered Action List on page 1-206 for more information
on the behavior of triggered actions.
If INFORMIX-OnLine Dynamic Server is the database server, a triggering
statement from an external database server can activate the trigger. As shown
in the following example, an insert trigger on newtab, managed by
dbserver1, is activated by an INSERT statement from dbserver2. The trigger
executes as if the insert originated on dbserver1.
-- Trigger on stores7@dbserver1:newtab
CREATE TRIGGER ins_tr INSERT ON newtab
REFERENCING new AS post_ins
FOR EACH ROW(EXECUTE PROCEDURE nt_pct (post_ins.mc));
-- Triggering statement from dbserver2
INSERT INTO stores7@dbserver1:newtab
SELECT item_num, order_num, quantity, stock_num,
manu_code,
total_price FROM items;
SQL Statements 1-195
CREATE TRIGGER
Trigger Events with Cursors
If the triggering statement uses a cursor, the complete trigger is activated
each time the statement executes. For example, if you declare a cursor for a
triggering INSERT statement, each PUT statement executes the complete
trigger. Similarly, if a triggering UPDATE or DELETE statement contains the
clause WHERE CURRENT OF, each update or delete activates the complete
trigger. This behavior is different from what occurs when a triggering
statement does not use a cursor and updates multiple rows. In this case, the
set of triggered actions executes only once. For more information on the
execution of triggered actions, see Action Clause on page 1-199.
Privileges on the Trigger Event
You must have the appropriate Insert, Delete, or Update privilege on the
triggering table to execute the INSERT, DELETE, or UPDATE statement that is
the trigger event. The triggering statement might still fail, however, if you do
not have the privileges necessary to execute one of the SQL statements in the
action clause. When the triggered actions are executed, the database server
checks your privileges for each SQL statement in the trigger denition as if
the statement were being executed independently of the trigger. For infor-
mation on the privileges you need to execute a trigger, see Privileges to
Execute Triggered Actions on page 1-215.
Impact of Triggers
The INSERT, DELETE, and UPDATE statements that initiate triggers might
appear to execute slowly because they activate additional SQL statements,
and the user might not know that other actions are occurring.
The execution time for a triggering data manipulation statement depends on
the complexity of the triggered action and whether it initiates other triggers.
Obviously, the elapsed time for the triggering data manipulation statement
increases as the number of cascading triggers increases. For more infor-
mation on triggers that initiate other triggers, see Cascading Triggers on
page 1-216.
1-196 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
Trigger Name
When you create a trigger, the name of the trigger must be unique within a
database.
When you create a trigger, the owner.name combination (the combination of
the owner name and trigger name) must be unique within a database.
For information about the relationship between the trigger owners privi-
leges and the privileges of other users, see Privileges to Execute Triggered
Actions on page 1-215.
Element Purpose Restrictions Syntax
owner The user name of the owner of
the trigger
The specied name must be a
valid user name.
Identier, p. 1-723
Trigger
Name
Identier
p. 1-723
owner.
ANSI
SQL Statements 1-197
CREATE TRIGGER
UPDATE Clause
If the trigger event is an UPDATE statement, the trigger executes when any
column in the triggering column list is updated.
If the triggering UPDATE statement updates more than one of the triggering
columns in a trigger, the trigger executes only once.
Dening Multiple Update Triggers
If you dene more than one update trigger event on a table, the column lists
of the triggers must be mutually exclusive. The following example shows
that trig3 is illegal on the items table because its column list includes
stock_num, which is a triggering column in trig1. Multiple update triggers
on a table cannot include the same columns.
CREATE TRIGGER trig1 UPDATE OF item_num, stock_num ON items
REFERENCING OLD AS pre NEW AS post
FOR EACH ROW(EXECUTE PROCEDURE proc1());
CREATE TRIGGER trig2 UPDATE OF manu_code ON items
BEFORE(EXECUTE PROCEDURE proc2());
-- Illegal trigger: stock_num occurs in trig1
CREATE TRIGGER trig3 UPDATE OF order_num, stock_num ON items
BEFORE(EXECUTE PROCEDURE proc3());
Element Purpose Restrictions Syntax
column name The name of a column or
columns that activate the trigger.
The default is all the columns in
the table on which you create the
trigger.
The specied columns must
belong to the table on which you
create the trigger. If you dene
more than one update trigger on
a table, the column lists of the
triggering statements must be
mutually exclusive.
Identier, p. 1-723
,
column name
UPDATE
UPDATE
Clause
OF
1-198 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
When an UPDATE Statement Activates Multiple Triggers
When an UPDATE statement updates multiple columns that have different
triggers, the column numbers of the triggering columns determine the order
of trigger execution. Execution begins with the smallest triggering column
number and proceeds in order to the largest triggering column number. The
following example shows that table taba has four columns (a, b, c, d):
CREATE TABLE taba (a int, b int, c int, d int)
Dene trig1 as an update on columns a and c, and dene trig2 as an update
on columns b and d, as shown in the following example:
CREATE TRIGGER trig1 UPDATE OF a, c ON taba
AFTER (UPDATE tabb SET y = y + 1);
CREATE TRIGGER trig2 UPDATE OF b, d ON taba
AFTER (UPDATE tabb SET z = z + 1);
The triggering statement is shown in the following example:
UPDATE taba SET (b, c) = (b + 1, c + 1)
Then trig1 for columns a and c executes rst, and trig2 for columns b and d
executes next. In this case, the smallest column number in the two triggers is
column 1 (a), and the next is column 2 (b).
SQL Statements 1-199
CREATE TRIGGER
Action Clause
The action clause denes the characteristics of triggered actions and species
the time when these actions occur. You must dene at least one triggered
action, using the keywords BEFORE, FOR EACH ROW, or AFTER to indicate
when the action occurs relative to the triggering statement. You can specify
triggered actions for all three options on a single trigger, but you must order
them in the following sequence: BEFORE, FOR EACH ROW, and AFTER. You
cannot follow a FOR EACH ROW triggered action list with a BEFORE triggered
action list. If the rst triggered action list is FOR EACH ROW, an AFTER action
list is the only option that can follow it. See Action Clause Referencing on
page 1-205 for more information on the action clause when a REFERENCING
clause is present.
BEFORE Actions
The BEFORE triggered action or actions execute once before the triggering
statement executes. If the triggering statement does not process any rows, the
BEFORE triggered actions still execute because the database server does not
yet know whether any row is affected.
FOR EACH
ROW
BEFORE
Triggered
Action List
p. 1-206
Action
Clause
Triggered
Action List
p. 1-206
AFTER
Triggered
Action List
p. 1-206
FOR EACH
ROW
Triggered
Action List
p. 1-206
AFTER
Triggered
Action List
p. 1-206
AFTER
Triggered
Action List
p. 1-206
1-200 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
FOR EACH ROW Actions
The FOR EACH ROW triggered action or actions execute once for each row
that the triggering statement affects. The triggered SQL statement executes
after the triggering statement processes each row.
If the triggering statement does not insert, delete, or update any rows, the
FOR EACH ROW triggered actions do not execute.
AFTER Actions
An AFTER triggered action or actions execute once after the action of the
triggering statement is complete. If the triggering statement does not process
any rows, the AFTER triggered actions still execute.
Actions of Multiple Triggers
When an UPDATE statement activates multiple triggers, the triggered actions
merge. Assume that taba has columns a, b, c, and d, as shown in the
following example:
CREATE TABLE taba (a int, b int, c int, d int)
Next, assume that you dene trig1 on columns a and c, and trig2 on columns
b andd. If both triggers have triggered actions that are executed BEFORE, FOR
EACH ROW, and AFTER, then the triggered actions are executed in the
following sequence:
1. BEFORE action list for trigger (a, c)
2. BEFORE action list for trigger (b, d)
3. FOR EACH ROW action list for trigger (a, c)
4. FOR EACH ROW action list for trigger (b, d)
5. AFTER action list for trigger (a, c)
6. AFTER action list for trigger (b, d)
The database server treats the triggers as a single trigger, and the triggered
action is the merged-action list. All the rules governing a triggered action
apply to the merged list as one list, and no distinction is made between the
two original triggers.
SQL Statements 1-201
CREATE TRIGGER
Guaranteeing Row-Order Independence
In a FOR EACH ROWtriggered-action list, the result might depend on the
order of the rows being processed. You can ensure that the result is
independent of row order by following these suggestions:
I Avoid selecting the triggering table in the FOR EACH ROW section. If
the triggering statement affects multiple rows in the triggering table,
the result of the SELECT statement in the FOR EACH ROWsection var-
ies as each row is processed. This condition also applies to any
cascading triggers. See Cascading Triggers on page 1-216.
I In the FOR EACH ROWsection, avoid updating a table with values
derived from the current row of the triggering table. If the triggered
actions modify any row in the table more than once, the nal result
for that row depends on the order in which rows from the triggering
table are processed.
I Avoid modifying a table in the FOR EACH ROWsection that is
selected by another triggered statement in the same FOR EACH ROW
section, including any cascading triggered actions. If you modify a
table in this section and refer to it later, the changes to the table might
not be complete when you refer to it. Consequently, the result might
differ, depending on the order in which rows are processed.
The database server does not enforce rules to prevent these situations
because doing so would restrict the set of tables from which a triggered
action can select. Furthermore, the result of most triggered actions is
independent of row order. Consequently, you are responsible for ensuring
that the results of the triggered actions are independent of row order.
1-202 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
INSERT REFERENCING Clause
Once you assign a correlation name, you can use it only inside the FOR EACH
ROW triggered action. See Action Clause Referencing on page 1-205.
To use the correlation name, precede the column name with the correlation
name, followed by a period. For example, if the new correlation name is post,
refer to the new value for the column fname as post.fname.
If the trigger event is an INSERT statement, using the old correlation name as
a qualier causes an error because no value exists before the row is inserted.
For the rules that govern the use of correlation names, see Using Correlation
Names in Triggered Actions on page 1-209.
You can use the INSERT REFERENCINGclause only if you dene a FOR EACH
ROWtriggered action.
Element Purpose Restrictions Syntax
correlation
name
A name that you assign to a new
column value so that you can
refer to it within the triggered
action. The new column value in
the triggering table is the value
of the column after execution of
the triggering statement.
The correlation name must be
unique within the CREATE
TRIGGER statement.
Identier, p. 1-723
REFERENCING NEW correlation name
INSERT
REFERENCING
Clause
AS
SQL Statements 1-203
CREATE TRIGGER
The following example illustrates the use of the INSERT REFERENCING
clause. This example inserts a row into backup_table1 for every row that is
inserted into table1. The values that are inserted into col1 and col2 of
backup_table1 are an exact copy of the values that were just inserted into
table1.
CREATE TABLE table1 (col1 INT, col2 INT);
CREATE TABLE backup_table1 (col1 INT, col2 INT);
CREATE TRIGGER before_trig
INSERT ON table1
REFERENCING NEW as new
FOR EACH ROW
(
INSERT INTO backup_table1 (col1, col2)
VALUES (new.col1, new.col2)
);
As the preceding example shows, the advantage of the INSERT
REFERENCING clause is that it allows you to refer to the data values that the
trigger event in your triggered action produces.
DELETE REFERENCING Clause
Once you assign a correlation name, you can use it only inside the FOR EACH
ROW triggered action. See Action Clause Referencing on page 1-205.
Element Purpose Restrictions Syntax
correlation
name
A name that you assign to an old
column value so that you can
refer to it within the triggered
action. The old column value in
the triggering table is the value
of the column before execution
of the triggering statement.
The correlation name must be
unique within the CREATE
TRIGGER statement.
Identier, p. 1-723
DELETE
REFERENCING
Clause
REFERENCING
OLD
correlation name
AS
1-204 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
You use the correlation name to refer to an old column value by preceding the
column name with the correlation name and a period (.). For example, if the
old correlation name is pre, refer to the old value for the column fname as
pre.fname.
If the trigger event is a DELETE statement, using the new correlation name as
a qualier causes an error because the column has no value after the row is
deleted. See Using Correlation Names in Triggered Actions on page 1-209
for the rules governing the use of correlation names.
You can use the DELETE REFERENCINGclause only if you dene a FOR EACH
ROWtriggered action.
UPDATE REFERENCING Clause
Element Purpose Restrictions Syntax
correlation
name
A name that you assign to an old
or new column value so that you
can refer to it within the
triggered action. The old column
value in the triggering table is
the value of the column before
execution of the triggering
statement. The new column
value in the triggering table is
the value of the column after
executing the triggering
statement.
You can specify a correlation
name for an old column value
only (OLD option), for a new
column value only (NEW
option), or for both the old and
new column values. Each corre-
lation name you specify must be
unique within the CREATE
TRIGGER statement.
Identier, p. 1-723
UPDATE
REFERENCING
Clause
1
REFERENCING
AS
OLD
correlation
name
AS
NEW
correlation
name
1
SQL Statements 1-205
CREATE TRIGGER
Once you assign a correlation name, you can use it only inside the FOR EACH
ROW triggered action. See Action Clause Referencing on page 1-205.
Use the correlation name to refer to an old or new column value by preceding
the column name with the correlation name and a period (.). For example, if
the new correlation name is post, you refer to the new value for the column
fname as post.fname.
If the trigger event is an UPDATE statement, you can dene both old and new
correlation names to refer to column values before and after the triggering
update. See Using Correlation Names in Triggered Actions on page 1-209
for the rules that govern the use of correlation names.
You can use the UPDATE REFERENCINGclause only if you dene a FOR EACH
ROWtriggered action.
Action Clause Referencing
If the CREATE TRIGGER statement contains an INSERT REFERENCING clause,
a DELETE REFERENCING clause, or an UPDATE REFERENCING clause, you
must include a FOR EACH ROW triggered-action list in the action clause. You
can also include BEFORE and AFTER triggered-action lists, but they are
optional. See Action Clause on page 1-199 for information on the BEFORE,
FOR EACH ROW, and AFTER triggered-action lists.
Triggered
Action List
p. 1-206
BEFORE
FOR EACH
ROW
Triggered
Action List
p. 1-206
AFTER
Triggered
Action List
p. 1-206
Action
Clause
Referencing
1-206 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
Triggered Action List
The triggered action consists of an optional WHEN condition and the action
statements. Objects that are referenced in the triggered action, that is, tables,
columns, and stored procedures, must exist when the CREATE TRIGGER
statement is executed. This rule applies only to objects that are referenced
directly in the trigger denition.
Warning: When you specify a date expression in the WHEN condition or in an
action statement, make sure to specify 4 digits instead of 2 digits for the year. When
you specify a 4-digit year, the DBCENTURY environment variable has no effect on
how the database server interprets the date expression. When you specify a 2-digit
year, the DBCENTURY environment variable can affect how the database server
interprets the date expression, so the triggered action might produce unpredictable
results. See the Informix Guide to SQL: Reference for more information on the
DBCENTURY environment variable.
,
Condition
p. 1-643
WHEN
INSERT
Statement
p. 1-370
UPDATE
Statement
p. 1-612
DELETE
Statement
p. 1-252
EXECUTE
PROCEDURE
p. 1-293
Triggered
Action List
,
( )
( )
SQL Statements 1-207
CREATE TRIGGER
The WHEN Condition
The WHEN condition lets you make the triggered action dependent on the
outcome of a test. When you include a WHEN condition in a triggered action,
if the triggered action evaluates to true, the actions in the triggered action list
execute in the order in which they appear. If the WHEN condition evaluates
to false or unknown, the actions in the triggered action list are not executed. If
the triggered action is in a FOR EACH ROWsection, its search condition is
evaluated for each row.
For example, the triggered action in the following trigger executes only if the
condition in the WHEN clause is true:
CREATE TRIGGER up_price
UPDATE OF unit_price ON stock
REFERENCING OLD AS pre NEW AS post
FOR EACH ROW WHEN(post.unit_price > pre.unit_price * 2)
(INSERT INTO warn_tab VALUES(pre.stock_num,
pre.order_num, pre.unit_price, post.unit_price,
CURRENT))
A stored procedure that executes inside the WHEN condition carries the same
restrictions as a stored procedure that is called in a data manipulation
statement. See CREATE PROCEDURE on page 1-134 for more information
about a stored procedure that is called within a data manipulation statement.
The Action Statements
The triggered-action statements can be INSERT, DELETE, UPDATE, or
EXECUTE PROCEDURE statements. If a triggered-action list contains multiple
statements, these statements execute in the order in which they appear in the
list.
In INFORMIX-SE, all objects referenced in the triggered actions must be in the
current database.
SE
1-208 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
Achieving a Consistent Result
To guarantee that the triggering statement returns the same result with and
without the triggered actions, make sure that the triggered actions in the
BEFORE and FOR EACH ROW sections do not modify any table referenced in
the following clauses:
I WHERE clause
I SET clause in the UPDATE statement
I SELECT clause
I EXECUTE PROCEDURE clause in a multiple-rowINSERT statement
Using Keywords
If you use the INSERT, DELETE, UPDATE, or EXECUTE keywords as an
identier in any of the following clauses inside a triggered action list, you
must qualify them by the owner name, the table name, or both:
I FROM clause of a SELECT statement
I INTO clause of the EXECUTE PROCEDURE statement
I GROUP BY clause
I SET clause of the UPDATE statement
You get a syntax error if these keywords are not qualied when you use these
clauses inside a triggered action.
If you use the keyword as a column name, it must be qualied by the table
namefor example, table.update. If both the table name and the column
name are keywords, they must be qualied by the owner namefor
example, owner.insert.update. If the owner name, table name, and column
name are all keywords, the owner name must be in quotesfor example,
'delete'.insert.update. The only exception is when these keywords are the
rst table or column name in the list, and you do not have to qualify them.
For example, delete in the following statement does not need to be qualied
because it is the rst column listed in the INTO clause:
CREATE TRIGGER t1 UPDATE OF b ON tab1
FOR EACH ROW (EXECUTE PROCEDURE p2()
INTO delete, d)
SQL Statements 1-209
CREATE TRIGGER
The following statements show examples in which you must qualify the
column name or the table name:
FROM clause of a SELECT statement
CREATE TRIGGER t1 INSERT ON tab1
BEFORE (INSERT INTO tab2 SELECT * FROM tab3,
'owner1'.update)
INTO clause of an EXECUTE PROCEDURE statement
CREATE TRIGGER t3 UPDATE OF b ON tab1
FOR EACH ROW (EXECUTE PROCEDURE p2() INTO
d, tab1.delete)
GROUP BY clause of a SELECT statement
CREATE TRIGGER t4 DELETE ON tab1
BEFORE (INSERT INTO tab3 SELECT deptno, SUM(exp)
FROM budget GROUP BY deptno, budget.update)
SET clause of an UPDATE statement
CREATE TRIGGER t2 UPDATE OF a ON tab1
BEFORE (UPDATE tab2 SET a = 10, tab2.insert = 5)
Using Correlation Names in Triggered Actions
The following rules apply when you use correlation names in triggered
actions:
I You can use the correlation names for the old and new column values
only in statements in the FOR EACH ROW triggered-action list. You
can use the old and new correlation names to qualify any column in
the triggering table in either the WHEN condition or the triggered
SQL statements.
I The old and new correlation names refer to all rows affected by the
triggering statement.
1-210 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
I You cannot use the correlation name to qualify a column name in the
GROUP BY, the SET, or the COUNT DISTINCT clause.
I The scope of the correlation names is the entire trigger denition.
This scope is statically determined, meaning that it is limited to the
trigger denition; it does not encompass cascading triggers or
columns that are qualied by a table name in a stored procedure that
is a triggered action.
When to Use Correlation Names
In an SQL statement in a FOR EACH ROWtriggered action, you must qualify
all references to columns in the triggering table with either the old or new
correlation name, unless the statement is valid independent of the triggered
action.
In other words, if a column name inside a FOR EACH ROW triggered action
list is not qualied by a correlation name, even if it is qualied by the
triggering table name, it is interpreted as if the statement is independent of
the triggered action. No special effort is made to search the denition of the
triggering table for the nonqualied column name.
For example, assume that the following DELETE statement is a triggered
action inside the FOR EACH ROW section of a trigger:
DELETE FROM tab1 WHERE col_c = col_c2
For the statement to be valid, both col_c and col_c2 must be columns from
tab1. If col_c2 is intended to be a correlation reference to a column in the
triggering table, it must be qualied by either the old or the new correlation
name. If col_c2 is not a column in tab1 and is not qualied by either the old
or new correlation name, you get an error.
SQL Statements 1-211
CREATE TRIGGER
When a column is not qualied by a correlation name, and the statement is
valid independent of the triggered action, the column name refers to the
current value in the database. In the triggered action for trigger t1 in the
following example, mgr in the WHERE clause of the correlated subquery is an
unqualied column from the triggering table. In this case, mgr refers to the
current column value in empsal because the INSERT statement is valid
independent of the triggered action.
CREATE DATABASE db1;
CREATE TABLE empsal (empno INT, salary INT, mgr INT);
CREATE TABLE mgr (eno INT, bonus INT);
CREATE TABLE biggap (empno INT, salary INT, mgr INT);
CREATE TRIGGER t1 UPDATE OF salary ON empsal
AFTER (INSERT INTO biggap SELECT * FROM empsal WHERE salary <
(SELECT bonus FROM mgr WHERE eno = mgr));
In a triggered action, an unqualied column name from the triggering table
refers to the current column value, but only when the triggered statement is
valid independent of the triggered action.
Qualied Versus Unqualied Value
The following table summarizes the value retrieved when you use the
column name qualied by the old correlation name and the column name
qualied by the new correlation name.
Trigger Event old. col new. col
INSERT no value (error) inserted value
UPDATE
(column updated)
original value current value (N)
UPDATE
(column not updated)
original value current value (U)
DELETE original value no value (error)
1-212 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
Refer to the following key when you read the table.
Outside a FOR EACH ROW triggered-action list, you cannot qualify a column
from the triggering table with either the old correlation name or the new
correlation name; it always refers to the current value in the database.
Action on the Triggering Table
You cannot reference the triggering table in any triggered SQL statement,
with the following exceptions:
I The trigger event is UPDATE and the triggered SQL statement is also
UPDATE, and the columns in both statements, including any
nontriggering columns in the triggering UPDATE, are mutually
exclusive.
For example, assume that the following UPDATE statement, which
updates columns a and b of tab1, is the triggering statement:
UPDATE tab1 SET (a, b) = (a + 1, b + 1)
Now consider the triggered actions in the following example. The
rst UPDATE statement is a valid triggered action, but the second one
is not because it updates column b again.
UPDATE tab1 SET c = c + 1; -- OK
UPDATE tab1 SET b = b + 1;-- ILLEGAL
Term Meaning
original value is the value before the triggering statement.
current value is the value after the triggering statement.
(N) cannot be changed by triggered action.
(U) can be updated by triggered statements; value may be
different from original value because of preceding triggered
actions.
SQL Statements 1-213
CREATE TRIGGER
I The triggered SQL statement is a SELECT statement. The SELECT
statement can be a triggered statement in the following instances:
K The SELECT statement appears in a subquery in the WHENclause
or a triggered-action statement.
K The triggered action is a stored procedure, and the SELECT
statement appears inside the stored procedure.
This rule, which states that a triggered SQL statement cannot reference the
triggering table, with the two noted exceptions, applies recursively to all
cascading triggers, which are considered part of the initial trigger. This
situation means that a cascading trigger cannot update any columns in the
triggering table that were updated by the original triggering statement,
including any nontriggering columns affected by that statement. For
example, assume the following UPDATE statement is the triggering
statement:
UPDATE tab1 SET (a, b) = (a + 1, b + 1)
Then in the cascading triggers shown in the following example, trig2 fails at
runtime because it references column b, which is updated by the triggering
UPDATE statement. See Cascading Triggers on page 1-216 for more
information about cascading triggers.
CREATE TRIGGER trig1 UPDATE OF a ON tab1-- Valid
AFTER (UPDATE tab2 set e = e + 1);
CREATE TRIGGER trig2 UPDATE of e ON tab2-- Invalid
AFTER (UPDATE tab1 set b = b + 1);
1-214 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
Rules for Stored Procedures
The following rules apply to a stored procedure that is used as a triggered
action:
I The stored procedure cannot be a cursory procedure (that is, a
procedure that returns more than one row) in a place where only one
row is expected.
I When an EXECUTE PROCEDURE statement is the triggered action,
you can specify the INTO clause only for an UPDATEtrigger when the
triggered action occurs in the FOR EACH ROWsection. In this case,
the INTO clause can contain only column names from the triggering
table. The following statement illustrates the appropriate use of the
INTO clause:
CREATE TRIGGER upd_totpr UPDATE OF quantity ON items
REFERENCING OLD AS pre_upd NEW AS post_upd
FOR EACH ROW(EXECUTE PROCEDURE
calc_totpr(pre_upd.quantity,
post_upd.quantity, pre_upd.total_price)
INTO total_price)
When the INTO clause appears in the EXECUTE PROCEDURE
statement, the database server updates the columns named there
with the values returned from the stored procedure. The database
server performs the update immediately upon returning from the
stored procedure. See EXECUTE PROCEDURE on page 1-293 for
more information about the statement.
I You cannot use the old or new correlation name inside the stored
procedure. If you need to use the corresponding values in the
procedure, you must pass them as parameters. The stored procedure
should be independent of triggers, and the old or new correlation
name do not have any meaning outside the trigger.
I You cannot use the following statements inside the stored procedure:
ALTER FRAGMENT, ALTER INDEX, ALTER OPTICAL, ALTER TABLE,
BEGIN WORK, COMMIT WORK, CREATE TRIGGER, DELETE, DROP
INDEX, DROP OPTICAL, DROP SYNONYM, DROP TABLE, DROP
TRIGGER, DROP VIEW, INSERT, RENAME COLUMN, RENAME TABLE,
ROLLBACK WORK, SET CONSTRAINTS, and UPDATE.
When you use a stored procedure as a triggered action, the objects that it
references are not checked until the procedure is executed.
SQL Statements 1-215
CREATE TRIGGER
Privileges to Execute Triggered Actions
If you are not the trigger owner but the trigger owners privileges include the
WITH GRANT OPTION privilege, you inherit the owners privileges as well as
the WITH GRANT OPTION privilege for each triggered SQL statement. You
have these privileges in addition to your privileges.
If the triggered action is a stored procedure, you must have the Execute
privilege on the procedure or the owner of the trigger must have the Execute
privilege and the WITH GRANT OPTION privilege. Inside the stored
procedure, you do not carry the privileges of the trigger owner; instead you
have the following privileges:
1. The triggered action is a DBA-privileged procedure.
When you are granted the Execute privilege on the procedure, the
database server automatically grants you DBA privileges for the
procedure execution. These DBA privileges are available only when
you are executing the procedure.
2. The triggered action is an owner-privileged procedure.
If the procedure owner has the WITH GRANT OPTION right for the
necessary privileges on the underlying objects, you inherit these
privilege when you are granted the Execute privilege. In this case, all
the nonqualied objects that the procedure references are qualied
by the name of the procedure owner.
If the procedure owner does not have the WITH GRANT OPTION
right, you have your original privileges on the underlying objects
when the procedure executes.
For more information on privileges on stored procedures, see Chapter 12 in
the Informix Guide to SQL: Tutorial.
1-216 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
Creating a Triggered Action That Anyone Can Use
To create a trigger that is executable by anyone who has the privileges to
execute the triggering statement, you can ask the DBA to create a
DBA-privileged procedure and grant you the Execute privilege with the
WITH GRANT OPTION right. You then use the DBA-privileged procedure as
the triggered action. Anyone can execute the triggered action because the
DBA-privileged procedure carries the WITH GRANT OPTION right. When you
activate the procedure, the database server applies privilege-checking rules
for a DBA. For more information about privileges on stored procedures, see
Chapter 12 of the Informix Guide to SQL: Tutorial.
Cascading Triggers
The database server allows triggers to cascade, meaning that the triggered
actions of one trigger can activate another trigger. The maximum number of
triggers in a cascading sequence is 61; the initial trigger plus a maximum of
60 cascading triggers. When the number of cascading triggers in a series
exceeds the maximum, the database server returns error number -748, as the
following example shows:
Exceeded limit on maximum number of cascaded triggers.
The following example illustrates a series of cascading triggers that enforce
referential integrity on the manufact, stock, and items tables in the stores7
database. When a manufacturer is deleted from the manufact table, the rst
trigger, del_manu, deletes all the items from that manufacturer from the
stock table. Each delete in the stock table activates a second trigger,
del_items, that deletes all the items from that manufacturer from the items
table. Finally, each delete in the items table triggers the stored procedure
log_order, which creates a record of any orders in the orders table that can no
longer be lled.
CREATE TRIGGER del_manu
DELETE ON manufact
REFERENCING OLD AS pre_del
FOR EACH ROW(DELETE FROM stock
WHERE manu_code = pre_del.manu_code);
CREATE TRIGGER del_stock
DELETE ON stock
REFERENCING OLD AS pre_del
FOR EACH ROW(DELETE FROM items
SQL Statements 1-217
CREATE TRIGGER
WHERE manu_code = pre_del.manu_code);
CREATE TRIGGER del_items
DELETE ON items
REFERENCING OLD AS pre_del
FOR EACH ROW(EXECUTE PROCEDURE log_order(pre_del.order_num));
When you are not using logging, or you are using the INFORMIX-SE database
server, with or without logging, referential integrity constraints on both the
manufact and stock tables would prohibit the triggers in this example from
executing. When you use INFORMIX-OnLine Dynamic Server with logging,
however, the triggers execute successfully because constraint checking is
deferred until all the triggered actions are complete, including the actions of
cascading triggers. See Constraint Checking on page 1-217 for more infor-
mation about how constraints are handled when triggers execute.
The database server prevents loops of cascading triggers by not allowing you
to modify the triggering table in any cascading triggered action, except an
UPDATE statement, which does not modify any column that the triggering
UPDATE statement updated.
Constraint Checking
When you use logging, INFORMIX-OnLine Dynamic Server defers constraint
checking on the triggering statement until after the statements in the
triggered-action list execute. OnLine effectively executes a SET statement
(SET CONSTRAINTS ALL DEFERRED) before it executes the triggering
statement. After the triggered action is completed, it effectively executes
another SET statement (SET CONSTRAINTS constr_name IMMEDIATE) to check
the constraints that were deferred. This action allows you to write triggers so
that the triggered action can resolve any constraint violations that the
triggering statement creates. For more information, see the SET statement on
page 1-501.
1-218 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
Consider the following example, in which the table child has constraint r1,
which references the table parent. You dene trigger trig1 and activate it with
an INSERT statement. In the triggered action, trig1 checks to see if parent has
a row with the value of the current cola in child; if not, it inserts it.
CREATE TABLE parent (cola INT PRIMARY KEY);
CREATE TABLE child (cola INT REFERENCES parent CONSTRAINT r1);
CREATE TRIGGER trig1 INSERT ON child
REFERENCING NEW AS new
FOR EACH ROW
WHEN((SELECT COUNT (*) FROM parent
WHERE cola = new.cola) = 0)
-- parent row does not exist
(INSERT INTO parent VALUES (new.cola));
When you insert a row into a table that is the child table in a referential
constraint, the row might not exist in the parent table. The database server
does not immediately return this error on a triggering statement. Instead, it
allows the triggered action to resolve the constraint violation by inserting the
corresponding row into the parent table. As the previous example shows,
you can check within the triggered action to see whether the parent row
exists, and if so, bypass the insert.
For an INFORMIX-OnLine Dynamic Server database without logging, OnLine
does not defer constraint checking on the triggering statement. In this case, it
immediately returns an error if the triggering statement violates a constraint.
OnLine does not allow the SETstatement in a triggered action. OnLine checks
this restriction when you activate a trigger because the statement could occur
inside a stored procedure.
For an INFORMIX-SE database, with or without logging, constraint checking
occurs prior to the triggered action. If a constraint violation results from the
triggering statement, INFORMIX-SE returns an error immediately.
SE
SQL Statements 1-219
CREATE TRIGGER
Preventing Triggers from Overriding Each Other
When you activate multiple triggers with an UPDATE statement, a trigger can
possibly override the changes that an earlier trigger made. If you do not want
the triggered actions to interact, you can split the UPDATE statement into
multiple UPDATE statements, each of which updates an individual column.
As another alternative, you can create a single update trigger for all columns
that require a triggered action. Then, inside the triggered action, you can test
for the column being updated and apply the actions in the desired order. This
approach, however, is different than having the database server apply the
actions of individual triggers, and it has the following disadvantages:
I If the trigger has a BEFORE action, it applies to all columns because
you cannot yet detect whether a column has changed.
I If the triggering UPDATE statement sets a column to the current
value, you cannot detect the update, so the triggered action is
skipped. You might want to execute the triggered action even though
the value of the column has not changed.
The Client/Server Environment
In an OnLine database, the statements inside the triggered action can affect
tables in external databases. The following example shows an update trigger
on dbserver1, which triggers an update to items on dbserver2:
CREATE TRIGGER upd_nt UPDATE ON newtab
REFERENCING new AS post
FOR EACH ROW(UPDATE stores7@dbserver2:items
SET quantity = post.qty WHERE stock_num = post.stock
AND manu_code = post.mc)
1-220 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
If a statement from an external database server initiates the trigger, however,
and the triggered action affects tables in an external database, the triggered
actions fail. For example, the following combination of triggered action and
triggering statement results in an error when the triggering statement
executes:
-- Triggered action from dbserver1 to dbserver3:
CREATE TRIGGER upd_nt UPDATE ON newtab
REFERENCING new AS post
FOR EACH ROW(UPDATE stores7@dbserver3:items
SET quantity = post.qty WHERE stock_num = post.stock
AND manu_code = post.mc);
-- Triggering statement from dbserver2:
UPDATE stores7@dbserver1:newtab
SET qty = qty * 2 WHERE s_num = 5
AND mc = 'ANZ';
In an INFORMIX-SE database, all objects referenced in the triggered actions
must be in the current database.
Logging and Recovery
You can create triggers for databases, with and without logging. However,
when the database does not have logging, you cannot roll back when the
triggering statement fails. In this case, you are responsible for maintaining
data integrity in the database.
In INFORMIX-OnLine Dynamic Server, if the trigger fails and the database has
transactions, all triggered actions and the triggering statement are rolled back
because the triggered actions are an extension of the triggering statement.
The rest of the transaction, however, is not rolled back.
In INFORMIX-SE, if you explicitly begin a transaction, you must explicitly roll
back the whole transaction. If the database has no transactions, data integrity
might possibly be violated when the triggered actions fail.
Even if the database has logging, any data denition statement in the
triggered action cannot be rolled back. Again, you are responsible for
maintaining data integrity as well as integrity of the database structure.
SE
SE
SQL Statements 1-221
CREATE TRIGGER
The row action of the triggering statement occurs before the triggered actions
in the FOR EACH ROWsection. If the triggered action fails for a database
without logging, the application must restore the row that was changed by
the triggering statement to its previous value.
When you use a stored procedure as a triggered action, if you terminate the
procedure in an exception-handling section, any actions that modify data
inside that section are rolled back along with the triggering statement. In the
following partial example, when the exception handler traps an error, it
inserts a row into the table logtab:
ON EXCEPTION IN (-201)
INSERT INTO logtab values (errno, errstr);
RAISE EXCEPTION -201
END EXCEPTION
When the RAISE EXCEPTION statement returns the error, however, the
database server rolls back this insert because it is part of the triggered actions.
If the procedure is executed outside a triggered action, the insert is not rolled
back.
The stored procedure that implements a triggered action cannot contain any
BEGIN WORK, COMMIT WORK, or ROLLBACK WORK statements. If the
database has logging, you must either begin an explicit transaction before the
triggering statement, or the statement itself must be an implicit transaction.
In any case, another transaction-related statement cannot appear inside the
stored procedure.
You can use triggers to enforce referential actions that the database server
does not currently support. For any INFORMIX-SE database or for an
INFORMIX-OnLine Dynamic Server database without logging, you are
responsible for maintaining data integrity when the triggering statement
fails.
1-222 Informi x Gui de to SQL: Syntax
CREATE TRIGGER
Trigger Object Modes
The Trigger Object Modes option allows you to create a trigger in either the
enabled or disabled object mode.
You can create triggers in the following object modes.
Specifying Object Modes for Triggers
You must observe the following rules when you specify the object mode for
a trigger in the CREATE TRIGGER statement:
I If you do not specify the disabled or enabled object modes explicitly,
the default object mode is enabled.
I In contrast to unique indexes and constraints of all types, you cannot
set triggers to the ltering object mode because a trigger does not
impose any type of data-integrity requirement on the tables in the
database.
Trigger Object
Modes
DISABLED
ENABLED
Object Mode Effect
disabled When a trigger is created in disabled mode, the database server
does not execute the triggered action when the trigger event (an
insert, delete, or update operation) takes place. In effect, the
database server ignores the trigger even though its catalog
information is maintained.
enabled When a trigger is created in enabled mode, the database server
executes the triggered action when the trigger event (an insert,
delete, or update operation) takes place.
SQL Statements 1-223
CREATE TRIGGER
I You can use the SET statement to switch the mode of a disabled
trigger to the enabled mode. Once the trigger has been re-enabled,
the database server executes the triggered action whenever the
trigger event takes place. However, the re-enabled trigger does not
perform retroactively. The database server does not attempt to
execute the trigger for rows that were inserted, deleted, or updated
after the trigger was disabled and before it was enabled; therefore, be
cautious about disabling a trigger. If disabling a trigger will
eventually destroy the semantic integrity of the database, do not
disable the trigger in the rst place.
I You cannot create a trigger on a violations table or a diagnostics
table.
References
See the DROP TRIGGER, CREATE PROCEDURE, and EXECUTE PROCEDURE
statements in this manual.
In the Informix Guide to SQL: Tutorial, see Chapter 12.
1-224 Informi x Gui de to SQL: Syntax
CREATE VIEW
CREATE VIEW
Use the CREATE VIEW statement to create a new view that is based upon
existing tables and views in the database.
Syntax
Usage
Except for the statements in the following list, you can use a view in any
<vk>SQL statement where you can use a table.
The view behaves like a table that is called view name. It consists of the set of
rows and columns that the SELECT statement returns each time the SELECT
statement is executed by using the view. The view reects changes to the
underlying tables with one exception. If a SELECT * clause denes the view,
the view has only the columns in the underlying tables at the time the view
is created. New columns that are subsequently added to the underlying
tables with the ALTER TABLE statement do not appear in the view.
Element Purpose Restrictions Syntax
column name The name of a column or
columns in the view
See Naming View Columns on
page 1-226.
Identier, p. 1-723
WITH CHECK
OPTION
column
name
CREATE VIEW
) (
,
AS
View
Name
p. 1-772
SELECT
Statement
(Subset)
p. 1-225
ALTER FRAGMENT DROP TABLE
ALTER INDEX DROP TRIGGER
ALTER TABLE LOCK TABLE
CREATE INDEX RECOVER TABLE
CREATE TABLE RENAME TABLE
CREATE TRIGGER UNLOCK TABLE
DROP INDEX
SQL Statements 1-225
CREATE VIEW
The view name must be unique; that is, a view name cannot have the same
name as another database object, such as a table, synonym, or temporary
table.
The view inherits the data types of the columns from the tables from which
they come. Data types of virtual columns are determined from the nature of
the expression.
To create a view, you must have the Select privilege on all columns from
which the view is derived.
The SELECT statement is stored in the sysviews system catalog table. When
you subsequently refer to a view in another statement, the database server
performs the dening SELECT statement while it executes the new statement.
You cannot use a ROLLBACK WORK statement to undo a CREATE VIEW
statement. If you roll back a transaction that contains a CREATE VIEW
statement, the view remains, and you do not receive an error message.
If you create a view outside the CREATE SCHEMA statement, you receive
warnings if you use the -ansi ag or set DBANSIWARN.
Subset of a SELECT Allowed in CREATE VIEW
The SELECT statement has the form that is described on page 1-459, but in
CREATE VIEW, it cannot have an ORDER BY clause, INTO TEMP clause, or
UNION operator. Do not use display labels in the select list; display labels are
interpreted as column names.
SE
DB
1-226 Informi x Gui de to SQL: Syntax
CREATE VIEW
Naming View Columns
The number of columns that you specify in the column name parameter must
match the number of columns returned by the SELECT statement that denes
the view.
If you do not specify a list of columns, the view inherits the column names of
the underlying tables. In the following example, the view herostock has the
same column names as the ones in the SELECT statement:
CREATE VIEW herostock AS
SELECT stock_num, description, unit_price, unit, unit_descr
FROM stock WHERE manu_code = 'HRO'
If the SELECT statement returns an expression, the corresponding column in
the view is called a virtual column. You must provide a name for virtual
columns. You must also provide a column name in cases where the selected
columns have duplicate column names when the table prexes are stripped.
For example, when both orders.order_num and items.order_num appear in
the SELECT statement, you must provide two separate column names to label
them in the CREATE VIEW statement, as the following example shows:
CREATE VIEW someorders (custnum,ocustnum,newprice) AS
SELECT orders.order_num,items.order_num,
items.total_price*1.5
FROM orders, items
WHERE orders.order_num = items.order_num
AND items.total_price > 100.00
If you must provide names for some of the columns in a view, then you must
provide names for all the columns; that is, the column list must contain an
entry for every column that appears in the view.
Using a View in the SELECT Statement
You can dene a view in terms of other views, but you must abide by the
restrictions on creating views that are listed in Chapter 10 of the Informix
Guide to SQL: Tutorial. See that manual for further information.
SQL Statements 1-227
CREATE VIEW
WITH CHECK OPTION Keywords
The WITH CHECK OPTION keywords instruct the database server to ensure
that all modications that are made through the view to the underlying tables
satisfy the denition of the view.
The following example creates a view that is named palo_alto, which uses all
the information in the customer table for customers in the city of Palo Alto.
The database server checks any modications made to the customer table
through palo_alto because the WITH CHECK OPTION is specied.
CREATE VIEW palo_alto AS
SELECT * FROM customer
WHERE city = 'Palo Alto'
WITH CHECK OPTION
What do the WITH CHECK OPTIONkeywords really check and prevent? It is
possible to insert into a view a row that does not satisfy the conditions of the
view (that is, a row that is not visible through the view). It is also possible to
update a row of a view so that it no longer satises the conditions of the view.
For example, if the view was created without the WITH CHECK OPTION
keywords, you could insert a row through the view where the city is Los
Altos, or you could update a row through the view by changing the city from
Palo Alto to Los Altos.
To prevent such inserts and updates, you can add the WITH CHECK OPTION
keywords when you create the view. These keywords ask the database server
to test every inserted or updated row to ensure that it meets the conditions
that are set by the WHERE clause of the view. The database server rejects the
operation with an error if the row does not meet the conditions.
However, even if the view was created with the WITH CHECK OPTION
keywords, you can perform inserts and updates through the view to change
columns that are not part of the view denition. A column is not part of the
view denition if it does not appear in the WHERE clause of the SELECT
statement that denes the view.
1-228 Informi x Gui de to SQL: Syntax
CREATE VIEW
Updating Through Views
If a view is built on a single table, the view is updatable if the SELECT statement
that dened it did not contain any of the following items:
I Columns in the select list that are aggregate values
I Columns in the select list that use the UNIQUE or DISTINCT keyword
I A GROUP BY clause
I A derived value for a column, which was created using an
arithmetical expression
In an updatable view, you can update the values in the underlying table by
inserting values into the view.
Important: You cannot update or insert rows in a remote table through views with
check options.
References
See the CREATE TABLE, DROP VIEW, GRANT, SELECT, and SET SESSION
AUTHORIZATION statements in this manual.
In the Informix Guide to SQL: Tutorial, see the discussions of views and
security in Chapter 10.
SQL Statements 1-229
DATABASE
DATABASE
Use the DATABASE statement to select an accessible database as the current
database.
Syntax
Usage
You can use the DATABASE statement to select any database on your database
server. To select a database on another OnLine database server, specify the
name of the database server with the database name.
If you specify the name of the current database server or another database
server with the database name, the database server name cannot be
uppercase.
Issuing a DATABASE statement when a database is already open closes the
current database before opening the new one. Closing the current database
releases any cursor resources held by the database server, which invalidates
any cursors you have declared up to that point. If the user identity was
changed through a SET SESSION AUTHORIZATION statement, the original
user name is restored.
The current user (or PUBLIC) must have the Connect privilege on the
database specied in the DATABASE statement. The current user cannot have
the same user name as an existing role in the database.
You cannot include the DATABASE statement in a multistatement PREPARE
operation.
You can determine the type of database a user selects by checking the
warning ag after a DATABASE statement in the sqlca structure.
DATABASE
EXCLUSIVE
+
Database
Name
p. 1-660
ESQL
1-230 Informi x Gui de to SQL: Syntax
DATABASE
If the database has transactions, the second element of the sqlwarn structure
contains a W after the DATABASE statement executes. See the following table
for the name of the variable that each SQL API product uses.
If the database is ANSI compliant, the third element of the sqlwarn structure
contains a W after the DATABASE statement executes. See the following table
for the name of the variable that each product uses.
If the database is an INFORMIX-OnLine Dynamic Server database, the fourth
element of the sqlwarn structure contains a W after the DATABASE statement
executes. See the following table for the name of the variable that each
product uses.
Product Field Name
ESQL/C sqlca.sqlwarn.sqlwarn1
ESQL/COBOL SQLWARN1 OF SQLWARN OF SQLCA
SE
SE
ESQL
1-232 Informi x Gui de to SQL: Syntax
DEALLOCATE DESCRIPTOR
DEALLOCATE DESCRIPTOR
Use the DEALLOCATE DESCRIPTOR statement to free a system-descriptor
area that was previously allocated for a specied descriptor or descriptor
variable.
Syntax
Usage
The DEALLOCATE DESCRIPTOR statement frees all the memory that is
associated with the system-descriptor area that descriptor or descriptor variable
identies. It also frees all the value descriptors (including memory for data
values in the value descriptors).
You can reuse a descriptor or descriptor variable after it is deallocated.
Deallocation occurs automatically at the end of the program.
If you deallocate a nonexistent descriptor or descriptor variable, an error
results.
Element Purpose Restrictions Syntax
descriptor Quoted string that identies a
system-descriptor area
System-descriptor area must
already be allocated. The
surrounding quotes must be
single.
Quoted String,
p. 1-757
descriptor
variable
Host variable name that
identies a system-descriptor
area
System-descriptor area must
already be allocated.
Variable name must
conform to
language-specic
rules for variable
names.
descriptor
variable
DEALLOCATE DESCRIPTOR
'descriptor '
+
ESQL
SQL Statements 1-233
DEALLOCATE DESCRIPTOR
You cannot use the DEALLOCATE DESCRIPTOR statement to deallocate an
sqlda structure. You can use it only to free the memory that is allocated for a
system-descriptor area.
The following examples show the DEALLOCATE DESCRIPTOR statement for
INFORMIX-ESQL/C and INFORMIX-ESQL/COBOL, respectively. In each
example, the rst line shows an embedded-variable name, and the second
line shows a quoted string that identies the allocated system-descriptor
area.
INFORMIX-ESQL/C
EXEC SQL deallocate descriptor :descname;
EXEC SQL deallocate descriptor 'desc1';
INFORMIX-ESQL/COBOL
EXEC SQL DEALLOCATE DESCRIPTOR :DESCNAME END-EXEC.
EXEC SQL DEALLOCATE DESCRIPTOR 'DESC1' END-EXEC.
References
See the ALLOCATE DESCRIPTOR, DECLARE, DESCRIBE, EXECUTE, FETCH, GET
DESCRIPTOR, OPEN, PREPARE, PUT, and SET DESCRIPTOR statements in this
manual.
In the Informix Guide to SQL: Tutorial, see the discussion of dynamic SQL in
Chapter 5.
E/C
1-234 Informi x Gui de to SQL: Syntax
DECLARE
DECLARE
Use the DECLARE statement to dene a cursor that represents the active set
of rows that a SELECT, INSERT, or EXECUTE PROCEDURE statement species.
Syntax
SELECT
Statement
p. 1-459
statement id
WITH
HOLD
column
name
OF
WITH
HOLD
SCROLL
CURSOR
+
+
cursor
variable
EXECUTE
PROCEDURE
Statement
p. 1-293
DECLARE
cursor
id
CURSOR
+
FOR
INSERT
Statement
(Subset)
p. 1-250
ESQL
,
statement id
variable
+
+
FOR
FOR READ ONLY
+
FOR
UPDATE
SELECT
Statement
(Subset)
p. 1-245
SQL Statements 1-235
DECLARE
Usage
The DECLARE statement associates the cursor with a SELECT, INSERT, or
EXECUTE PROCEDURE statement or with the statement identier (statement id
or statement id variable) of a prepared statement.
The DECLARE statement assigns an identier to the cursor, species its uses,
and directs the preprocessor to allocate storage to hold the cursor.
The DECLARE statement must precede any other statement that refers to the
cursor during the execution of the program.
Element Purpose Restrictions Syntax
column name A column that you can update
through the cursor
The specied column must exist,
but it does not have to be in the
select list of the SELECT clause.
Identier, p. 1-723
cursor id The name that the DECLARE
statement assigns to the cursor
and that refers to the cursor in
other statements
You cannot specify a cursor
name that a previous DECLARE
statement in the same program
has specied.
Identier, p. 1-723
cursor variable An embedded variable name
that holds the value of cursor id
Variable must be a character data
type.
The name must
conform to
language-specic
rules for variable
names.
statement id A statement identier that is a
data structure representing the
text of a prepared statement
The statement id must have
already been specied in a
PREPARE statement in the same
program.
Identier, p. 1-723,
and PREPARE,
p. 1-402
statement id
variable
An embedded variable name
that holds the value of statement
id
Variable must be a character data
type.
The name must
conform to
language-specic
rules for variable
names.
1-236 Informi x Gui de to SQL: Syntax
DECLARE
When the cursor is used with a SELECT statement, it is a data structure that
represents a specic location within the active set of rows that the SELECT
statement retrieved. You associate a cursor with an INSERT statement if you
want to add multiple rows to the database in an INSERT operation. When the
cursor is used with an INSERT statement, it represents the rows that the
INSERT statement is to add to the database. When the cursor is used with an
EXECUTE PROCEDURE statement, it represents the columns or values that the
stored procedure retrieved.
The amount of available memory in the system limits the number of open
cursors and prepared statements that you can have at one time in one
process. Use FREE statement id or FREE statement id variable to release the
resources that a prepared statement holds; use FREE cursor id or FREE cursor
variable to release resources that a cursor holds.
A program can consist of one or more source-code les. By default, the scope
of a cursor is global to a program, so a cursor declared in one le can be refer-
enced from another le.
In a multiple-le program, if you want to limit the scope of cursors to the les
in which they are declared, you must preprocess all the les with the -local
command-line option. See your SQL API product manual for more infor-
mation, restrictions, and performance issues when you preprocess with the
-local option.
A variable used in place of the cursor name or statement identier must be
the CHARACTER data type. In ESQL/C programs, the variable must be
dened as exec sql char.
A variable that is used in place of the cursor name or statement identier
must be the CHARACTER data type. In ESQL/COBOL programs, declare such
a variable as a standard CHARACTER type.
To declare multiple cursors, use a single statement identier. For instance, the
following INFORMIX-ESQL/C example does not return an error:
EXEC SQL prepare id1 from 'select * from customer';
EXEC SQL declare x cursor for id1;
EXEC SQL declare y scroll cursor for id1;
EXEC SQL declare z cursor with hold for id1;
E/C
E/CO
SQL Statements 1-237
DECLARE
If you include the -ansi compilation ag (or if DBANSIWARN is set),
warnings are generated for statements that use dynamic cursor names or
dynamic statement identier names. Some error checking is performed at
runtime. The following list indicates the typical checks:
I Illegal use of cursors (that is, normal cursors used as scroll cursors)
I Use of undeclared cursors
I Bad cursor or statement names (empty)
Checks for multiple declarations of a cursor of the same name are performed
at compile time only if the cursor or statement is an identier. For example,
the code in the rst example below results in a compile error. The code in the
second example does not result in a compile error because it uses a host
variable to hold the cursor name.
Results in error
EXEC SQL declare x cursor for
select * from customer;
. . .
EXEC SQL declare x cursor for
select * from orders;
Runs successfully
EXEC SQL declare x cursor for
select * from customer;
. . .
stcopy("x", s);
EXEC SQL declare :s cursor for
select * from customer;
Overview of Cursor Types
Functionally, a cursor can be associated with a SELECT statement (a select
cursor), an EXECUTE PROCEDURE statement (a procedure cursor) that returns
values, or an INSERT statement (an insert cursor). You can use a select cursor
to update or delete rows; it is called an update cursor.
1-238 Informi x Gui de to SQL: Syntax
DECLARE
A cursor can also be associated with a statement identier, enabling you to
use a cursor with INSERT, SELECT, or EXECUTE PROCEDURE statements that
are prepared dynamically and to use different statements with the same
cursor at different times. In this case, the type of cursor depends on the
statement that is prepared at the time the cursor is opened (see the OPEN
statement on page 1-390).
Tip: Cursors for stored procedures behave the same as select cursors, which are
enabled as update cursors.
Select or Procedure Cursor
A select or procedure cursor enables you to scan multiple rows of data and to
move data row by row into a set of receiving variables, as the following steps
describe:
1. Use a DECLARE statement to dene a cursor for the SELECT
statement or for the EXECUTE PROCEDURE statement.
2. Open the cursor with the OPEN statement. The database server
processes the query until it locates or constructs the rst row of the
active set.
3. Retrieve successive rows of data with the FETCH statement.
4. Close the cursor with the CLOSE statement when the active set is no
longer needed.
5. Free the cursor with the FREE statement. The FREE statement releases
the resources that are allocated for a declared cursor.
A select cursor can be explicitly declared as read only with the FOR READ
ONLY option.
Read-Only Cursor
Use the FOR READ ONLY option to state explicitly that a select cursor cannot
be used to modify data. In a database that is not ANSI compliant, a select
cursor and a select cursor that is built with the FOR READ ONLY option are the
same. Neither can be used to update data.
In an ANSI-compliant database, if you want a select cursor to be read only,
you must use the FOR READ ONLY keywords when you declare the cursor.
ANSI
SQL Statements 1-239
DECLARE
Update Cursor
Use the FOR UPDATE keywords to declare an update cursor. You can use the
update cursor to modify (update or delete) the current row.
In an ANSI-compliant database, you can use a select cursor to update or
delete data as long as the cursor was not declared with the FOR READ ONLY
keywords and it follows the restrictions on update cursors that are described
in Subset of the SELECT Statement Associated with Cursors on page 1-245.
You do not need to use the FOR UPDATE keywords when you declare the
cursor.
Insert Cursor
An insert cursor increases processing efciency (compared with embedding
the INSERT statement directly). The insert cursor allows bulk insert data to be
buffered in memory and written to disk when the buffer is full. This process
reduces communication between the program and the database server and
also increases the speed of the insertions.
Cursor Characteristics
Structurally, you can declare a cursor as a sequential cursor (the default
condition), a scroll cursor (using the SCROLL keyword), or a hold cursor (using
the WITH HOLD keywords). The following sections explain these structural
characteristics.
Sequential Cursor
If you use only the CURSOR keyword in a DECLARE statement, you create a
sequential cursor, which can fetch only the next row in sequence from the
active set. The sequential cursor can read through the active set only once
each time it is opened. If you are using a sequential cursor, on each execution
of the FETCH statement, the database server returns the contents of the
current row and locates the next row in the active set.
The following INFORMIX-ESQL/C example is read only in a database that is
not ANSI compliant and read/updatable in an ANSI-compliant database:
EXEC SQL declare s_cur cursor for
select fname, lname into :st_fname, :st_lname
from orders where customer_num = 114;
ANSI
1-240 Informi x Gui de to SQL: Syntax
DECLARE
Scroll Cursor
The SCROLL keyword creates a scroll cursor, which you can use to fetch rows
of the active set in any sequence. To implement a scroll cursor, the database
server creates a temporary table to hold the active set. With the active set
retained as a table, you can fetch the rst, last, or any intermediate rows as
well as fetch rows repeatedly without having to close and reopen the cursor.
See the FETCH statement on page 1-296 for a discussion of these abilities.
The database server retains the active set for a scroll cursor in a temporary
table until the cursor is closed. On a multiuser system, the rows in the tables
from which the active-set rows were derived might change after a copy is
made in the temporary table. (For information about temporary tables, see
the INFORMIX-OnLine Dynamic Server Administrators Guide.) If you use a
scroll cursor within a transaction, you can prevent copied rows from
changing either by setting the isolation level to Repeatable Read (available
only with INFORMIX-OnLine Dynamic Server) or by locking the entire table
in share mode during the transaction. (See the SET ISOLATION statement on
page 1-575 and the LOCK TABLE statement on page 1-387.)
The following example creates a scroll cursor:
DECLARE sc_cur SCROLL CURSOR FOR
SELECT * FROM orders
Hold Cursor
If you use the WITH HOLD keywords, you create a hold cursor. A hold cursor
remains open after a transaction ends. You can use the WITH HOLD keywords
to declare both sequential and scroll cursors. The following example creates
a hold cursor:
DECLARE hld_cur CURSOR WITH HOLD FOR
SELECT customer_num, lname, city FROM customer
A hold cursor allows uninterrupted access to a set of rows across multiple
transactions. Ordinarily, all cursors close at the end of a transaction; a hold
cursor does not close.
SQL Statements 1-241
DECLARE
You can use a hold cursor as the following ESQL/C code example shows. This
code fragment uses a hold cursor as a master cursor to scan one set of records
and a sequential cursor as a detail cursor to point to records that are located
in a different table. The records that the master cursor scans are the basis for
updating the records to which the detail cursor points. The COMMIT WORK
statement at the end of each iteration of the rst WHILE loop leaves the hold
cursor c_master open but closes the sequential cursor c_detail and releases
all locks. This technique minimizes the resources that the database server
must devote to locks and unnished transactions, and it gives other users
immediate access to updated rows.
EXEC SQL BEGIN DECLARE SECTION;
int p_custnum,
int save_status;
long p_orddate;
EXEC SQL END DECLARE SECTION;
EXEC SQL prepare st_1 from
'select order_date
from orders where customer_num = ? for update';
EXEC SQL declare c_detail cursor for st_1;
EXEC SQL declare c_master cursor with hold for
select customer_num
from customer where city = 'Pittsburgh';
EXEC SQL open c_master;
if(SQLCODE==0) /* the open worked */
EXEC SQL fetch c_master into :p_custnum; /* discover first customer */
while(SQLCODE==0) /* while no errors and not end of pittsburgh customers */
{
EXEC SQL begin work; /* start transaction for customer p_custnum */
EXEC SQL open c_detail using :p_custnum;
if(SQLCODE==0) /* detail open succeeded */
EXEC SQL fetch c_detail into :p_orddate; /* get first order */
while(SQLCODE==0) /* while no errors and not end of orders */
{
EXEC SQL update orders set order_date = '08/15/94'
where current of c_detail;
if(status==0) /* update was ok */
EXEC SQL fetch c_detail into :p_orddate; /* next order */
}
if(SQLCODE==SQLNOTFOUND) /* correctly updated all found orders */
EXEC SQL commit work; /* make updates permanent, set status */
else /* some failure in an update */
{
save_status = SQLCODE; /* save error for loop control */
EXEC SQL rollback work;
SQLCODE = save_status; /* force loop to end */
}
if(SQLCODE==0) /* all updates, and the commit, worked ok */
EXEC SQL fetch c_master into :p_custnum; /* next customer? */
}
EXEC SQL close c_master;
1-242 Informi x Gui de to SQL: Syntax
DECLARE
Use either the CLOSE statement to close the hold cursor explicitly or the
CLOSE DATABASE or DISCONNECT statements to close it implicitly. The
CLOSE DATABASE statement closes all cursors.
Declaring a Cursor as an Update or Read-Only Cursor
When you associate a cursor with a SELECT statement, you can dene it as an
update cursor or as a read-only cursor, as follows:
I Use the FOR UPDATE keywords to dene the cursor as an update
cursor.
I Use the FOR READ ONLY keywords to dene the cursor as a
read-only cursor.
You cannot specify both the FOR UPDATE option and the FOR READ ONLY
option in the same DECLARE statement because these options are mutually
exclusive.
Dening an Update Cursor
Use the FOR UPDATE keywords to notify the database server that updating is
possible and cause it to use more stringent locking than with a select cursor.
You can specify particular columns that can be updated.
After you create an update cursor, you can update or delete the currently
selected row by using an UPDATE or DELETE statement with the WHERE
CURRENT OF clause. The words CURRENT OF refer to the row that was most
recently fetched; they take the place of the usual test expressions in the
WHERE clause.
An update cursor lets you perform updates that are not possible with the
UPDATE statement because the decision to update and the values of the new
data items can be based on the original contents of the row. Your program can
evaluate or manipulate the selected data before it decides whether to update.
The UPDATE statement cannot interrogate the table that is being updated.
All simple select cursors are potentially update cursors even if they are
declared without the FOR UPDATE keywords. (See the restrictions on SELECT
statements associated with update cursors in Subset of the SELECT
Statement Associated with Cursors on page 1-245.)
ANSI
SQL Statements 1-243
DECLARE
Locking with an Update Cursor
You declare an update cursor to let the database server know that the
program might update (or delete) any row that it fetches as part of the
SELECT statement. The update cursor employs promotable locks for rows that
the program fetches. Other programs can read the locked row, but no other
program can place a promotable or write lock. Before the program modies
the row, the row lock is promoted to an exclusive lock.
The INFORMIX-SE database server does not use promotable locks. Before the
program modies a row, the database server obtains an exclusive lock on the
row.
Although it is possible to declare an update cursor with the WITH HOLD
keywords, the only reason to do so is to break a long series of updates into
smaller transactions. You must fetch and update a particular row in the same
transaction.
If an operation involves fetching and updating a very large number of rows,
the lock table that the database server maintains can overow. The usual way
to prevent this overow is to lock the entire table that is being updated. If this
action is impossible, an alternative is to update through a hold cursor and to
execute COMMIT WORK at frequent intervals. However, you must plan such
an application very carefully because COMMIT WORK releases all locks, even
those that are placed through a hold cursor.
Using FOR UPDATE with a List of Columns
When you declare an update cursor, you can limit the update to specic
columns by including the OF keyword and a list of columns. You can modify
only those named columns in subsequent UPDATE statements. The columns
need not be in the select list of the SELECT clause.
This column restriction applies only to UPDATE statements. The OF column
clause has no effect on subsequent DELETE statements that use a WHERE
CURRENT OF clause. (A DELETE statement removes the contents of all
columns.)
SE
1-244 Informi x Gui de to SQL: Syntax
DECLARE
The principal advantage to specifying columns is documentation and
preventing programming errors. (The database server refuses to update any
other columns.) An additional advantage is speed, when the SELECT
statement meets the following criteria:
I The SELECT statement can be processed using an index.
I The columns that are listed are not part of the index that is used to
process the SELECT statement.
If the columns that you intend to update are part of the index that is used to
process the SELECT statement, the database server must keep a list of each
row that is updated to ensure that no row is updated twice. When you use
the OF keyword to specify the columns that can be updated, the database
server determines whether to keep the list of updated rows. If the database
server determines that the list is unnecessary, then eliminating the work of
keeping the list results in a performance benet. If you do not use the OF
keyword, the database server keeps the list of updated rows, although it
might be unnecessary.
The following example contains INFORMIX-ESQL/C code that uses an update
cursor with a DELETE statement to delete the current row. Whenever the row
is deleted, the cursor remains between rows. After you delete data, you must
use a FETCH statement to advance the cursor to the next row before you can
refer to the cursor in a DELETE or UPDATE statement.
EXEC SQL declare q_curs cursor for
select * from customer where lname matches :last_name
for update;
EXEC SQL open q_curs;
for (;;)
{
EXEC SQL fetch q_curs into :cust_rec;
if (strncmp(SQLSTATE, "00", 2) != 0)
break;
/* Display customer values and prompt for answer */
printf("\n%s %s", cust_rec.fname, cust_rec.lname);
printf("\nDelete this customer? ");
scanf("%s", answer);
if (answer[0] == 'y')
EXEC SQL delete from customer where current of q_curs;
if (strncmp(SQLSTATE, "00", 2) != 0)
break;
}
printf("\n");
EXEC SQL close q_curs;
SQL Statements 1-245
DECLARE
Dening a Read-Only Cursor
Use the FOR READ ONLY keywords to dene a cursor as a read-only cursor.
The need for the FOR READ ONLY keywords depends on whether your
database is an ANSI-mode database or a database that is not ANSI compliant.
In a database that is not ANSI compliant, the cursor that the DECLARE
statement denes is a read-only cursor by default. So you do not need to
specify the FOR READ ONLY keywords if you want the cursor to be a read-
only cursor. The only advantage of specifying the FOR READ ONLY keywords
explicitly is for better program documentation.
In an ANSI-mode database, the cursor associated with a SELECT statement
through the DECLARE statement is an update cursor by default, provided
that the SELECT statement conforms to all of the restrictions for update
cursors listed in Subset of the SELECT Statement Associated with Cursors
below.
Therefore, you should use the FOR READ ONLY keywords in the DECLARE
statement only if you want the cursor to be a read-only cursor rather than an
update cursor. You declare a read-only cursor to let the database server know
that the program will not update (or delete) any row that it fetches as part of
the SELECT statement. The database server can use less stringent locking for
a read-only cursor than for an update cursor.
Subset of the SELECT Statement Associated with Cursors
Not all SELECT statements can be associated with an update cursor or a
read-only cursor. If the DECLARE statement includes the FOR UPDATE clause
or the FOR READ ONLY clause, you must observe certain restrictions on the
SELECT statement that is included in the DECLARE statement (either directly
or as a prepared statement).
If the DECLARE statement includes the FOR UPDATE clause, the SELECT
statement must conform to the following restrictions:
I The statement can select data from only one table.
I The statement cannot include any aggregate functions.
I The statement cannot include any of the following clauses or
keywords: DISTINCT, FOR READ ONLY, FOR UPDATE, GROUP BY,
INTO TEMP, ORDER BY, UNION, or UNIQUE.
ANSI
1-246 Informi x Gui de to SQL: Syntax
DECLARE
If the DECLARE statement includes the FOR READ ONLY clause, the SELECT
statement must conform to the following restrictions:
I The SELECT statement cannot have a FOR READ ONLY clause.
I The SELECT statement cannot have a FOR UPDATE clause.
For a complete description of SELECT syntax and usage, see the SELECT
statement on page 1-459.
Examples of Cursors in ANSI and non-ANSI Databases
In a database that is not ANSI compliant, a cursor associated with a SELECT
statement is a read-only cursor by default. The following example declares a
read-only cursor in a non-ANSI database:
EXEC SQL declare cust_curs cursor for
select * from customer_notansi;
If you want to make it clear in the program code that this cursor is a read-only
cursor, you can specify the FOR READ ONLY option as shown in the following
example:
EXEC SQL declare cust_curs cursor for
select * from customer_notansi
for read only;
If you want this cursor to be an update cursor, you need to specify the FOR
UPDATE option in your DECLARE statement. The following example declares
an update cursor:
EXEC SQL declare new_curs cursor for
select * from customer_notansi
for update;
If you want an update cursor to be able to modify only some of the columns
in a table, you need to specify these columns in the FOR UPDATE option.The
following example declares an update cursor and species that this cursor
can update only the fname and lname columns in the customer_notansi
table:
EXEC SQL declare name_curs cursor for
select * from customer_notansi
for update of fname, lname;
SQL Statements 1-247
DECLARE
In an ANSI-mode database, a cursor associated with a SELECT statement is an
update cursor by default. The following example declares an update cursor
in an ANSI-mode database:
EXEC SQL declare x_curs cursor for
select * from customer_ansi;
If you want to make it clear in the program documentation that this cursor is
an update cursor, you can specify the FOR UPDATE option as shown in the
following example:
EXEC SQL declare x_curs cursor for
select * from customer_ansi
for update;
If you want an update cursor to be able to modify only some of the columns
in a table, you must specify these columns in the FOR UPDATE option. The
following example declares an update cursor and species that this cursor
can update only the fname and lname columns in the customer_ansi table:
EXEC SQL declare y_curs cursor for
select * from customer_ansi
for update of fname, lname;
If you want a cursor to be a read-only cursor, you must override the default
behavior of the DECLARE statement by specifying the FOR READ ONLY
option in your DECLARE statement. The following example declares a
read-only cursor:
EXEC SQL declare z_curs cursor for
select * from customer_ansi
for read only;
Use this statement with caution. DB-Access does not prompt you to verify
that you want to delete the entire database.
You can use a simple database name in a program or host variable, or you can
use the full database server and database name. See Database Name on
page 1-660 for more information.
References
See the CREATE DATABASE and CLOSE DATABASE statements in this manual.
SE
ESQL
DB
ESQL
1-268 Informi x Gui de to SQL: Syntax
DROP INDEX
DROP INDEX
Use the DROP INDEX statement to remove an index.
Syntax
Usage
You must be the owner of the index or have the DBA privilege to use the
DROP INDEX statement.
The following example drops the index o_num_ix that joed owns. The
stores7 database must be the current database.
DROP INDEX stores7:joed.o_num_ix
You cannot use the DROP INDEX statement on a column or columns to drop
a unique constraint that is created with a CREATE TABLE statement; you must
use the ALTER TABLE statement to remove indexes that are created as
constraints with a CREATE TABLE or ALTER TABLE statement.
The index is not actually dropped if it is shared by constraints. Instead, it is
renamed in the sysindexes system catalog table with the following format:
[space]<tabid>_<constraint id>
In this example, tabid and constraint_id are from the systables and
sysconstraints system catalog tables, respectively. The idxname (index
name) column in the sysconstraints table is then updated to reect this
change. For example, the renamed index name might be something like this:
121_13 (quotes used to show the spaces).
If this index is a unique index with only referential constraints sharing it, the
index is downgraded to a duplicate index after it is renamed.
+
DROP INDEX
Index
Name
p. 1-741
SQL Statements 1-269
DROP INDEX
You cannot use a ROLLBACK WORK statement to undo a DROP INDEX
statement. If you roll back a transaction that contains a DROP INDEX
statement, the index is not re-created, and you do not receive an error
message.
References
See the ALTER TABLE, CREATE INDEX, and CREATE TABLE statements in this
manual.
In the INFORMIX-OnLine Dynamic Server Performance Guide, see the
discussion of indexes.
SE
1-270 Informi x Gui de to SQL: Syntax
DROP PROCEDURE
DROP PROCEDURE
Use the DROP PROCEDURE statement to remove a stored procedure from the
database.
Syntax
Usage
You must be the owner of the stored procedure or have the DBA privilege to
use the DROP PROCEDURE statement.
Dropping the stored procedure removes the text and executable versions of
the procedure.
You cannot use a ROLLBACK WORK statement to undo a DROP PROCEDURE
statement. If you roll back a transaction that contains a DROP PROCEDURE
statement, the stored procedure is not re-created, and you do not receive an
error message.
Tip: You cannot drop a stored procedure from within the same procedure.
References
See the CREATE PROCEDURE statement in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of using stored
procedures in Chapter 12.
Procedure
Name
p. 1-754
+
DROP PROCEDURE
SE
SQL Statements 1-271
DROP ROLE
DROP ROLE
Use the DROP ROLE statement to remove a previously created role.
Syntax
Usage
The DROP ROLE statement is used to remove an existing role. Either the DBA
or a user to whom the role was granted with the WITH GRANT OPTION can
issue the DROP ROLE statement.
After a role is dropped, the privileges associated with that role, such as table-
level privileges or fragment-level privileges, are dropped, and a user cannot
grant or enable a role. If a user is using the privileges of a role when the role
is dropped, the user automatically loses those privileges.
A role exists until either the DBA or a user to whom the role was granted with
the WITH GRANT OPTION uses the DROP ROLE statement to drop the role.
The following statement drops the role engineer:
DROP ROLE engineer
References
See the CREATE ROLE, GRANT, REVOKE, and SET ROLE statements in this
manual.
Element Purpose Restrictions Syntax
role name Name of the role being dropped The role name must have been
created with the CREATE ROLE
statement
Identier, p. 1-723
DROP ROLE role name
+
OL
1-272 Informi x Gui de to SQL: Syntax
DROP SYNONYM
DROP SYNONYM
Use the DROP SYNONYM statement to remove a previously dened
synonym.
Syntax
Usage
You must be the owner of the synonym or have the DBA privilege to use the
DROP SYNONYM statement.
The following statement drops the synonym nj_cust, which cathyg owns:
DROP SYNONYM cathyg.nj_cust
If a table is dropped, any synonyms that are in the same database as the table
and that refer to the table are also dropped.
If a synonym refers to an external table, and the table is dropped, the
synonym remains in place until you explicitly drop it using DROP SYNONYM.
You can create another table or synonym in place of the dropped table and
give the new object the name of the dropped table. The old synonym then
refers to the new object. See the CREATE SYNONYM statement for a complete
discussion of synonym chaining.
You cannot use a ROLLBACK WORK statement to undo a DROP SYNONYM
statement. If you roll back a transaction that contains a DROP SYNONYM
statement, the synonym is not re-created, and you do not receive an error
message.
+
DROP SYNONYM
Synonym
Name
p. 1-766
SE
SQL Statements 1-273
DROP SYNONYM
References
See the CREATE SYNONYM statement in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of synonyms in
Chapter 11.
1-274 Informi x Gui de to SQL: Syntax
DROP TABLE
DROP TABLE
Use the DROP TABLE statement to remove a table, along with its associated
indexes and data.
Syntax
Usage
You must be the owner of the table or have the DBA privilege to use the DROP
TABLE statement.
If you issue a DROP TABLE statement, you are not prompted to verify that you
want to delete an entire table.
You cannot use a ROLLBACK WORK statement to undo a DROP TABLE
statement. If you roll back a transaction that contains a DROP TABLE
statement, the table is not re-created, and you do not receive an error
message.
Effects of DROP TABLE Statement
Use the DROP TABLE statement with caution. When you remove a table, you
also delete the data stored in it, the indexes or constraints on the columns
(including all the referential constraints placed on its columns), any local
synonyms assigned to it, any triggers created for it, and any authorizations
you have granted on the table. You also drop all views based on the table and
any violations and diagnostics tables associated with the table. You do not
remove any synonyms for the table that have been created in an external
database.
DROP TABLE
CASCADE
RESTRICT
+
Synonym
Name
p. 1-766
Table
Name
p. 1-768
DB
SE
SQL Statements 1-275
DROP TABLE
Specifying CASCADE Mode
The CASCADE mode means that a DROP TABLE statement removes related
database objects, including referential constraints built on the table, views
dened on the table, and any violations and diagnostics tables associated
with the table. The CASCADE mode is the default mode of the DROP TABLE
statement. You can also specify this mode explicitly with the CASCADE
keyword.
Specifying RESTRICT Mode
With the RESTRICT keyword, you can control the success or failure of the
drop operation for tables that have referential constraints and views dened
on the table or have violations and diagnostics tables associated with the
table. Using the RESTRICT option causes the drop operation to fail and an
error message to be returned if any existing referential constraints reference
table name or if any existing views are dened on table name or if any viola-
tions and diagnostics tables are associated with table name.
Tables That Cannot Be Dropped
Observe the following restrictions on the types of tables that you can drop:
I You cannot drop any system catalog tables.
I You cannot drop a table that is not in the current database.
I You cannot drop a violations or diagnostics table. Before you can
drop such a table, you must rst issue a STOP VIOLATIONS TABLE
statement on the base table with which the violations and
diagnostics tables are associated.
1-276 Informi x Gui de to SQL: Syntax
DROP TABLE
Examples of Dropping a Table
The following example deletes two tables. Both tables are within the current
database and are owned by the current user. Neither table has a violations or
diagnostics table associated with it. Neither table has a referential constraint
or view dened on it.
DROP TABLE customer;
DROP TABLE stores7@accntg:joed.state;
References
See the CREATE TABLE and DROP DATABASE statements in this manual.
In the Informix Guide to SQL: Tutorial, see the discussions of data integrity and
creating a table in Chapter 4 and Chapter 9, respectively.
SQL Statements 1-277
DROP TRIGGER
DROP TRIGGER
Use the DROP TRIGGER statement to remove a trigger denition from the
database.
Syntax
Usage
You must be the owner of the trigger or have the DBA privilege to drop a
trigger.
Dropping a trigger removes the text of the trigger denition and the
executable trigger from the database.
The following statement drops the items_pct trigger:
DROP TRIGGER items_pct
You cannot drop a trigger inside a stored procedure if the procedure is called
within a data manipulation statement. For example, in the following INSERT
statement, a DROP TRIGGER statement is illegal inside the stored procedure
proc1:
INSERT INTO orders EXECUTE PROCEDURE proc1(vala, valb)
You cannot use a ROLLBACK WORK statement to undo a DROP TRIGGER
statement. If you roll back a transaction that contains a DROP TRIGGER
statement, the trigger is not re-created, and you do not receive an error
message.
DROP TRIGGER
Trigger
Name
p. 1-196
DB
ESQL
+
SE
1-278 Informi x Gui de to SQL: Syntax
DROP TRIGGER
References
See the CREATE PROCEDURE statement in this manual for more information
about a stored procedure that is called within a data manipulation statement.
For more information about triggers, see the CREATE TRIGGER statement in
this manual.
SQL Statements 1-279
DROP VIEW
DROP VIEW
Use the DROP VIEW statement to remove a view from the database.
Syntax
Usage
You must own the view or have the DBA privilege to use the DROP VIEW
statement.
When you drop view name, you also drop all views that have been dened in
terms of that view. You can also specify this default condition with the
CASCADE keyword.
When you use the RESTRICT keyword in the DROP VIEW statement, the drop
operation fails if any existing views are dened on view name, which would
be abandoned in the drop operation.
You can query the sysdepend system catalog table to determine which views,
if any, depend on another view.
The following statement drops the view that is named cust1:
DROP VIEW cust1
You cannot use a ROLLBACK WORK statement to undo a DROP VIEW
statement. If you roll back a transaction that contains a DROP VIEW
statement, the view is not re-created, and you do not receive an error
message.
Synonym
Name
p. 1-766
DROP VIEW
View
Name
p. 1-772
CASCADE
RESTRICT
+
SE
1-280 Informi x Gui de to SQL: Syntax
DROP VIEW
References
See the CREATE VIEWand DROP TABLE statements in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of views in
Chapter 10.
SQL Statements 1-281
EXECUTE
EXECUTE
Use the EXECUTE statement to run a previously prepared statement or set of
statements.
Syntax
Usage
The EXECUTE statement passes a prepared SQL statement to the database
server for execution. If the statement contained question mark (?)
placeholders, specic values are supplied for them before execution. Once
prepared, an SQL statement can be executed as often as needed.
Element Purpose Restrictions Syntax
statement id Identies an SQL statement You must have dened the
statement identier in a
previous PREPARE statement.
After you release the database
server resources (using a FREE
statement), you cannot use the
statement identier with a
DECLARE cursor or with the
EXECUTE statement until you
prepare the statement again.
PREPARE, p. 1-402
statement id
variable
Host variable that identies an
SQL statement
You must have dened the host
variable in a previous PREPARE
statement. The host variable
must be a character data type.
PREPARE, p. 1-402
EXECUTE statement id
statement
id variable INTO
Clause
p. 1-283
USING
Clause
p. 1-286
ESQL
1-282 Informi x Gui de to SQL: Syntax
EXECUTE
You can execute any prepared statement. However, for stored procedures
that return more than one row, you cannot execute a prepared SELECT
statement or a prepared EXECUTE PROCEDURE statement. When you use a
prepared SELECT statement to return multiple rows of data, you can use the
DECLARE, OPEN, and FETCH cursor statements to retrieve the data rows. In
addition, you can use EXECUTE on a prepared SELECT INTO TEMP statement
to achieve the same result. If you prepare an EXECUTE PROCEDURE
statement for a procedure that returns multiple rows, you need to use the
DECLARE, OPEN, and FETCH cursor statements just as you would with a
SELECT statement.
If you create or drop a trigger after you prepared a triggering INSERT,
DELETE, or UPDATE statement, the prepared statement returns an error when
you execute it.
The following example shows an EXECUTE statement within an
INFORMIX-ESQL/C program:
EXEC SQL prepare del_1 from
'delete from customer
where customer_num = 119';
EXEC SQL execute del_1;
Scope of Statement Identiers
A program can consist of one or more source-code les. By default, the scope
of a statement identier is global to the program, so a statement identier
created in one le can be referenced from another le.
In a multiple-le program, if you want to limit the scope of a statement
identier to the le in which it is executed, you can preprocess all the les
with the -local command-line option. See your SQL API product manual for
more information, restrictions, and performance issues when you preprocess
les with the -local option.
SQL Statements 1-283
EXECUTE
The sqlca Record and EXECUTE
Following an EXECUTE statement, the sqlca (see your SQL API product
manual) can reect two results:
I The sqlca can reect an error within the EXECUTE statement. For
example, when an UPDATE ... WHERE ... statement within a prepared
object processes zero rows, the database server sets sqlca
to 100.
I The sqlca can also reect the success or failure of the executed
statement.
INTO Clause
DESCRIPTOR
output sqlda pointer
output descriptor variable
,
E/C
SQL DESCRIPTOR
output
variable
name
'output descriptor'
: output
indicator
variable
+
output
indicator
variable
INDICATOR
E/C
INTO
INTO
Clause
1-284 Informi x Gui de to SQL: Syntax
EXECUTE
The INTO clause allows you to execute a prepared singleton SELECT
statement or a prepared EXECUTE PROCEDURE statement, and store the
returned values into output variables, output SQL descriptors, or output
sqlda pointers. The INTO clause provides a concise and efcient alternative
to more complicated and lengthy syntax. In addition, by placing values into
variables that can be displayed, the INTO clause simplies and enhances your
ability to retrieve and display data values. For example, if you use the INTO
clause, you do not have to use the PREPARE, DECLARE, OPEN, and FETCH
sequence of statements to retrieve values from a table.
Important: If you execute a prepared SELECT statement that returns more than one
row of data, you receive an error message. In addition, if you prepare and declare a
statement, and then attempt to execute that statement, you receive an error message.
You cannot select a null value from a table column and place that value into an
output variable. If you know in advance that a table column contains a null value,
make sure after you select the data that you check the indicator variable that is
associated with the column to determine if the value is null.
Element Purpose Restrictions Syntax
output
descriptor
Quoted string that identies a
system-descriptor area
System-descriptor area must
already be allocated.
Quoted String,
p. 1-757
output
descriptor
variable
Host variable name that
identies the system-descriptor
area
System-descriptor area must
already be allocated.
Quoted String,
p. 1-757
output
indicator
variable
Host variable that receives a
return code if null data is placed
in the corresponding output
variable
Variable cannot be DATETIME or
INTERVAL data type.
Variable name must
conform to
language-specic
rules for variable
names.
output
sqlda
pointer
Points to an sqlda structure that
denes the data type and
memory location of values that
correspond to the question-mark
( ?) placeholder in a prepared
statement.
You cannot begin an output
sqlda pointer with a dollar sign
($) or a colon (:). You must use an
sqlda structure if you are using
dynamic SQL statements.
DESCRIBE, p. 1-255
output
variable
name
Host variable whose contents
replace a question-mark ( ?)
placeholder in a prepared
statement
Variable must be a character
data type.
Variable name must
conform to
language-specic
rules for variable
names.
SQL Statements 1-285
EXECUTE
The following list describes the procedure for using the INTO clause with the
EXECUTE statement:
1. Declare the output variables that the EXECUTE statement uses.
2. Use the PREPARE statement to prepare your SELECT statement or to
prepare your EXECUTE PROCEDURE statement.
3. Use the EXECUTE statement, with the INTO clause, to execute your
SELECT statement or to execute your EXECUTE PROCEDURE
statement.
The following example shows how to use the INTO clause with an EXECUTE
statement in INFORMIX-ESQL/C:
EXEC SQL prepare sel1 from 'select fname, lname from customer
where customer_num =123';
EXEC SQL execute sel1 into :fname, :lname using :cust_num;
The following example shows how to use the INTO clause to return multiple
rows of data:
EXEC SQL BEGIN DECLARE SECTION;
int customer_num =100;
char fname[25];
EXEC SQL END DECLARE SECTION;
EXEC SQL prepare sel1 from 'select fname from customer
where customer_num=?';
for ( ;customer_num < 200; customer_num++)
{
EXEC SQL execute sel1 into :fname using customer_num;
printf("Customer number is %d\n", customer_num);
printf("Customer first name is %s\n\n", fname);
}
1-286 Informi x Gui de to SQL: Syntax
EXECUTE
USING Clause
Element Purpose Restrictions Syntax
storage
descriptor
Quoted string that identies a
system-descriptor area
System-descriptor area must
already be allocated. Make sure
surrounding quotes are single.
Quoted String,
p. 1-757
storage
descriptor
variable
Host variable name that
identies a system-descriptor
area
System-descriptor area must
already be allocated.
Variable name must
conform to
language-specic
rules for variable
names.
(1 of 2)
DESCRIPTOR storage sqlda pointer
storage descriptor variable
,
E/C
SQL DESCRIPTOR
storage
variable
name
'storage descriptor'
+
INDICATOR
E/C
USING
USING
Clause
storage
indicator
variable
storage
indicator
variable
:
SQL Statements 1-287
EXECUTE
The USING clause species values that are to replace question-mark (?)
placeholders in the prepared statement. Providing values in the EXECUTE
statement that replace the question-mark placeholders in the prepared
statement is sometimes called parameterizing the prepared statement.
You can specify any of the following items to replace the question-mark
placeholders in a statement before you execute it:
I A host variable name (if the number and data type of the question
marks are known at compile time)
I A system descriptor that identies a system
I A descriptor that is a pointer to an sqlda structure
Supplying Parameters Through Host or Program Variables
You must supply one storage variable name for each placeholder. The data
type of each variable must be compatible with the corresponding value that
the prepared statement requires.
storage
indicator
variable
Host variable that receives a
return code if null data is placed
in the corresponding data
variable. Receives truncation
information if truncation occurs.
Variable cannot be DATETIME or
INTERVAL data type.
Variable name must
conform to
language-specic
rules for variable
names.
storage
sqlda
pointer
Points to an sqlda structure that
denes the data type and
memory location of values that
correspond to the question-mark
( ?) placeholder in a prepared
statement.
You cannot begin storage sqlda
pointer with a dollar sign ($) or a
colon (:). You must use an sqlda
structure if you are using
dynamic SQL statements.
DESCRIBE, p. 1-255
storage
variable
name
Host variable whose contents
replace a question-mark ( ?)
placeholder in a prepared
statement
Variable must be a character
data type.
Variable name must
conform to
language-specic
rules for variable
names.
Element Purpose Restrictions Syntax
(2 of 2)
E/C
1-288 Informi x Gui de to SQL: Syntax
EXECUTE
The following example executes the prepared UPDATE statement in
INFORMIX-ESQL/C:
stcopy ("update orders set order_date = ? where po_num = ?", stm1);
EXEC SQL prepare statement_1 from :stm1;
EXEC SQL execute statement_1 using :order_date :po_num;
Supplying Parameters Through a System Descriptor
You can create a system-descriptor area that describes the data type and
memory location of one or more values and then specify the storage
descriptor in the USING SQL DESCRIPTOR clause of the EXECUTE statement.
Each time that the EXECUTE statement is run, the values that the system-
descriptor area describes are used to replace question-mark (?) placeholders
in the PREPARE statement.
The COUNT eld corresponds to the number of dynamic parameters in the
prepared statement. The value of COUNT must be less than or equal to the
value of the occurrences that were specied when the system-descriptor area
was allocated with the ALLOCATE DESCRIPTOR statement.
For more information on system descriptors, see your SQL API product
manual.
The following examples show how to use system descriptors to execute
prepared statements in INFORMIX-ESQL/C and INFORMIX-ESQL/COBOL,
respectively:
INFORMIX-ESQL/C
EXEC SQL execute prep_stmt using sql descriptor 'desc1';
INFORMIX-ESQL/COBOL
EXEC SQL EXECUTE PREP_STMT USING SQL DESCRIPTOR 'DESC1'
END-EXEC.
SQL Statements 1-289
EXECUTE
Supplying INFORMIX-ESQL/C Parameters Through an sqlda Structure
You can specify the storage sqlda pointer in the USINGDESCRIPTOR clause of
the EXECUTE statement. Each time the EXECUTE statement is run, the values
that the sqlda structure describes are used to replace question-mark (?) place-
holders in the PREPARE statement.
For more information on the sqlda structure, see the manual for the version
of INFORMIX-ESQL/C that you are using.
The following example shows how to use an sqlda structure to execute a
prepared statement in INFORMIX-ESQL/C:
EXEC SQL execute prep_stmt using descriptor pointer2
Error Conditions with EXECUTE
In a database that is not ANSI compliant, if any statement fails to access any
rows, the database server returns (0).
In an ANSI-compliant database, if you prepare and execute any of the
following statements, and no rows are returned, the database server returns
SQLNOTFOUND (100):
I INSERT INTO table-name SELECT ... WHERE ...
I SELECT INTO TEMP ... WHERE ...
I DELETE ... WHERE
I UPDATE ... WHERE ...
In a multistatement prepare, if any statement in the preceding list fails to
access rows, in either ANSI databases or databases that are not ANSI
compliant, the database server returns SQLNOTFOUND (100).
References
See the ALLOCATE DESCRIPTOR, DEALLOCATE DESCRIPTOR, DECLARE,
EXECUTE IMMEDIATE, GET DESCRIPTOR, PREPARE, PUT, and SET
DESCRIPTOR statements in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of the EXECUTE
statement in Chapter 5.
ANSI
1-290 Informi x Gui de to SQL: Syntax
EXECUTE IMMEDIATE
EXECUTE IMMEDIATE
Use the EXECUTE IMMEDIATE statement to perform the functions of the
PREPARE, EXECUTE, and FREE statements.
Syntax
Usage
The quoted string is a character string that includes one or more SQL
statements. The string, or the contents of statement variable name, is parsed
and executed if correct; then all data structures and memory resources are
released immediately. In the usual method of dynamic execution, these
functions are distributed among the PREPARE, EXECUTE, and FREE
statements.
The EXECUTE IMMEDIATE statement makes it easy to execute dynamically a
single simple SQLstatement, which is constructed during program execution.
For example, you could obtain the name of a database from program input,
construct the DATABASE statement as a program variable, and then use
EXECUTE IMMEDIATE to execute the statement, which opens the database.
Element Purpose Restrictions Syntax
statement
variable name
Host variable whose value is a
character string that consists of
one or more SQL statements.
The host variable must have
been dened within the
program. The variable must be
character data type. For
additional restrictions, see
EXECUTE IMMEDIATE and
Restricted Statements on
page 1-291 and Restrictions on
Allowed Statements on
page 1-291.
Variable name must
conform to
language-specic
rules for variable
names.
statement variable name
EXECUTE IMMEDIATE
Quoted
String
p. 1-757
+
ESQL
SQL Statements 1-291
EXECUTE IMMEDIATE
EXECUTE IMMEDIATE and Restricted Statements
You cannot use the EXECUTE IMMEDIATE statement to execute the following
SQL statements.
Use a PREPARE statement to execute a dynamically constructed SELECT
statement.
Restrictions on Allowed Statements
The following restrictions apply to the statement that is contained in the
quoted string or in statement variable name:
I The statement cannot contain a host-language comment.
I Names of host-language variables are not recognized as such in
prepared text. The only identiers that you can use are names
dened in the database, such as table names and columns.
I The statement cannot reference a host variable list or a descriptor; it
must not contain any question-mark (?) placeholders, which are
allowed with a PREPARE statement.
I The text must not include any embedded SQL statement prex or
terminator, such as the dollar sign ($), colon (:), or the words EXEC
SQL.
CLOSE GET DESCRIPTOR
CONNECT OPEN
DECLARE PREPARE
DISCONNECT SELECT
EXECUTE SET CONNECTION
EXECUTE PROCEDURE (if the
procedure returns values)
SET DESCRIPTOR
FETCH WHENEVER
GET DIAGNOSTICS
1-292 Informi x Gui de to SQL: Syntax
EXECUTE IMMEDIATE
Example of the EXECUTE IMMEDIATE Statement
The following example shows the EXECUTE IMMEDIATE statement in
INFORMIX-ESQL/C:
sprintf(cdb_text, "create database %s", usr_db_id);
EXEC SQL execute immediate :cdb_text;
References
See the EXECUTE, FREE, and PREPARE statements in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of quick execution in
Chapter 5.
SQL Statements 1-293
EXECUTE PROCEDURE
EXECUTE PROCEDURE
Use the EXECUTE PROCEDURE statement to execute a procedure from the
DB-Access interactive editor, an SQL API, or another stored procedure.
Syntax
,
Procedure
Name
p. 1-754
( )
+
EXECUTE
PROCEDURE
,
Argument
INTO
ESQL
SPL
Argument
parameter name =
host
variable
Expression
p. 1-671
SELECT
Statement
(Singleton)
p. 1-459
1-294 Informi x Gui de to SQL: Syntax
EXECUTE PROCEDURE
Usage
The EXECUTE PROCEDURE statement invokes a procedure called Procedure
Name.
If an EXECUTE PROCEDURE statement has more arguments than the called
procedure expects, an error is returned.
If an EXECUTE PROCEDURE statement has fewer arguments than the called
procedure expects, the arguments are said to be missing. Missing arguments
are initialized to their corresponding default values if default values were
specied. (See the CREATE PROCEDURE statement on page 1-134.) This
initialization occurs before the rst executable statement in the body of the
procedure.
Element Purpose Restrictions Syntax
host variable A host variable that receives a
returned value from a
procedure, or a list of such
variables
If you issue an EXECUTE
PROCEDURE statement within
an SQL API, the receiving
variables must be host variables.
If you issue an EXECUTE
PROCEDURE statement within a
stored procedure, the receiving
variables must be procedure
variables. If you issue an
EXECUTE PROCEDURE statement
within a CREATE TRIGGER
statement, the receiving
variables must be column names
within the triggering table or
another table.
The name of a host
variable must
conform to
language-specic
rules for variable
names. For the
syntax of procedure
variables, see
Expression, p. 1-671.
For the syntax of
column names, see
Identier, p. 1-723.
parameter name The name of a parameter for
which you supply an argument
to the procedure
The parameter name must
match the parameter name that
you specied in a corresponding
CREATE PROCEDURE statement.
If you use the parameter name =
syntax for any argument in the
EXECUTE PROCEDURE
statement, you must use it for all
arguments.
Expression, p. 1-671
SQL Statements 1-295
EXECUTE PROCEDURE
If arguments are missing and do not have default values, they are initialized
to the value of UNDEFINED. An attempt to use any variable that has the value
of UNDEFINED results in an error.
Name or position, but not both, binds procedure arguments to procedure
parameters. That is, you can use parameter name = syntax for none or all of the
arguments that are specied in one EXECUTE PROCEDURE statement.
For instance, in the following example, both the procedure calls are valid for
a procedure that expects three character arguments, t, d, and n:
EXECUTE PROCEDURE add_col (t ='customer', d ='integer', n ='newint')
EXECUTE PROCEDURE add_col ('customer','newint','integer')
If the EXECUTE PROCEDURE statement returns more than one row, it must be
enclosed within an SPL FOREACH loop or accessed through a cursor.
INTO Clause
The INTO clause species where the values that the procedure returns will be
stored.
The host variable list is a list of the host variables that receive the returned
values from a procedure call. A procedure that returns more than one row
must be enclosed in a cursor.
If you execute a procedure from within a stored procedure, the list contains
procedure variables.
If you execute a procedure from within a triggered action, the list contains
column names from the triggering table or another table. For information on
triggered actions, see the CREATE TRIGGER statement on page 1-192.
You cannot prepare an EXECUTE PROCEDURE statement that has an INTO
clause. See Executing Stored Procedures Within a PREPARE Statement on
page 1-406 for more information.
References
See the CREATE PROCEDURE, DROP PROCEDURE, GRANT, and CALL
statements in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of creating and using
stored procedures in Chapter 12.
ESQL
ESQL
SPL
1-296 Informi x Gui de to SQL: Syntax
FETCH
FETCH
Use the FETCH statement to move a cursor to a new row in the active set and
to retrieve the row values from memory.
Syntax
+
+
NEXT
cursor
variable
USING
'descriptor'
SQL
DESCRIPTOR
descriptor
variable
DESCRIPTOR
sqlda
pointer
E/C
,
+
INDICATOR
+
PRIOR
row
position
RELATIVE
ABSOLUTE
row
position
-
PREVIOUS
FIRST
LAST
CURRENT
data structure
indicator
variable
indicator
variable
FETCH ESQL
cursor id INTO
data
variable
SQL Statements 1-297
FETCH
Element Purpose Restrictions Syntax
cursor id Identier for a cursor from
which rows are to be retrieved
The cursor must have been
created in an earlier DECLARE
statement and opened in an
earlier OPEN statement.
Identier, p. 1-723
cursor variable Host variable name that holds
the value of cursor id
The cursor identied in cursor
variable must have been created
in an earlier DECLARE statement
and opened in an earlier OPEN
statement.
Variable name must
conform to
language-specic
rules for variable
names.
data structure Structure that has been declared
as a host variable
The individual members of the
data structure must be matched
appropriately to the type of
values that are being fetched. If
you use a program array, you
must list both the array name
and a specic element of the
array in data structure.
Data-structure name
must conform to
language-specic
rules for data-
structure names.
data variable Host variable that receives one
value from the fetched row
The host variable must have a
data type that is appropriate for
the value that is fetched into it.
Variable name must
conform to
language-specic
rules for variable
names.
descriptor String that identies the system-
descriptor area into which you
fetch the contents of a row
The system-descriptor area must
have been allocated with the
ALLOCATE DESCRIPTOR
statement.
Quoted String,
p. 1-757
descriptor
variable
Host variable name that holds
the value of descriptor
The system-descriptor area that
is identied in descriptor variable
must have been allocated with
the ALLOCATE DESCRIPTOR
statement.
Variable name must
conform to
language-specic
rules for variable
names.
(1 of 2)
1-298 Informi x Gui de to SQL: Syntax
FETCH
Usage
The FETCH statement is one of four statements that are used for queries that
return more than one row from the database. The four statements, DECLARE,
OPEN, FETCH, and CLOSE, are used in the following sequence:
1. Declare a cursor to control the active set of rows.
2. Open the cursor to begin execution of the query.
3. Fetch from the cursor to retrieve the contents of each row.
indicator
variable
Host variable that receives a
return code if null data is placed
in the corresponding data
variable
This parameter is optional, but
use an indicator variable if the
possibility exists that the value
of data variable is null. If you
specify the indicator variable
without the INDICATOR
keyword, you cannot put a space
between data variable and
indicator variable. The rules for
placing a prex before indicator
variable are language-specic.
See your SQL API manual for
further information on indicator
variables.
Variable name must
conform to
language-specic
rules for variable
names.
row position Integer value or host variable
that contains an integer value.
The integer value gives the
position of the desired row in the
active set of rows. See FETCH
with a Scroll Cursor on
page 1-300 for a discussion of the
RELATIVE and ABSOLUTE
keywords and the meaning of
row position with each keyword.
A value of 0 for row position is
allowed with the RELATIVE
keyword. A value of 0 fetches
the current row. The value of row
position must be 1 or higher with
the ABSOLUTE keyword.
If you are using a
host variable,
variable name must
conform to
language-specic
rules for variable
names. If you are
using a literal
number, see Literal
Number, p. 1-752.
sqlda pointer Pointer to ansqlda structure that
receives the values from the
fetched row
You cannot begin an sqlda
pointer with a dollar sign ($) or a
colon (:).
See the discussion of
sqlda structure in the
INFORMIX-ESQL/
C Programmers
Manual.
Element Purpose Restrictions Syntax
(2 of 2)
SQL Statements 1-299
FETCH
4. Close the cursor to break the association between the cursor and the
active set.
A cursor is created as either a sequential cursor or a scroll cursor. The way the
database server creates and stores members of the active set and then fetches
rows from the active set differs depending on whether the cursor is a
sequential cursor or a scroll cursor. (See the DECLARE statement on
page 1-234 for details on the types of cursors.)
In X/Open mode, if a cursor-direction value (such as NEXT or RELATIVE) is
specied, a warning message is issued, indicating that the statement does not
conform to X/Open standards.
FETCH with a Sequential Cursor
A sequential cursor can fetch only the next row in sequence from the active
set. The sole keyword option that is available to a sequential cursor is the
default value, NEXT. A sequential cursor can read through a table only once
each time it is opened. The following example in INFORMIX-ESQL/C
illustrates the use of a sequential cursor:
EXEC SQL fetch seq_curs into :fname, :lname;
When the program opens a sequential cursor, the database server processes
the query to the point of locating or constructing the rst row of data. The
goal of the database server is to tie up as few resources as possible.
Because the sequential cursor can retrieve only the next row, the database
server can frequently create the active set one row at a time. On each FETCH
operation, the database server returns the contents of the current row and
locates the next row. This one-row-at-a-time strategy is not possible if the
database server must create the entire active set to determine which row is
the rst row (as would be the case if the SELECT statement included an
ORDER BY clause).
X/O
1-300 Informi x Gui de to SQL: Syntax
FETCH
FETCH with a Scroll Cursor
A scroll cursor can fetch any row in the active set, either by specifying an
absolute row position or a relative offset. Use the following keywords to
specify a particular row that you want to retrieve.
The following INFORMIX-ESQL/C examples illustrate the FETCH statement:
EXEC SQL fetch previous q_curs into :orders;
EXEC SQL fetch last q_curs into :orders;
EXEC SQL fetch relative -10 q_curs into :orders;
printf("Which row? ");
scanf("%d",row_num);
EXEC SQL fetch absolute :row_num q_curs into :orders;
Keyword Effect
NEXT retrieves the next row in the active set.
PREVIOUS retrieves the previous row in the active set.
PRIOR is synonymous with PREVIOUS; it retrieves the previous row
in the active set.
FIRST retrieves the rst row in the active set.
LAST retrieves the last row in the active set.
CURRENT retrieves the current row in the active set (the same row as
returned by the preceding FETCH statement from the scroll
cursor).
RELATIVE retrieves the nth row, relative to the current cursor position in
the active set, where row position supplies n. A negative value
indicates the nth row prior to the current cursor position. If
row position is 0, the current row is fetched.
ABSOLUTE retrieves the nth row in the active set, where row position
supplies n. Absolute row positions are numbered from1.
SQL Statements 1-301
FETCH
Row Numbers
The row numbers that are used with the ABSOLUTE keyword are valid only
while the cursor is open. Do not confuse them with rowid values. A rowid
value is based on the position of a row in its table and remains valid until the
table is rebuilt. A row number for a FETCH statement is based on the position
of the row in the active set of the cursor; the next time the cursor is opened,
different rows might be selected.
How the Database Server Stores Rows
The database server must retain all the rows in the active set for a scroll
cursor until the cursor closes, because it cannot be sure which row the
program asks for next. When a scroll cursor opens, the database server imple-
ments the active set as a temporary table although it might not ll this table
immediately.
The rst time a row is fetched, the database server copies it into the
temporary table as well as returning it to the program. When a row is fetched
for the second time, it can be taken from the temporary table. This scheme
uses the fewest resources in case the program abandons the query before it
fetches all the rows. Rows that are never fetched are usually not created or are
saved in a temporary table.
Specifying Where Values Go in Memory
Each value from the select list of the query or the output of the executed
procedure must be returned into a memory location. You can specify these
destinations in one of the following ways:
I Use the INTO clause of a SELECT statement.
I Use the INTO clause of a EXECUTE PROCEDURE statement.
I Use the INTO clause of a FETCH statement.
I Use a system-descriptor area.
I Use an sqlda structure.
E/C
1-302 Informi x Gui de to SQL: Syntax
FETCH
Using the INTO Clause of SELECT
The SELECT statement that is associated with the cursor can contain an INTO
clause, which species the program variables that are to receive the values.
You can use this method only when the SELECT statement is written as part
of the declaration of the cursor (see the DECLARE statement on page 1-234).
In this case, the FETCH statement cannot contain an INTO clause. The
following example uses the INTO clause of the SELECT statement to specify
program variables in INFORMIX-ESQL/C:
EXEC SQL declare ord_date cursor for
select order_num, order_date, po_num
into :o_num, :o_date, :o_po;
EXEC SQL open ord_date;
EXEC SQL fetch next ord_date;
Use an indicator variable if the data that is returned from the SELECT
statement might be null. See your SQL API manual for more information
about indicator variables.
Using the INTO Clause of EXECUTE PROCEDURE
The EXECUTE PROCEDURE statement that is associated with the cursor can
contain an INTO clause, which species the program variables that are to
receive the values. You can use this method only when the EXECUTE
PROCEDURE statement is written as part of the cursor declaration (see the
DECLARE statement on page 1-234). In this case, the FETCH statement cannot
contain an INTO clause. The following example uses the INTO clause of the
EXECUTE PROCEDURE statement to specify program variables in
INFORMIX-ESQL/C:
EXEC SQL declare ord_date cursor for
execute procedure xx (20)
into :o_num, :o_date, :o_po;
EXEC SQL open ord_date;
EXEC SQL fetch next ord_date;
Use an indicator variable if the data that is returned from the EXECUTE
PROCEDURE statement might be null. See your SQL API manual for more
information about indicator variables.
SQL Statements 1-303
FETCH
Using the INTO Clause of FETCH
When the SELECT statement omits the INTO clause, you must specify the
destination of the data whenever a row is fetched. The FETCH statement can
include an INTO clause to retrieve data into a set of variables. This method
lets you store different rows in different memory locations.
In the following INFORMIX-ESQL/C example, a series of complete rows is
fetched into a program array. The INTO clause of each FETCH statement
species an array element as well as the array name.
EXEC SQL BEGIN DECLARE SECTION;
char wanted_state[2];
short int row_count = 0;
struct customer_t{
{
int c_no;
char fname[15];
char lname[15];
} cust_rec[100];
EXEC SQL END DECLARE SECTION;
main()
{
EXEC SQL connect to'stores7';
printf("Enter 2-letter state code: ");
scanf ("%s", wanted_state);
EXEC SQL declare cust cursor for
select * from customer where state = :wanted_state;
EXEC SQL open cust;
EXEC SQL fetch cust into :cust_rec[row_count];
while (SQLCODE == 0)
{
printf("\n%s %s", cust_rec[row_count].fname,
cust_rec[row_count].lname);
row_count++;
EXEC SQL fetch cust into :cust_rec[row_count];
}
printf ("\n");
EXEC SQL close cust;
EXEC SQL free cust;
}
You can fetch into a program-array element only by using an INTO clause in
the FETCH statement. When you are declaring a cursor, do not refer to an
array element within the SQL statement.
1-304 Informi x Gui de to SQL: Syntax
FETCH
Using a System-Descriptor Area
You can use a system-descriptor area as an output variable. The keywords
USING SQL DESCRIPTOR introduce the name of the system-descriptor area
into which you fetch the contents of a row. You can then use the GET
DESCRIPTOR statement to transfer the values that the FETCH statement
returns from the system-descriptor area into host variables.
For more information, see the manual for your SQL API. The following
examples show sample FETCH USING SQL DESCRIPTOR statements in
INFORMIX-ESQL/C and INFORMIX-ESQL/COBOL, respectively:
INFORMIX-ESQL/C
EXEC SQL fetch selcurs using sql descriptor 'desc';
INFORMIX-ESQL/COBOL
EXEC SQL FETCH SEL_CURS USING SQL DESCRIPTOR 'DESC' END-EXEC.
Using an sqlda Structure
You can use a pointer to an sqlda structure to supply destinations. This
structure contains data descriptors that specify the data type and memory
location for one selected value. For more information, see the
INFORMIX-ESQL/C Programmers Manual. The keywords USING
DESCRIPTOR introduce the name of the sqlda pointer structure.
When you create a SELECT statement dynamically, you cannot use an INTO
host-variable clause because you cannot name host variables in a prepared
statement. If you are certain of the number and data type of values in the
select list, you can use an INTO host-variable clause in the FETCH statement.
However, if user input generated the query, you might not be certain of the
number and data type of values that are being selected. In this case, you must
use an sqlda pointer structure, as the following list describes:
I Use the DESCRIBE statement to ll in the sqlda structure.
I Allocate memory to hold the data values.
I Name the sqlda structure in the FETCH statement.
E/C
SQL Statements 1-305
FETCH
The following example shows a sample FETCH USING DESCRIPTOR
statement in INFORMIX-ESQL/C:
EXEC SQL fetch selcurs using descriptor pointer2;
E/C
1-422 Informi x Gui de to SQL: Syntax
PUT
Writing Buffered Rows
When the OPEN statement opens an insert cursor, an insert buffer is created.
The PUT statement puts a row into this insert buffer. The block of buffered
rows is inserted into the database table as a block only when necessary; this
process is called ushing the buffer. The buffer is ushed after any of the
following events:
I The buffer is too full to hold the new row at the start of a PUT
statement.
I A FLUSH statement executes.
I A CLOSE statement closes the cursor.
I An OPEN statement executes, naming the cursor.
When the OPEN statement is applied to an open cursor, it closes the
cursor before reopening it; this implied CLOSE statement ushes the
buffer.
I A COMMIT WORK statement executes.
I The buffer contains blob data (ushed after a single PUT statement).
If the program terminates without closing an insert cursor, the buffer remains
unushed. Rows that were inserted into the buffer since the last ush are lost.
Do not rely on the end of the program to close the cursor and ush the buffer.
Error Checking
The sqlca contains information on the success of each PUT statement as well
as information that lets you count the rows that were inserted. The result of
each PUT statement is contained in the elds of the sqlca, as the following
table shows.
ESQL/C ESQL/COBOL
sqlca.sqlcode, SQLCODE SQLCODE OF SQLCA
sqlca.sqlerrd[2] SQLERRD[3] OF SQLCA
SQL Statements 1-423
PUT
Data buffering with an insert cursor means that errors are not discovered
until the buffer is ushed. For example, an input value that is incompatible
with the data type of the column for which it is intended is discovered only
when the buffer is ushed. When an error is discovered, rows in the buffer
that are located after the error are not inserted; they are lost from memory.
The SQLCODE eld is set to 0 if no error occurs; otherwise, it is set to an error
code. The third element of the sqlerrd array is set to the number of rows that
are successfully inserted into the database:
I If a row is put into the insert buffer, and buffered rows are not written
to the database, SQLCODE andsqlerrd are set to 0 (SQLCODE because
no error occurred, and sqlerrd because no rows were inserted).
I If a block of buffered rows is written to the database during the
execution of a PUT statement, SQLCODE is set to 0 and sqlerrd is set
to the number of rows that was successfully inserted into the
database.
I If an error occurs while the buffered rows are written to the database,
SQLCODE indicates the error, and sqlerrd contains the number of
successfully inserted rows. (The uninserted rows are discarded from
the buffer.)
Tip: When you encounter an SQLCODE error, a corresponding SQLSTATE error
value might exist. Check the GET DIAGNOSTICS statement for information about
how to get the SQLSTATE value and how to use the GET DIAGNOSTICS statement to
interpret the SQLSTATE value.
Counting Total and Pending Rows
To count the number of rows that were actually inserted in the database and
the number not yet inserted, perform the following procedure:
I Prepare two integer variables (for example, total and pending).
I When the cursor is opened, set both variables to 0.
I Each time a PUT statement executes, increment both total and
pending.
I Whenever a PUT or FLUSH statement executes, or the cursor closes,
subtract the third eld of the SQLERRD array from pending.
1-424 Informi x Gui de to SQL: Syntax
PUT
At any time, (total - pending) represents the number of rows that were
actually inserted. If all commands are successful, pending contains zero after
the cursor is closed. If an error occurs during a PUT, FLUSH, or CLOSE
statement, the value that remains in pending is the number of uninserted
(discarded) rows.
References
See the CLOSE, FLUSH, DECLARE, and OPEN statements, which are cursor-
related, in this manual. Also see the ALLOCATE DESCRIPTOR statement.
In the Informix Guide to SQL: Tutorial, see the discussion of the PUT statement
in Chapter 6.
SQL Statements 1-425
RECOVER TABLE
RECOVER TABLE
Use the RECOVER TABLE statement with INFORMIX-SE to restore a database
table in the event of failure.
Syntax
Usage
The RECOVER TABLE statement applies the table audit trail to a backup copy
of the database. INFORMIX-SE uses audit trails to record operations on a per-
table basis. You can issue a RECOVER TABLE statement if you own the table
or have the DBA privilege for the database.
If a system failure occurs, use an operating-system utility to restore each table
le for which you have an audit trail. Issue the RECOVER TABLE statement to
update each newly restored table with the transactions that are recorded in
the audit trail.
Table
Name
p. 1-768
RECOVER TABLE
SE
+
1-426 Informi x Gui de to SQL: Syntax
RECOVER TABLE
Backup/Restore Procedure
The recommended backup/restore procedure for making backup copies of a
database that includes audit trails is described in the following list:
I Execute the DROP AUDIT statement for each table that has an audit
trail. The DROP AUDIT statement ends system logging to the audit-
trail les.
I Execute the CREATE AUDIT statement for each table, specifying the
pathname of the new audit trail. For maximum protection, specify a
location that is not on the same storage device as the database. You
can also select a lename that reects the table name and the
sequence of the le in the audit trail (for example, audit_cust_001 or
audit_cust_002). The CREATE AUDIT statement registers the new
name and location of the audit-trail le in the systables system
catalog table.
I Use an operating-system utility to back up the database les.
During execution, the RECOVER TABLE statement checks that the audit trail
and table name have consistent record numbers for rows where changes
occurred. In extremely rare instances, the RECOVER TABLE statement can nd
an inconsistency that a system crash caused. In this case only, the RECOVER
TABLE statement stops, and you must restore the table manually.
The following list of actions and statements serves as a guide to recover the
customer table. First, restore the customer table from your last archive copy.
Second, run the following statements, which assume that your audit trail
began immediately after you created the archive copy:
RECOVER TABLE customer
DROP AUDIT FOR customer
CREATE AUDIT FOR customer
Third, create a new backup of the recovered table.
SQL Statements 1-427
RECOVER TABLE
The audit-trail le is not in human-readable form. Even so, the DBA can copy
the le to a database (.dat) le and manipulate it. The modied le can be
copied back to the audit-trail le, enabling customized restorations of
particular tables. For example, you can modify the audit-trail le to exclude
rows that a particular user entered or to undo specic transactions. For
specic instructions on modifying audit-trail les, refer to the manual for
your application-development tool.
References
See the CREATE AUDIT and DROP AUDIT statements in this manual.
1-428 Informi x Gui de to SQL: Syntax
RENAME COLUMN
RENAME COLUMN
Use the RENAME COLUMN statement to change the name of a column.
Syntax
Usage
You can rename a column of a table if any of the following conditions are true:
I You own the table.
I You have the DBA privilege on the database.
I You have the Alter privilege on the table.
Element Purpose Restrictions Syntax
new column
name
The new name to be assigned to
the column
The new name of the column
must be unique within the table.
If you rename a column that
appears within a trigger
denition, the new column
name replaces the old column
name in the trigger denition
only if certain conditions are
met. See How Triggers Are
Affected on page 1-429 for
more information on this
restriction.
Identier, p. 1-723
.old column
name
The current name of the column
you want to rename
The column must exist within
the table. The column name
must be preceded by a period.
You can put a space between the
table name and .old column name,
or you can omit the space.
Identier, p. 1-723
.old column name TO
Table
Name
p. 1-768
RENAME COLUMN
+
new column name
SQL Statements 1-429
RENAME COLUMN
When you rename a column, choose a column name that is unique within the
table.
You cannot use a ROLLBACK WORK statement to undo a RENAME COLUMN
statement that successfully executes. If you roll back a transaction that
contains a RENAME COLUMN statement, the column retains its new name,
and you do not receive an error message.
How Views and Check Constraints Are Affected
If you rename a column that a view in the database references, the text of the
view in the sysviews system catalog table is updated to reect the new
column name.
If you rename a column that a check constraint in the database references, the
text of the check constraint in the syschecks system catalog table is updated
to reect the new column name.
How Triggers Are Affected
If you rename a column that appears within a trigger, it is replaced with the
new name only in the following instances:
I When it appears as part of a correlation name inside the FOR EACH
ROW action clause of a trigger
I When it appears as part of a correlation name in the INTO clause of
an EXECUTE PROCEDURE statement
I When it appears as a triggering column in the UPDATE clause
When the trigger executes, if the database server encounters a column name
that no longer exists in the table, it returns an error
SE
1-430 Informi x Gui de to SQL: Syntax
RENAME COLUMN
Example of RENAME COLUMN
The following example assigns the new name of c_num to the
customer_num column in the customer table:
RENAME COLUMN customer.customer_num TO c_num
References
See the ALTER TABLE, CREATE TABLE, and RENAME TABLE statements in this
manual.
SQL Statements 1-431
RENAME DATABASE
RENAME DATABASE
Use the RENAME DATABASE statement to change the name of a database.
Syntax
Usage
You can rename a database if either of the following statements is true:
I You created the database.
I You have the DBA privilege on the database.
You can only rename local databases. You can rename a local database from
inside a stored procedure.
References
See the CREATE DATABASE statement in this manual.
Element Purpose Restrictions Syntax
new database
name
The new name that you want to
assign to the database
Name must be unique. You can-
not rename the current database.
The database to be renamed
must not be opened by any users
when the RENAME DATABASE
command is issued.
Database Name,
p. 1-660
old database
name
The name of the database that
you want to rename
The database name must exist. Database Name,
p. 1-660
TO RENAME DATABASE new database name
OL
+
old database name
1-432 Informi x Gui de to SQL: Syntax
RENAME TABLE
RENAME TABLE
Use the RENAME TABLE statement to change the name of a table.
Syntax
Usage
You can rename a table if any of the following statements are true:
I You own the table.
I You have the DBA privilege on the database.
I You have the Alter privilege on the table.
You cannot change the table owner by renaming the table. You can use the
owner. convention in the old name of the table, but an error occurs during
compilation if you try to use the owner. convention in the new name of the
table.
In an ANSI-compliant database, you must use the owner. convention in the old
name of the table if you are referring to a table that you do not own.
You cannot use the RENAME TABLE statement to move a table from the
current database to another database or to move a table from another
database to the current database. The table that you want to rename must
reside in the current database. The renamed table that results from the
statement remains in the current database.
Element Purpose Restrictions Syntax
new table name The new name that you want to
assign to the table
You cannot use the owner.
convention in the new name of
the table.
Identier, p. 1-723
TO
Table
Name
p. 1-768
RENAME TABLE
+ new table
name
ANSI
SQL Statements 1-433
RENAME TABLE
You cannot use a ROLLBACK WORK statement to undo a RENAME TABLE
statement that successfully executes. If you roll back a transaction that
contains a RENAME TABLE statement, the table retains its new name, and you
do not receive an error message.
Renaming Tables That Views Reference
If a view references the table that was renamed, and the view resides in the
same database as the table, the database server updates the text of the view
in the sysviews system catalog table to reect the new table name. See the
Informix Guide to SQL: Reference for further information on the sysviews
system catalog table.
Renaming Tables That Have Triggers
If you rename a table that has a trigger, it produces the following results:
I The database server replaces the name of the table in the trigger def-
inition.
I The table name is not replaced where it appears inside any triggered
actions.
I The database server returns an error if the new table name is the
same as a correlation name in the REFERENCING clause of the trigger
denition.
When the trigger executes, the database server returns an error if it
encounters a table name for which no table exists.
Example of Renaming a Table
The following example reorganizes the items table. The intent is to move the
quantity column from the fth position to the third. The example illustrates
the following steps:
1. Create a new table, new_table, that contains the column quantity in
the third position.
2. Fill the table with data from the current items table.
3. Drop the old items table.
4. Rename new_table with the name items.
SE
1-434 Informi x Gui de to SQL: Syntax
RENAME TABLE
The following example uses the RENAME TABLE statement as the last step:
CREATE TABLE new_table
(
item_num SMALLINT,
order_num INTEGER,
quantity SMALLINT,
stock_num SMALLINT,
manu_code CHAR(3),
total_price MONEY(8)
)
INSERT INTO new_table
SELECT item_num, order_num, quantity, stock_num,
manu_code, total_price
FROM items
DROP TABLE items
RENAME TABLE new_table TO items
References
See the ALTER TABLE, CREATE TABLE, DROP TABLE, and RENAME COLUMN
statements in this manual.
SQL Statements 1-435
REPAIR TABLE
REPAIR TABLE
Use the REPAIR TABLE statement to remove and rebuild table indexes or data
that might have been damaged or corrupted because of a power failure,
computer crash, or other unexpected program stoppage. Only damaged
tables are rebuilt. To determine whether you need to use the REPAIR TABLE
statement, you can rst issue the CHECK TABLE statement.
Syntax
Usage
Specify the name of the table for which you want to restore the integrity of
the index les, as the following example shows:
REPAIR TABLE cust_calls
You must specify a table that is in a database in the current directory. If you
specify a simple name for a database in the DATABASE command, but the
database is not located in the current directory, REPAIR TABLE does not search
the DBPATH environment variable to nd the directory for the database; the
REPAIR TABLE statement will fail. Similarly, if you specify an explicit
pathname for a database in the DATABASE command, but the database is not
located in the current directory, REPAIR TABLE does not search for the
database in the specied directory; the REPAIR TABLE statement will fail.
You cannot use the REPAIR TABLE statement on a table unless you own it or
have the DBA privilege on the database. You cannot use the REPAIR TABLE
statement on the system catalog table systables unless you have the DBA
privilege on the database.
The REPAIR TABLE statement calls the secheck utility.
SE
+
Table
Name
p. 1-768
REPAIR TABLE DB
1-436 Informi x Gui de to SQL: Syntax
REPAIR TABLE
References
See the CHECK TABLE statement in this manual.
See the INFORMIX-SE Administrators Guide for a full description of secheck.
SQL Statements 1-437
REVOKE
REVOKE
You can use the REVOKE statement for the following purposes:
I You can revoke privileges on a table or view from a user or a role.
I You can revoke the privilege to execute a procedure from a user or a
role.
I You can revoke privileges on a database from a user.
I You can revoke a role from a user or from another role.
1-438 Informi x Gui de to SQL: Syntax
REVOKE
Syntax
Procedure
Name
p. 1-754
,
user
'user '
REVOKE FROM PUBLIC
EXECUTE ON
+
Database-
Level
Privileges
p. 1-445
,
user
'user '
ON FROM PUBLIC
Table-Level
Privileges
p. 1-442
CASCADE
RESTRICT
OL
role
name
'
role name
OL
role
name
'
OL
table name
view name
synonym
name
,
user
'user '
FROM PUBLIC
ON
Table-Level
Privileges
p. 1-442
table name
view name
synonym
name
SQL Statements 1-439
REVOKE
Usage
You can use the REVOKE statement with the GRANT statement to control
nely the ability of users to modify the database as well as to access and
modify data in the tables.
If you use the PUBLIC keyword after the FROM keyword, the REVOKE
statement revokes privileges from all users.
You can revoke all or some of the privileges that you granted to other users.
No one can revoke privileges that another user grants.
If you revoke the EXECUTE privilege on a stored procedure from a user, that
user can no longer run that procedure using either the EXECUTE PROCEDURE
or CALL statements.
If you use quotes, user appears exactly as typed.
In an ANSI-compliant database, if you do not use quotes around user, the
name of the user is stored in uppercase letters.
Users cannot revoke privileges from themselves.
Element Purpose Restriction Syntax
role name Names the role from which a
privilege or another role is to be
revoked or names the role to be
revoked from a user or another
role.
The role must have been created
with the CREATE ROLE statement
and granted with the GRANT
statement
Identier, p. 1-723
synonym name The synonym name for which a
privilege is revoked
The name must be an existing
synonym name.
Synonym Name,
p. 1-766
table name The table name for which a priv-
ilege is revoked
The name must be an existing
table name.
Table Name, p. 1-768
user Names the user from whom a
privilege or role is revoked
The user must be a valid user. Identier, p. 1-723
view name The view name for which a priv-
ilege is revoked
The name must be an existing
view name.
View Name, p. 1-772
ANSI
1-440 Informi x Gui de to SQL: Syntax
REVOKE
Using the REVOKE Statement with Roles
You can use the REVOKE statement to remove privileges from a role and
remove a role from a user or another role. Once a role is revoked from a user,
the user cannot enable that role. You can revoke all or some of the roles
granted to a user or role.
If a role is revoked from a user, the privileges associated with the role cannot
be acquired by the user with the SET ROLE statement. However, this does not
affect the currently acquired privileges.
You can use the REVOKE statement to revoke table-level privileges from a
role; however, you cannot use the RESTRICT or CASCADE clauses when you
do so.
Only the DBA or a user granted a role with the WITH GRANT OPTION can
revoke privileges for a role.
If you revoke the Execute privilege on a stored procedure from a role, that
role can no longer run that procedure.
Users cannot revoke roles from themselves. When you revoke a role, you
cannot revoke the WITH GRANT OPTION separately. If the role was granted
with the WITH GRANT OPTION, both the role and grant option are revoked.
The following example revokes the engineer role from the user maryf:
REVOKE engineer FROM maryf
Revoking Privileges Granted from WITH GRANT OPTION
If you revoke fromuser the privileges that you granted using the WITH
GRANT OPTIONkeywords, you sever the chain of privileges granted by that
user. In this case, when you revoke privileges fromuser, you automatically
revoke the privileges of all users who received privileges fromuser or from
the chain that user created. You can also specify this default condition with
the CASCADE keyword.
SQL Statements 1-441
REVOKE
Controlling the Scope of a REVOKE with the RESTRICT Option
Use the RESTRICT keyword to control the success or failure of the REVOKE
command based on the existence of dependencies on the objects that are
being revoked. The following list shows the dependencies that cause the
REVOKE statement to fail when you use the RESTRICT keyword:
I The user from whom the privilege is to be revoked has granted this
privilege to another user or users.
I A view depends on a Select privilege that is being revoked.
I A foreign-key constraint depends on a References privilege that is
being revoked.
Failure of the REVOKE When the Revokee Has Granted a Privilege
AREVOKE statement with the RESTRICT keyword fails if the user from whom
a privilege is being revoked has granted the same privilege to another user or
users. However, the same REVOKE statement does not fail if the revokee has
the right to grant the privilege to other users but has not actually granted the
privilege to any other user. We can illustrate these points by means of
examples.
Assume that the user clara has granted the Select privilege on the customer
table to the user ted, and she has also granted user ted the right to grant the
Select privilege to other users. User ted has used this authority to grant the
Select privilege on the customer table to the user named tania. Now user
clara attempts to revoke the Select privilege from user ted with the following
REVOKE statement:
REVOKE SELECT ON customer FROM ted RESTRICT
This statement fails because user ted has granted the Select privilege to user
tania.
1-442 Informi x Gui de to SQL: Syntax
REVOKE
What if the revokee has the right to grant the privilege to other users but has
not actually granted this privilege to any other user? For example, assume
that the user clara has granted the Select privilege on the customer table to
the user roger, and she has also granted user roger the right to grant the Select
privilege to other users. However, user roger has not used this authority to
granted the Select privilege to any other user. Now user clara attempts to
revoke the Select privilege from user roger with the following REVOKE
statement:
REVOKE SELECT ON customer FROM roger RESTRICT
This statement succeeds because user roger has not granted the Select
privilege to any other user.
REVOKE and ROLLBACK WORK
You cannot use a ROLLBACK WORK statement to undo a REVOKE statement
that successfully executes. If you roll back a transaction that contains a
REVOKE statement, the privilege is not granted again to the user, and you do
not receive an error message.
Table-Level Privileges
SE
ALL
PRIVILEGES
SELECT
UPDATE
INSERT
DELETE
INDEX
ALTER
,
REFERENCES
Table-Level
Privileges
SQL Statements 1-443
REVOKE
To revoke a table-level privilege from a user, you must revoke all occurrences
of the privilege. For example, if two users grant the same privilege to a user,
both of them must revoke the privilege. If one grantor revokes the privilege,
the user retains the privilege received from the other grantor. (The database
server keeps a record of each table-level grant in the syscolauth and
systabauth system catalog tables.)
If a table owner grants a privilege to PUBLIC, the owner cannot revoke the
same privilege from any particular user. For example, if the table owner
grants the Select privilege to PUBLIC and then attempts to revoke the Select
privilege from mary, the REVOKE statement generates an error. The Select
privilege was granted to PUBLIC, not to mary, and therefore the privilege
cannot be revoked from mary. (ISAM error number 111, No record found,
refers to the lack of a record in either the syscolauth or systabauth system
catalog table, which would represent the grant that the table owner now
wants to revoke.)
You can revoke table-level privileges individually or in combination. List the
keywords that correspond to the privileges that you are revoking fromuser.
The keywords are described in the following list. Unlike the GRANT state-
ment, the REVOKE statement does not allow you to qualify the Select,
Update, or References privilege with a column name. Thus you cannot
revoke access on specic columns.
Privilege Functions
INSERT Provides the ability to insert rows
DELETE Provides the ability to delete rows
SELECT Provides the ability to display data obtained from a SELECT
statement
UPDATE Provides the ability to change column values
INDEX Provides the ability to create permanent indexes. You must
have the Resource privilege to take advantage of the Index
privilege. (Any user with the Connect privilege can create
indexes on temporary tables.)
(1 of 2)
1-444 Informi x Gui de to SQL: Syntax
REVOKE
Behavior of the ALL Keyword
The ALL keyword revokes all table-level privileges. If any or all of the
table-level privileges do not exist for the revokee, the REVOKEstatement with
the ALL keyword executes successfully but returns the following SQLSTATE
code:
01006 - Privilege not revoked
For example, assume that the user hal has the Select and Insert privileges on
the customer table. User jocelyn wants to revoke all seven table-level privi-
leges from user hal. So user jocelyn issues the following REVOKE statement:
REVOKE ALL ON customer FROM hal
ALTER Provides the ability to add or delete columns, modify column
data types, and add or delete constraints. This privilege also
provides the ability to set the object mode of unique indexes
and constraints to the enabled, disabled, or ltering mode. In
addition, this privilege provides the ability to set the object
mode of non-unique indexes and triggers to the enabled or
disabled modes.
REFERENCES Provides the ability to reference columns in referential
constraints. You must have the Resource privilege to take
advantage of the References privilege. (However, you can add
a referential constraint during an ALTER TABLE statement.
This method does not require that you have the Resource
privilege on the database.) Revoke the References privilege to
disallow cascading deletes.
ALL Provides all the preceding privileges. The PRIVILEGES
keyword is optional.
Privilege Functions
(2 of 2)
SQL Statements 1-445
REVOKE
This statement executes successfully but returns SQLSTATE code 01006.The
SQLSTATE warning is returned with a successful statement as follows:
I The statement succeeds in revoking the Select and Insert privileges
from user hal because user hal had those privileges.
I SQLSTATE code 01006 is returned because the other ve privileges
implied by the ALL keyword (the Delete, Update, References, Index,
and Alter privileges) did not exist for user hal; therefore, these privi-
leges were not revoked.
Examples of Revoking and Regranting Table-Level Privileges
The following example revokes the Index and Alter privileges from all users
for the customer table; these privileges are then granted specically to user
mary.
REVOKE INDEX, ALTER ON customer FROM PUBLIC;
GRANT INDEX, ALTER ON customer TO mary;
Because you cannot revoke access on specic columns, when you revoke the
Select, Update, or References privilege from a user, you revoke the privilege
for all columns in the table. You must use a GRANT statement specically to
regrant any column-specic privilege that should be available to the user, as
the following example shows:
REVOKE ALL ON customer FROM PUBLIC;
GRANT ALL ON customer TO john, cathy;
GRANT SELECT (fname, lname, company, city)
ON customer TO PUBLIC;
Database-Level Privileges
CONNECT
RESOURCE
DBA
Database-Level
Privileges
1-446 Informi x Gui de to SQL: Syntax
REVOKE
Only a user with the DBA privilege can grant or revoke database-level
privileges.
Three levels of database privileges control access. These privilege levels are,
from lowest to highest, Connect, Resource, and DBA. To revoke a database
privilege, specify one of the keywords CONNECT, RESOURCE, or DBA in the
REVOKE statement.
Because of the hierarchical organization of the privileges (as outlined in the
privilege denitions that are described later in this section), if you revoke
either the Resource or the Connect privilege from a user with the DBA privi-
lege, the statement has no effect. If you revoke the DBA privilege from a user
who has the DBA privilege, the user retains the Connect privilege on the data-
base. To deny database access to a user with the DBA or Resource privilege,
you must rst revoke the DBA or the Resource privilege and then revoke the
Connect privilege in a separate REVOKE statement.
Similarly, if you revoke the Connect privilege from a user with the Resource
privilege, the statement has no effect. If you revoke the Resource privilege
from a user, the user retains the Connect privilege on the database.
The database privileges are associated with the following keywords.
SQL Statements 1-447
REVOKE
Privilege Functions
CONNECT Lets you query and modify data. You can modify the database
schema if you won the object that you want to modify. Any user
with the Connect privilege can perform the following functions:
I Connect to the database with the CONNECT statement or
another connection statement
I Execute SELECT, INSERT, UPDATE, and DELETE statements, pro-
vided that the user has the necessary table-level privileges
I Create views, provided that the user has the Select privilege on
the underlying tables
I Create synonyms
I Create temporary tables, and create indexes on the temporary
tables
I Alter or drop a table or an index, provided that the user owns the
table or index (or has the Alter, Index, or References privilege on
the table)
I Grant privileges on a table, provided that the user owns the table
(or has been given privileges on the table with the WITH GRANT
OPTION keyword)
RESOURCE Lets you extend the structure of the database. In addition to the
capabilities of the Connect privilege, the holder of the Resource
privilege can perform the following functions:
I Create new tables
I Create new indexes
I Create new procedures
(1 of 2)
1-448 Informi x Gui de to SQL: Syntax
REVOKE
Warning: Although the user informix and DBAs can modify most system catalog
tables (only the user informix can modify systables), Informix strongly recom-
mends that you do not update, delete, or insert any rows in these tables. Modifying
the system catalog tables can destroy the integrity of the database. Informix does
support use of the ALTER TABLE statement to modify the size of the next extent of
system catalog tables.
DBA Lets the holder of DBA privilege perform the following functions
in addition to the capabilities of the Resource privilege:
I Grant any database-level privilege, including the DBAprivilege,
to another user
I Grant any table-level privilege to another user
I Grant any table-level privilege to a role
I Grant a role to a user or to another role
I Execute the SET SESSION AUTHORIZATION statement
I Use the NEXT SIZE keyword to alter extent sizes in the system
catalog tables
I Drop any object, regardless of who owns it
I Create tables, views, and indexes as well as specify another user
as owner of the objects
I Execute the DROP DATABASE statement
I Execute the START DATABASE and ROLLFORWARD DATABASE
statements
I Insert, delete, or update rows of any system catalog table except
systables
Privilege Functions
(2 of 2)
SE
SQL Statements 1-449
REVOKE
References
See the GRANT, GRANT FRAGMENT, and REVOKE FRAGMENT statements in
this manual.
For information about roles, see the CREATE ROLE, DROP ROLE, and SET
ROLE statements in this manual.
See the discussion of privileges and security in the Informix Guide to SQL:
Tutorial.
1-450 Informi x Gui de to SQL: Syntax
REVOKE FRAGMENT
REVOKE FRAGMENT
The REVOKE FRAGMENT statement enables you to revoke privileges that
have been granted on individual fragments of a fragmented table. You can
use this statement to revoke the Insert, Update, and Delete fragment-level
privileges from users.
Syntax
ON
REVOKE
FRAGMENT
Fragment-Level
Privileges
p. 1-452
+
OL
FROM
dbspace ( )
tablename
,
user
,
'user '
SQL Statements 1-451
REVOKE FRAGMENT
Usage
Use the REVOKE FRAGMENT statement to revoke the Insert, Update, or
Delete privilege on one or more fragments of a fragmented table from one or
more users.
The REVOKE FRAGMENT statement is only valid for tables that are
fragmented according to an expression-based distribution scheme. See the
ALTER FRAGMENT statement on page 1-22 for an explanation of expression-
based distribution schemes.
You can specify one fragment or a list of fragments in the REVOKE
FRAGMENT statement. To specify a fragment, name the dbspace in which the
fragment resides.
You do not have to specify a particular fragment or a list of fragments in the
REVOKE FRAGMENT statement. If you do not specify any fragments in the
statement, the specied users lose the specied privileges on all fragments
for which the users currently have those privileges.
Element Purpose Restrictions Syntax
dbspace The name of the dbspace where
the fragment is stored. Use this
parameter to specify the
fragment or fragments on which
privileges are to be revoked. If
you do not specify a fragment,
the REVOKE statement applies to
all fragments in the specied
table that have the specied
privileges.
The specied dbspace or
dbspaces must exist.
Identier, p. 1-723
tablename The name of the table that
contains the fragment or
fragments on which privileges
are to be revoked. There is no
default value.
The specied table must exist
and must be fragmented by
expression.
Table Name, p. 1-768
user The name of the user or users
from whom the specied
privileges are to be revoked.
There is no default value.
The user must be a valid user. Identier, p. 1-723
1-452 Informi x Gui de to SQL: Syntax
REVOKE FRAGMENT
Fragment-Level Privileges
You can revoke fragment-level privileges individually or in combination. List
the keywords that correspond to the privileges that you are revoking from
user. The keywords are described in the following list.
If you specify the ALL keyword in a REVOKE FRAGMENT statement, the
specied users lose all fragment-level privileges that they currently have on
the specied fragments.
For example, assume that a user currently has the Update privilege on one
fragment of a table. If you use the ALL keyword to revoke all current privi-
leges on this fragment from this user, the user loses the Update privilege that
he or she had on this fragment.
ALL
INSERT
UPDATE
,
DELETE
Fragment-Level
Privileges
Privilege Functions
ALL Revokes all privileges currently granted on a table fragment
INSERT Revokes Insert privilege on a table fragment. This privilege gives
the user the ability to insert rows in the fragment.
DELETE Revokes Delete privilege on a table fragment. This privilege gives
the user the ability to delete rows in the fragment.
UPDATE Revokes Update privilege on a table fragment. This privilege gives
the user the ability to update rows in the fragment and to name any
column of the table in an UPDATE statement.
SQL Statements 1-453
REVOKE FRAGMENT
Examples of the REVOKE FRAGMENT Statement
The examples that follow are based on the customer table. All the examples
assume that the customer table is fragmented by expression into three
fragments that reside in the dbspaces that are named dbsp1, dbsp2, and
dbsp3.
Revoking One Privilege
The following statement revokes the Update privilege on the fragment of the
customer table in dbsp1 from the user ed:
REVOKE FRAGMENT UPDATE ON customer (dbsp1) FROM ed
Revoking More Than One Privilege
The following statement revokes the Update and Insert privileges on the
fragment of the customer table in dbsp1 from the user susan:
REVOKE FRAGMENT UPDATE, INSERT ON customer (dbsp1) FROM susan
Revoking All Privileges
The following statement revokes all privileges currently granted to the user
harry on the fragment of the customer table in dbsp1.:
REVOKE FRAGMENT ALL ON customer (dbsp1) FROM harry
Revoking Privileges on More Than One Fragment
The following statement revokes all privileges currently granted to the user
millie on the fragments of the customer table in dbsp1 and dbsp2:
REVOKE FRAGMENT ALL ON customer (dbsp1, dbsp2) FROM millie
Revoking Privileges from More Than One User
The following statement revokes all privileges currently granted to the users
jerome and hilda on the fragment of the customer table in dbsp3:
REVOKE FRAGMENT ALL ON customer (dbsp3) FROM jerome, hilda
1-454 Informi x Gui de to SQL: Syntax
REVOKE FRAGMENT
Revoking Privileges Without Specifying Fragments
The following statement revokes all current privileges from the user mel on
all fragments for which this user currently has privileges:
REVOKE FRAGMENT ALL ON customer FROM mel
References
See the REVOKE and GRANT FRAGMENT statements in this manual.
SQL Statements 1-455
ROLLBACK WORK
ROLLBACK WORK
Use the ROLLBACK WORK statement to cancel a transaction and undo any
changes that occurred since the beginning of the transaction.
Syntax
Usage
The ROLLBACK WORK statement is valid only in databases with transactions.
In a database that is not ANSI-compliant, start a transaction with a BEGIN
WORK statement. You can end a transaction with a COMMIT WORK statement
or cancel the transaction with a ROLLBACK WORK statement. The ROLLBACK
WORK statement restores the database to the state that existed before the
transaction began. Use the ROLLBACK WORK statement only at the end of a
multistatement operation.
The ROLLBACK WORK statement releases all row and table locks that the
cancelled transaction holds. If you issue a ROLLBACK WORK statement when
no transaction is pending, an error occurs.
In an ANSI-compliant database, transactions are implicit. Transactions start
after each COMMIT WORK or ROLLBACK WORK statement. If you issue a
ROLLBACK WORK statement when no transaction is pending, the statement
is accepted but has no effect.
AROLLBACK WORK statement undoes all database changes except those that
result fromGRANT or REVOKE statements or from data denition statements.
Data denition statements are treated as single transactions. If they execute
successfully, they are committed automatically and cannot be rolled back by
the ROLLBACK WORK statement. Data denition statements include state-
ments that modify the number, names, or indexes of tables and statements
that modify the number, names, or data types of columns. For a list of data
denition statements, see Data Denition Statements on page 1-12.
ROLLBACK
WORK
ANSI
SE
1-456 Informi x Gui de to SQL: Syntax
ROLLBACK WORK
If a transaction rolls back, the actions that are taken to undo the transaction
are also logged to table audit trails, if any exist.
The ROLLBACK WORK statement closes all open cursors except those that are
declared with hold, which remain open despite transaction activity.
If you use the ROLLBACK WORK statement within a routine that a
WHENEVER statement calls, specify WHENEVER SQLERROR CONTINUE and
WHENEVER SQLWARNING CONTINUE before the ROLLBACK WORK
statement. This prevents the program from looping if the ROLLBACK WORK
statement encounters an error or a warning.
References
See the BEGIN WORK and COMMIT WORK statements in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of ROLLBACK WORK
in Chapter 5.
ESQL
SQL Statements 1-457
ROLLFORWARD DATABASE
ROLLFORWARD DATABASE
Use the ROLLFORWARD DATABASE statement with the INFORMIX-SE
database server to apply the transaction log le to a restored database.
Syntax
Usage
To restore a database, you need both the archive copy of the database and the
transaction log that began immediately after the archive copy was made.
To execute the ROLLFORWARD DATABASE statement, you need the DBA
privilege. Always precede a ROLLFORWARD DATABASE statement with a
CLOSE DATABASE statement. The ROLLFORWARD DATABASE statement fails
if a database is open.
The ROLLFORWARD DATABASE statement sets an exclusive lock on the
database to prevent access by other processes. If another process is using the
database (even if the database is only being read), the ROLLFORWARD
DATABASE statement fails.
The database remains locked after the ROLLFORWARD DATABASE statement
executes. This allows you to check for errors before you give access to other
users. When you are satised that the database is ready for use, issue the
CLOSE DATABASE statement to release the exclusive lock. You can open the
database with the DATABASE statement.
You must be working on a database server to issue a ROLLFORWARD
DATABASE statement. You cannot execute the statement from a client
computer.
+
ROLLFORWARD DATABASE
SE Database
Name
p. 1-660
1-458 Informi x Gui de to SQL: Syntax
ROLLFORWARD DATABASE
References
See the BEGIN WORK, COMMIT WORK, CLOSE DATABASE, DATABASE, and
ROLLBACK WORK statements in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of backups and logs
in Chapter 4.
SQL Statements 1-459
SELECT
SELECT
Use the SELECT statement to query a database.
Syntax
Element Purpose Restrictions Syntax
column name The name of a column that can
be updated after a fetch
The specied column must be in
the table, but it does not have to
be in the select list of the SELECT
clause.
Identier, p. 1-723
WHERE
Clause
p. 1-474
ORDER BY
Clause
p. 1-487
INTO TEMP
Clause
p. 1-495
+
INTO
Clause
p. 1-467
HAVING
Clause
p. 1-485
UNION ALL
UNION
SELECT
FROM
Clause
p. 1-472
Select
Clause
p. 1-461
GROUP BY
Clause
p. 1-483
ESQL
SPL
+
FOR READ ONLY
FOR UPDATE
OF
,
column
name
1-460 Informi x Gui de to SQL: Syntax
SELECT
Usage
You can query the tables in the current database, a database that is not
current, or a database that is on a different database server from your current
database.
You can query only the current database.
The SELECT statement comprises many basic clauses. Each clause is
described in the following list.
Clause Purpose
SELECT Names a list of items to be read from the database
INTO Species the program variables or host variables that
receive the selected data
FROM Names the tables that contain the selected columns
WHERE Sets conditions on the selected rows
GROUP BY Combines groups of rows into summary results
HAVING Sets conditions on the summary results
ORDER BY Orders the selected rows
INTO TEMP Creates a temporary table in the current database and
puts the results of the query into the table
FOR UPDATE Species that the values returned by the SELECT
statement can be updated after a fetch
FOR READ ONLY Species that the values returned by the SELECT
statement cannot be updated after a fetch
SE
ESQL
SPL
SQL Statements 1-461
SELECT
SELECT Clause
The SELECT clause contains the list of database objects or expressions to be
selected, as shown in the following diagram.
DISTINCT
UNIQUE
Select
List
Select
List
Synonym
Name
p. 1-766
View
Name
p. 1-772
Table
Name
p. 1-768
ALL
Expression
p. 1-671
AS
,
.
display
label
.
.
*
+
Select
Clause
1-462 Informi x Gui de to SQL: Syntax
SELECT
In the SELECT clause, specify exactly what data is being selected as well as
whether you want to omit duplicate values.
Element Purpose Restrictions Syntax
* The asterisk (*) signies that all
columns in the specied table or
view are to be selected.
Use this symbol whenever you
want to retrieve all the columns
in the table or view in their
dened order. If you want to
retrieve all the columns in some
other order, or if you want to
retrieve a subset of the columns,
you must specify the columns
explicitly in the SELECT list.
The asterisk (*) is a
literal value that has
a special meaning in
this statement.
display label A temporary name that you
assign to a column. InDB-Access,
the display label appears as the
heading for the column in the
output of the SELECT statement.
InESQL, the value of display label
is stored in the sqlname eld of
the sqlda structure. For more
information on the display label
parameter, see Using a Display
Label on page 1-466.
You can assign a display label to
any column in your select list. If
you are creating a temporary
table with the SELECT...INTO
TEMP clause, you must supply a
display label for any columns
that are not simple column
expressions. The display label is
used as the name of the column
in the temporary table. If you are
using the SELECT statement in
creating a view, do not use
display labels. Specify the
desired label names in the
CREATE VIEW column list
instead. If your display label is
also a keyword, you can use the
AS keyword with the display
label to clarify the use of the
word. You must use the AS
keyword with the display label
to use any of the following
words as a display label: UNITS,
YEAR, MONTH, DAY, HOUR,
MINUTE, SECOND, or FRACTION.
Identier, p. 1-723
SQL Statements 1-463
SELECT
Allowing Duplicates
You can apply the ALL, UNIQUE, or DISTINCT keywords to indicate whether
duplicate values are returned, if any exist. If you do not specify any
keywords, all the rows are returned by default.
For example, the following query lists the stock_num and manu_code of all
items that have been ordered, excluding duplicate items:
SELECT DISTINCT stock_num, manu_code FROM items
You can use the DISTINCT or UNIQUE keywords once in each level of a query
or subquery. For example, the following query uses DISTINCT in both the
query and the subquery:
SELECT DISTINCT stock_num, manu_code FROM items
WHERE order_num = (SELECT DISTINCT order_num FROM orders
WHERE customer_num = 120)
Expressions in the Select List
You can use any basic type of expression (column, constant, function,
aggregate function, and stored procedure), or combination thereof, in the
select list. The expression types are described in Expression on page 1-671.
The following sections present examples of using each type of simple
expression in the select list.
You can combine simple numeric expressions by connecting them with
arithmetic operators for addition, subtraction, multiplication, and division.
However, if you combine a column expression and an aggregate function,
you must include the column expression in the GROUP BY clause.
Keyword Meaning
ALL Species that all selected values are returned, regardless of
whether duplicates exist. ALL is the default state.
DISTINCT Eliminates duplicate rows from the query results
UNIQUE Eliminates duplicate rows from the query results. UNIQUE is a
synonym for DISTINCT.
1-464 Informi x Gui de to SQL: Syntax
SELECT
You cannot use variable names (for example, host variables in an ESQL
application or stored procedure variables in a stored procedure) in the select
list by themselves. You can include a variable name in the select list, however,
if an arithmetic or concatenation operator connects it to a constant.
Selecting Columns
Column expressions are the most commonly used expressions in a SELECT
statement. See Column Expressions on page 1-673 for a complete
description of the syntax and use of column expressions.
The following examples show column expressions within a select list:
SELECT orders.order_num, items.price FROM orders, items
SELECT customer.customer_num ccnum, company FROM customer
SELECT catalog_num, stock_num, cat_advert [1,15] FROM catalog
SELECT lead_time - 2 UNITS DAY FROM manufact
Selecting Constants
If you include a constant expression in the select list, the same value is
returned for each row that the query returns. See Constant Expressions on
page 1-676 for a complete description of the syntax and use of constant
expressions.
The following examples show constant expressions within a select list:
SELECT 'The first name is', fname FROM customer
SELECT TODAY FROM cust_calls
SELECT SITENAME FROM systables WHERE tabid = 1
SELECT lead_time - 2 UNITS DAY FROM manufact
SELECT customer_num + LENGTH('string') from customer
Selecting Function Expressions
A function expression uses a function that is evaluated for each row in the
query. All function expressions require arguments. This set of expressions
contains the time functions and the length function when they are used with
a column name as an argument.
SQL Statements 1-465
SELECT
The following examples show function expressions within a select list:
SELECT EXTEND(res_dtime, YEAR TO SECOND) FROM cust_calls
SELECT LENGTH(fname) + LENGTH(lname) FROM customer
SELECT HEX(order_num) FROM orders
SELECT MONTH(order_date) FROM orders
Selecting Aggregate Expressions
An aggregate function returns one value for a set of queried rows. The
aggregate functions take on values that depend on the set of rows that the
WHERE clause of the SELECT statement returns. In the absence of a WHERE
clause, the aggregate functions take on values that depend on all the rows
that the FROM clause forms.
The following examples show aggregate functions in a select list:
SELECT SUM(total_price) FROM items WHERE order_num = 1013
SELECT COUNT(*) FROM orders WHERE order_num = 1001
SELECT MAX(LENGTH(fname) + LENGTH(lname)) FROM customer
Selecting Stored Procedure Expressions
Stored procedures extend the range of functions that are available to you and
allow you to perform a subquery on each row that you select.
The following example calls the get_orders procedure for each
customer_num and displays the output of the procedure under the n_orders
label:
SELECT customer_num, lname, get_orders(customer_num) n_orders
FROM customer
1-466 Informi x Gui de to SQL: Syntax
SELECT
Selecting Expressions That Use Arithmetic Operators
You can combine numeric expressions with arithmetic operators to make
complex expressions. You cannot combine expressions that contain
aggregate functions with column expressions. The following examples show
expressions that use arithmetic operators within a select list:
SELECT stock_num, quantity*total_price FROM customer
SELECT price*2 doubleprice FROM items
SELECT count(*)+2 FROM customer
SELECT count(*)+LENGTH('ab') FROM customer
Using a Display Label
If you are creating a temporary table, you must supply a display label for any
columns that are not simple column expressions. The display label is used as
the name of the column in the temporary table.
A display label appears as the heading for that column in the output of the
SELECT statement.
The value of display label is stored in the sqlname eld of the sqlda structure.
See your SQL API product manual for more information on the sqlda
structure.
If you are using the SELECT statement in creating a view, do not use display
labels. Specify the desired label names in the CREATE VIEW column list
instead.
Using the AS Keyword
If your display label is also a keyword, you can use the AS keyword with the
display label to clarify the use of the word. If you want to use the word
UNITS, YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, or FRACTION as your
display label, you must use the AS keyword with the display label. The
following example shows how to use the AS keyword with minute as a
display label:
SELECT call_dtime AS minute FROM cust_calls
DB
ESQL
SQL Statements 1-467
SELECT
INTO Clause
Use the INTO clause within a stored procedure or SQL API to specify the
program variables or host variables to receive the data that the SELECT
statement retrieves. The following diagram shows the syntax of the INTO
clause.
INTO
Clause
,
data variable
ESQL
indicator variable INDICATOR
INTO
data structure
: indicator
variable
$ indicator
variable
+
1-468 Informi x Gui de to SQL: Syntax
SELECT
If the SELECT statement stands alone (that is, it is not part of a DECLARE
statement and does not use the INTO clause), it must be a singleton SELECT
statement. A singletonSELECT statement returns only one row. The following
example shows a singleton SELECT statement in INFORMIX-ESQL/C:
EXEC SQL select fname, lname, company_name
into :p_fname, :p_lname, :p_coname
where customer_num = 101;
Element Purpose Restrictions Syntax
data variable A program variable or host
object. This variable receives the
value of the corresponding item
in the select list of the SELECT
clause
The order of receiving variables
in the INTO clause must match
the order of the corresponding
items in the select list of the
SELECT clause. The number of
receiving variables must be
equal to the number of items in
the select list. The data type of
each receiving variable should
agree with the data type of the
corresponding column or
expression in the select list. See
Error Checking on page 1-471
for the actions that the database
server takes when the data type
of the receiving variable does
not match that of the selected
item.
The name of the
receiving variable
must conform to
language-specic
rules for variable
names.
data structure A structure that has been
declared as a host variable
The individual elements of the
structure must be matched
appropriately to the data type of
values being selected.
The name of the data
structure must
conform to
language-specic
rules for data
structures.
indicator
variable
A program variable that receives
a return code if null data is
placed in the corresponding data
variable
This parameter is optional, but
you should use an indicator
variable if the possibility exists
that the value of the corre-
sponding data variable is null.
The name of the
indicator variable
must conform to
language-specic
rules for indicator
variables.
SQL Statements 1-469
SELECT
INTO Clause with Indicator Variables
You should use an indicator variable if the possibility exists that data
returned from the SELECT statement is null. See your SQL API product
manual for more information about indicator variables.
INTO Clause with Cursors
If the SELECT statement returns more than one row, you must use a cursor in
a FETCH statement to fetch the rows individually. You can put the INTO
clause in the FETCH statement rather than in the SELECT statement, but you
cannot put it in both.
The following INFORMIX-ESQL/C code examples show different ways you
can use the INTO clause:
Using the INTO clause in the SELECT statement
EXEC SQL declare q_curs cursor for
select lname, company
into :p_lname, :p_company
from customer;
EXEC SQL open q_curs;
while (SQLCODE == 0)
EXEC SQL fetch q_curs;
EXEC SQL close q_curs;
Using the INTO clause in the FETCH statement
EXEC SQL declare q_curs cursor for
select lname, company
from customer;
EXEC SQL open q_curs;
while (SQLCODE == 0)
EXEC SQL fetch q_curs into :p_lname, :p_company;
EXEC SQL close q_curs;
ESQL
1-470 Informi x Gui de to SQL: Syntax
SELECT
Preparing a SELECT. . . INTO Query
You cannot prepare a query that has an INTO clause. You can prepare the
query without the INTO clause, declare a cursor for the prepared query, open
the cursor, and then use the FETCH statement with an INTO clause to fetch the
cursor into the program variable. Alternatively, you can declare a cursor for
the query without rst preparing the query and include the INTO clause in
the query when you declare the cursor. Then open the cursor, and fetch the
cursor without using the INTO clause of the FETCH statement.
Using Array Variables with the INTO Clause
If you use a DECLARE statement with a SELECT statement that contains an
INTO clause, and the program variable is an array element, you can identify
individual elements of the array with integer constants or with variables. The
value of the variable that is used as a subscript is determined when the cursor
is declared, so afterward the subscript variable acts as a constant.
The following INFORMIX-ESQL/C code example declares a cursor for a
SELECT...INTO statement using the variables i andj as subscripts for the array
a. After you declare the cursor, the INTO clause of the SELECT statement is
equivalent to INTOa[5],a[2].
i = 5
j = 2
EXEC SQL declare c cursor for
select order_num, po_num into :a[i], :a[j] from orders
where order_num =1005 and po_num =2865
You can also use program variables in the FETCH statement to specify an
element of a program array in the INTO clause. With the FETCH statement, the
program variables are evaluated at each fetch rather than when you declare
the cursor.
SQL Statements 1-471
SELECT
Error Checking
If the number of variables that are listed in the INTO clause differs from the
number of items in the SELECT clause, a warning is returned in the sqlwarn
structure; the following diagram shows the specic structure name. The
actual number of variables that are transferred is the lesser of the two
numbers. See your SQL API product manual for information about the
sqlwarn structure.
If the number of variables that are listed in the INTO clause differs from the
number of items in the SELECT clause, you receive an error.
If the data type of the receiving variable does not match that of the selected
item, the data type of the selected item is converted, if possible. If the
conversion is impossible, an error occurs, and a negative value is returned in
the status variable. In this case, the value in the program variable is unpre-
dictable. The following table shows the specic name of the status variable
for each application development tool.
Product Name Variable Name
ESQL/C sqlca.sqlwarn.sqlwarn3
ESQL/COBOL SQLWARN3 OF SQLWARN OF SQLCA
ESQL
ANSI
ESQL
SPL
1-472 Informi x Gui de to SQL: Syntax
SELECT
FROM Clause
The FROM clause lists the table or tables from which you are selecting the
data. The following diagram shows the syntax of the FROM clause.
FROM
+
Additional
Tables
Table
Name
p. 1-768
Table
Name
p. 1-768
View
Name
p. 1-772
Synonym
Name
p. 1-766
Table
Name
p. 1-768
View
Name
p. 1-772
Synonym
Name
p. 1-766
AS
FROM
Clause
,
(
)
,
Additional
Tables
alias
AS
+
View
Name
p. 1-772
Synonym
Name
p. 1-766
alias
OUTER
OUTER
alias
AS
+
Additional
Tables
,
AS
alias
Table
Name
p. 1-768
View
Name
p. 1-772
Synonym
Name
p. 1-766
SQL Statements 1-473
SELECT
Use the keyword OUTER to form outer joins. Outer joins preserve rows that
otherwise would be discarded by simple joins. See Chapter 3 of the Informix
Guide to SQL: Tutorial for more information on outer joins.
You can supply an alias for a table name or view name. You can use the alias
to refer to the table or view in other clauses of the SELECT statement. This is
especially useful with a self-join. (See the WHERE clause on page 1-474 for
more information about self-joins.)
The following example shows typical uses of the FROM clause. The rst
query selects all the columns and rows from the customer table. The second
query uses a join between the customer and orders table to select all the
customers who have placed orders.
SELECT * FROM customer
SELECT fname, lname, order_num
FROM customer, orders
WHERE customer.customer_num = orders.customer_num
The following example is the same as the second query in the preceding
example, except that it establishes aliases for the tables in the FROM clause
and uses them in the WHERE clause:
SELECT fname, lname, order_num
FROM customer c, orders o
WHERE c.customer_num = o.customer_num
Element Purpose Restrictions Syntax
alias A temporary alternative name
for a table or view within the
scope of a SELECT statement.
You can use aliases to make a
query shorter.
If the SELECT statement is a self-
join, you must list the table name
twice in the FROM clause and
assign a different alias to each
occurrence of the table name. If
you use a potentially ambiguous
word as an alias, you must
precede the alias with the
keyword AS. See AS Keyword
with Aliases on page 1-474 for
further information on this
restriction.
Identier, p. 1-723
1-474 Informi x Gui de to SQL: Syntax
SELECT
The following example uses the OUTER keyword to create an outer join and
produce a list of all customers and their orders, regardless of whether they
have placed orders:
SELECT customer.customer_num, lname, order_num
FROM customer c, OUTER orders o
WHERE c.customer_num = o.customer_num
AS Keyword with Aliases
To use potentially ambiguous words as an alias for a table or view, you must
precede them with the keyword AS. Use the AS keyword if you want to use
the words ORDER, FOR, AT, GROUP, HAVING, INTO, UNION, WHERE, WITH,
CREATE, or GRANT as an alias for a table or view.
WHERE Clause
Use the WHERE clause to specify search criteria and join conditions on the
data that you are selecting.
Using a Condition in the WHERE Clause
You can use the following kinds of simple conditions or comparisons in the
WHERE clause:
I Relational-operator condition
I BETWEEN
I IN
I IS NULL
I LIKE or MATCHES
WHERE
AND
Condition
p. 1-643
Join
p. 1-480
WHERE
Clause
SQL Statements 1-475
SELECT
You also can use a SELECT statement within the WHERE clause; this is called
a subquery. The following list contains the kinds of subquery WHERE
clauses:
I IN
I EXISTS
I ALL/ANY/SOME
Examples of each type of condition are shown in the following sections. For
more information about each kind of condition, see the Condition segment
on page 1-643.
You cannot use an aggregate function in the WHERE clause unless it is part of
a subquery or if the aggregate is on a correlated column originating from a
parent query and the WHERE clause is within a subquery that is within a
HAVING clause.
Relational-Operator Condition
For a complete description of the relational-operator condition, see page
1-647.
A relational-operator condition is satised when the expressions on either
side of the relational operator fulll the relation that the operator set up. The
following SELECT statements use the greater than (>) and equal (=) relational
operators:
SELECT order_num FROM orders
WHERE order_date > '6/04/94'
SELECT fname, lname, company
FROM customer
WHERE city[1,3] = 'San'
1-476 Informi x Gui de to SQL: Syntax
SELECT
BETWEEN Condition
For a complete description of the BETWEEN condition, see page 1-648.
The BETWEEN condition is satised when the value to the left of the
BETWEEN keyword lies in the inclusive range of the two values on the right
of the BETWEEN keyword. The rst two queries in the following example use
literal values after the BETWEEN keyword. The third query uses the
CURRENT function and a literal interval. It looks for dates between the
current day and seven days earlier.
SELECT stock_num, manu_code FROM stock
WHERE unit_price BETWEEN 125.00 AND 200.00
SELECT DISTINCT customer_num, stock_num, manu_code
FROM orders, items
WHERE order_date BETWEEN '6/1/93' AND '9/1/93'
SELECT * FROM cust_calls WHERE call_dtime
BETWEEN (CURRENT - INTERVAL(7) DAY TO DAY) AND CURRENT
IN Condition
For a complete description of the IN condition, see page 1-653.
The IN condition is satised when the expression to the left of the IN keyword
is included in the list of values to the right of the keyword. The following
examples show the IN condition:
SELECT lname, fname, company
FROM customer
WHERE state IN ('CA','WA', 'NJ')
SELECT * FROM cust_calls
WHERE user_id NOT IN (USER )
IS NULL Condition
For a complete description of the IS NULL condition, see page 1-649.
The IS NULL condition is satised if the column contains a null value. If you
use the NOT option, the condition is satised when the column contains a
value that is not null. The following example selects the order numbers and
customer numbers for which the order has not been paid:
SELECT order_num, customer_num FROM orders
WHERE paid_date IS NULL
SQL Statements 1-477
SELECT
LIKE or MATCHES Condition
For a complete description of the LIKE or MATCHES condition, see page 1-649.
The LIKE or MATCHES condition is satised when either of the following tests
is true:
I The value of the column that precedes the LIKE or MATCHES
keyword matches the pattern that the quoted string species. You
can use wildcard characters in the string.
I The value of the column that precedes the LIKE or MATCHES
keyword matches the pattern that is specied by the column that
follows the LIKE or MATCHES keyword. The value of the column on
the right serves as the matching pattern in the condition.
The following SELECT statement returns all rows in the customer table in
which the lname column begins with the literal string 'Baxter'. Because
the string is a literal string, the condition is case sensitive.
SELECT * FROM customer WHERE lname LIKE 'Baxter%'
The following SELECT statement returns all rows in the customer table in
which the value of the lname column matches the value of the fname
column:
SELECT * FROM customer WHERE lname LIKE fname
The following examples use the LIKE condition with a wildcard. The rst
SELECT statement nds all stock items that are some kind of ball. The second
SELECT statement nds all company names that contain a percent sign (%).
The backslash (\) is used as the standard escape character for the wildcard
percent sign (%). The third SELECT statement uses the ESCAPE option with
the LIKE condition to retrieve rows from the customer table in which the
company column includes a percent sign (%). The z is used as an escape
character for the wildcard percent sign (%).
SELECT stock_num, manu_code FROM stock
WHERE description LIKE '%ball'
SELECT * FROM customer
WHERE company LIKE '%\%%'
SELECT * FROM customer
WHERE company LIKE '%z%%' ESCAPE 'z'
1-478 Informi x Gui de to SQL: Syntax
SELECT
The following examples use MATCHES with a wildcard in several SELECT
statements. The rst SELECT statement nds all stock items that are some
kind of ball. The second SELECT statement nds all company names that
contain an asterisk (*). The backslash(\) is used as the standard escape
character for the wildcard asterisk (*). The third statement uses the ESCAPE
option with the MATCHES condition to retrieve rows from the customer table
where the company column includes an asterisk (*). The z character is used
as an escape character for the wildcard asterisk (*).
SELECT stock_num, manu_code FROM stock
WHERE description MATCHES '*ball'
SELECT * FROM customer
WHERE company MATCHES '*\**'
SELECT * FROM customer
WHERE company MATCHES '*z**' ESCAPE 'z'
IN Subquery
For a complete description of the IN subquery, see page 1-648.
With the IN subquery, more than one row can be returned, but only one
column can be returned. The following example shows the use of an IN
subquery in a SELECT statement:
SELECT DISTINCT customer_num FROM orders
WHERE order_num NOT IN
(SELECT order_num FROM items
WHERE stock_num = 1)
EXISTS Subquery
For a complete description of the EXISTS subquery, see page 1-654.
With the EXISTS subquery, one or more columns can be returned.
SQL Statements 1-479
SELECT
The following example of a SELECT statement with an EXISTS subquery
returns the stock number and manufacturer code for every item that has
never been ordered (and is therefore not listed in the items table). It is appro-
priate to use an EXISTS subquery in this SELECT statement because you need
the correlated subquery to test both stock_num and manu_code in the items
table.
SELECT stock_num, manu_code FROM stock
WHERE NOT EXISTS
(SELECT stock_num, manu_code FROM items
WHERE stock.stock_num = items.stock_num AND
stock.manu_code = items.manu_code)
The preceding example would work equally well if you use a SELECT * in the
subquery in place of the column names because you are testing for the
existence of a row or rows.
ALL/ANY/SOME Subquery
For a complete description of the ALL/ANY/SOME subquery, see page 1-655.
In the following example, the SELECT statements return the order number of
all orders that contain an item whose total price is greater than the total price
of every item in order number 1023. The rst SELECT statement uses the ALL
subquery, and the second SELECT statement produces the same result by
using the MAX aggregate function.
SELECT DISTINCT order_num FROM items
WHERE total_price > ALL (SELECT total_price FROM items
WHERE order_num = 1023)
SELECT DISTINCT order_num FROM items
WHERE total_price > SELECT MAX(total_price) FROM items
WHERE order_num = 1023)
The following SELECT statements return the order number of all orders that
contain an item whose total price is greater than the total price of at least one
of the items in order number 1023. The rst SELECT statement uses the ANY
keyword, and the second SELECT statement uses the MIN aggregate function.
SELECT DISTINCT order_num FROM items
WHERE total_price > ANY (SELECT total_price FROM items
WHERE order_num = 1023)
SELECT DISTINCT order_num FROM items
WHERE total_price > (SELECT MIN(total_price) FROM items
WHERE order_num = 1023)
1-480 Informi x Gui de to SQL: Syntax
SELECT
You can omit the keywords ANY, ALL, or SOME in a subquery if you know
that the subquery returns exactly one value. If you omit ANY, ALL, or SOME,
and the subquery returns more than one value, you receive an error. The
subquery in the following example returns only one row because it uses an
aggregate function:
SELECT order_num FROM items
WHERE stock_num = 9 AND quantity =
(SELECT MAX(quantity) FROM items WHERE stock_num = 9)
Using a Join in the WHERE Clause
You join two tables when you create a relationship in the WHERE clause
between at least one column from one table and at least one column from
another table. The effect of the join is to create a temporary composite table
where each pair of rows (one from each table) that satises the join condition
is linked to form a single row. You can create two-table joins, multiple-table
joins, and self-joins.
The following diagram shows the syntax for a join.
column
name
column
name
.
Join
Relational
Operator
p. 1-761
alias
Table
Name
p. 1-768
View
Name
p. 1-772
Synonym
Name
p. 1-766
alias
Table
Name
p. 1-768
View
Name
p. 1-772
Synonym
Name
p. 1-766
.
.
.
.
.
.
.
SQL Statements 1-481
SELECT
Two-Table J oins
The following example shows a two-table join:
SELECT order_num, lname, fname
FROM customer, orders
WHERE customer.customer_num = orders.customer_num
Tip: You do not have to select the column where the two tables are joined.
Multiple-Table J oins
A multiple-table join is a join of more than two tables. Its structure is similar
to the structure of a two-table join, except that you have a join condition for
more than one pair of tables in the WHERE clause. When columns from
different tables have the same name, you must distinguish them by
preceding the name with its associated table or table alias, as in table.column.
See Table Name on page 1-768 for the full syntax of a table name.
Element Purpose Restrictions Syntax
alias The alias assigned to the table or
view in the FROM clause. See
FROM Clause on page 1-472
for more information on aliases
for tables and views.
If the tables to be joined are the
same table (that is, if the join is a
self-join), you must refer to each
instance of the table in the
WHERE clause by the alias
assigned to that table instance in
the FROM clause.
Identier, p. 1-723
column name The name of a column from one
of the tables or views to be
joined. Rows from the tables or
views are joined when there is a
match between the values of the
specied columns.
When the specied columns
have the same name in the tables
or views to be joined, you must
distinguish the columns by
preceding each column name
with the name or alias of the
table or view in which the
column resides.
Identier, p. 1-723
1-482 Informi x Gui de to SQL: Syntax
SELECT
The following multiple-table join yields the company name of the customer
who ordered an item as well as the stock number and manufacturer code of
the item:
SELECT DISTINCT company, stock_num, manu_code
FROM customer c, orders o, items i
WHERE c.customer_num = o.customer_num
AND o.order_num = i.order_num
Self-J oins
You can join a table to itself. To do so, you must list the table name twice in
the FROM clause and assign it two different table aliases. Use the aliases to
refer to each of the two tables in the WHERE clause.
The following example is a self-join on the stock table. It nds pairs of stock
items whose unit prices differ by a factor greater than 2.5. The letters x and y
are each aliases for the stock table.
SELECT x.stock_num, x.manu_code, y.stock_num, y.manu_code
FROM stock x, stock y
WHERE x.unit_price > 2.5 * y.unit_price
Outer J oins
The following outer join lists the company name of the customer and all
associated order numbers, if the customer has placed an order. If not, the
company name is still listed, and a null value is returned for the order
number.
SELECT company, order_num
FROM customer c, OUTER orders o
WHERE c.customer_num = o.customer_num
See Chapter 3 of the Informix Guide to SQL: Tutorial for more information
about outer joins.
SQL Statements 1-483
SELECT
GROUP BY Clause
Use the GROUP BY clause to produce a single row of results for each group.
A group is a set of rows that have the same values for each column listed.
Element Purpose Restrictions Syntax
alias The alias assigned to a table or
view in the FROM clause. See
FROM Clause on page 1-472
for more information on aliases
for tables and views.
You cannot use an alias for a
table or view in the GROUP BY
clause unless you have assigned
the alias to the table or view in
the FROM clause.
Identier, p. 1-723
column name The name of a stand-alone
column in the select list of the
SELECT clause or the name of
one of the columns joined by an
arithmetic operator in the select
list. The SELECT statement
returns a single row of results for
each group of rows that have the
same value in column name.
See Relationship of the GROUP
BY Clause to the SELECT
Clause on page 1-484.
Identier, p. 1-723
(1 of 2)
GROUP BY
,
select
number
Table
Name
p. 1-768
View
Name
p. 1-772
.
Synonym
Name
p. 1-766
.
+
GROUP BY
Clause
.
alias
column
name
1-484 Informi x Gui de to SQL: Syntax
SELECT
Relationship of the GROUP BY Clause to the SELECT Clause
A GROUP BY clause restricts what you can enter in the SELECT clause. If you
use a GROUP BY clause, each column that you select must be in the GROUP BY
list. If you use an aggregate function and one or more column expressions in
the select list, you must put all the column names that are not used as part of
an aggregate or time expression in the GROUP BY clause. Do not put constant
expressions or BYTE or TEXT column expressions in the GROUP BY list. If you
are selecting a BYTE or TEXT column, you cannot use the GROUP BY clause. In
addition, you cannot use ROWID in a GROUP BY clause.
The following example names one column that is not in an aggregate
expression. The total_price column should not be in the GROUP BY list
because it appears as the argument of an aggregate function. The COUNT and
SUM keywords are applied to each group, not the whole query set.
SELECT order_num, COUNT(*), SUM(total_price)
FROM items
GROUP BY order_num
If a column stands alone in a column expression in the select list, you must
use it in the GROUP BY clause. If a column is combined with another column
by an arithmetic operator, you can choose to group by the individual
columns or by the combined expression using a specic number.
select number An integer that identies a
column or expression in the
select list of the SELECT clause by
specifying its order in the select
list. The SELECT statement
returns a single row of results for
each group of rows that have the
same value in the column or
expression identied by select
number.
See Using Select Numbers on
page 1-485.
Literal Number,
p. 1-752
Element Purpose Restrictions Syntax
(2 of 2)
SQL Statements 1-485
SELECT
Using Select Numbers
You can use one or more integers in the GROUP BY clause to stand for column
expressions. In the following example, the rst SELECT statement uses select
numbers for order_date and paid_date - order_date in the GROUP BY clause.
Note that you can group only by a combined expression using the select-
number notation. In the second SELECT statement, you cannot replace the 2
with the expression paid_date - order_date.
SELECT order_date, COUNT(*), paid_date - order_date
FROM orders
GROUP BY 1, 3
SELECT order_date, paid_date - order_date
FROM orders
GROUP BY order_date, 2
Nulls in the GROUP BY Clause
Each row that contains a null value in a column that is specied by a GROUP
BY clause belongs to a single group (that is, all null values are grouped
together).
HAVING Clause
Use the HAVING clause to apply one or more qualifying conditions to groups.
HAVING
Condition
p. 1-643
HAVING
Clause
1-486 Informi x Gui de to SQL: Syntax
SELECT
In the following examples, each condition compares one calculated property
of the group with another calculated property of the group or with a
constant. The rst SELECT statement uses a HAVING clause that compares the
calculated expression COUNT(*) with the constant 2. The query returns the
average total price per item on all orders that have more than two items. The
second SELECT statement lists customers and the call months if they have
made two or more calls in the same month.
SELECT order_num, AVG(total_price) FROM items
GROUP BY order_num
HAVING COUNT(*) > 2
SELECT customer_num, EXTEND (call_dtime, MONTH TO MONTH)
FROM cust_calls
GROUP BY 1, 2
HAVING COUNT(*) > 1
You can use the HAVING clause to place conditions on the GROUP BY column
values as well as on calculated values. The following example returns the
customer_num, call_dtime (in full year-to-fraction format), and cust_code,
and groups them by call_code for all calls that have been received from
customers with customer_num less than 120:
SELECT customer_num, EXTEND (call_dtime), call_code
FROM cust_calls
GROUP BY call_code, 2, 1
HAVING customer_num < 120
The HAVING clause generally complements a GROUP BY clause. If you use a
HAVING clause without a GROUP BY clause, the HAVING clause applies to all
rows that satisfy the query. Without a GROUP BY clause, all rows in the table
make up a single group. The following example returns the average price of
all the values in the table, as long as more than ten rows are in the table:
SELECT AVG(total_price) FROM items
HAVING COUNT(*) > 10
SQL Statements 1-487
SELECT
ORDER BY Clause
Use the ORDER BY clause to sort query results by the values that are contained
in one or more columns.
ORDER BY
column
name
select
number
display
label
ASC
DESC
Table
Name
p. 1-768
View
Name
p. 1-772
.
.
Synonym
Name
p. 1-766
.
ORDER BY
Clause
. alias
ROWID
,
+
[ rst, last ]
+
1-488 Informi x Gui de to SQL: Syntax
SELECT
Element Purpose Restrictions Syntax
alias The alias assigned to a table or
view in the FROM clause. See
FROM Clause on page 1-472
for more information on aliases
for tables and views.
You cannot specify an alias for a
table or view in the ORDER BY
clause unless you have assigned
the alias to the table or view in
the FROM clause.
Identier, p. 1-723
column name The name of a column in the
specied table or view. The
query results are sorted by the
values contained in this column.
A column specied in the
ORDER BY clause must be listed
explicitly or implicitly in the
select list of the SELECT clause. If
you want to order the query
results by a derived column, you
must supply a display label for
the derived column in the select
list and specify this label in the
ORDER BY clause. Alternatively,
you can omit a display label for
the derived column in the select
list and specify the derived
column by means of a select
number in the ORDER BY clause.
Identier, p. 1-723
display label A temporary name that you
assign to a column in the select
list of the SELECT clause. You can
use a display label in place of the
column name in the ORDER BY
clause.
You cannot specify a display
label in the ORDER BY clause
unless you have specied this
display label for a column in the
select list.
Identier, p. 1-723
rst The position of the rst character
in the portion of the column that
is used to sort the query results
The column must be one of the
following character types: BYTE,
CHAR, NCHAR, NVARCHAR,
TEXT, or VARCHAR.
Literal Number,
p. 1-752
last The position of the last character
in the portion of the column that
is used to sort the query results
The column must be one of the
following character types: BYTE,
CHAR, NCHAR, NVARCHAR,
TEXT, or VARCHAR.
Literal Number,
p. 1-752
select number An integer that identies a
column in the select list of the
SELECT clause by specifying its
order in the select list. You can
use a select number in place of a
column name in the ORDER BY
clause.
You must specify select numbers
in the ORDER BY clause when
SELECT statements are joined by
UNION or UNION ALL keywords
and compatible columns in the
same position have different
names.
Literal Number,
p. 1-752
SQL Statements 1-489
SELECT
You can perform an ORDER BY operation on a column or on an aggregate
expression when you use SELECT * or a display label in your SELECT
statement.
The following query explicitly selects the order date and shipping date from
the orders table and then rearranges the query by the order date. By default,
the query results are listed in ascending order.
SELECT order_date, ship_date FROM orders
ORDER BY order_date
In the following query, the order_date column is selected implicitly by the
SELECT * statement, so you can use order_date in the ORDER BY clause:
SELECT * FROM orders
ORDER BY order_date
Ordering by a Column Substring
You can order by a column substring instead of ordering by the entire length
of the column. The column substring is the portion of the column that the
database server uses for the sort. You dene the column substring by speci-
fying column subscripts (the rst andlast parameters). The column subscripts
represent the starting and ending character positions of the column
substring.
The following example shows a SELECT statement that queries the customer
table and species a column substring in the ORDER BY column. The column
substring instructs the database server to sort the query results by the portion
of the lname column contained in the sixth through ninth positions of the
column:
SELECT * from customer
ORDER BY lname[6,9]
Assume that the value of lname in one row of the customer table is
Greenburg. Because of the column substring in the ORDER BY clause, the
database server determines the sort position of this row by using the value
burg, not the value Greenburg.
You can specify column substrings only for columns that have a character
data type. If you specify a column substring in the ORDER BY clause, the
column must have one of the following data types: BYTE, CHAR, NCHAR,
NVARCHAR, TEXT, or VARCHAR.
1-490 Informi x Gui de to SQL: Syntax
SELECT
For information on the GLS aspects of using column substrings in the ORDER
BY clause, see the Guide to GLS Functionality, Chapter 3.
Ordering by a Derived Column
You can order by a derived column by supplying a display label in the
SELECT clause, as shown in the following example:
SELECT paid_date - ship_date span, customer_num
FROM orders
ORDER BY span
Ascending and Descending Orders
You can use the ASC andDESC keywords to specify ascending (smallest value
rst) or descending (largest value rst) order. The default order is ascending.
For DATE and DATETIME data types, smallest means earliest in time and
largest means latest in time. For standard character data types, the ASCII
collating sequence is used. See page 1-763 for a listing of the collating
sequence.
Nulls in the ORDER BY Clause
Null values are ordered as less than values that are not null. Using the ASC
order, the null value comes before the non-null value; using DESC order, the
null value comes last.
Nested Ordering
If you list more than one column in the ORDER BY clause, your query is
ordered by a nested sort. The rst level of sort is based on the rst column;
the second column determines the second level of sort. The following
example of a nested sort selects all the rows in the cust_calls table and orders
them by call_code and by call_dtime within call_code:
SELECT * FROM cust_calls
ORDER BY call_code, call_dtime
GLS
SQL Statements 1-491
SELECT
Using Select Numbers
In place of column names, you can enter one or more integers that refer to the
position of items in the SELECT clause. You can use a select number to order
by an expression. For instance, the following example orders by the
expression paid_date - order_date andcustomer_num, using select numbers
in a nested sort:
SELECT order_num, customer_num, paid_date - order_date
FROM orders
ORDER BY 3, 2
Select numbers are required in the ORDER BY clause when SELECT statements
are joined by the UNION or UNION ALL keywords and compatible columns
in the same position have different names.
Ordering by Rowids
You can specify the rowid column as a column in the ORDER BY clause. The
rowid column is a hidden column in nonfragmented tables and in
fragmented tables that were created with the WITH ROWIDS clause. The
rowid column contains a unique internal record number that is associated
with a row in a table. Informix recommends, however, that you utilize
primary keys as an access method rather than exploiting the rowid column.
If you want to specify the rowid column in the ORDER BY clause, enter the
keyword ROWID in lowercase or uppercase letters.
You cannot specify the rowid column in the ORDER BY clause if the table you
are selecting from is a fragmented table that does not have a rowid column.
You cannot specify the rowid column in the ORDER BY clause unless you
have included the rowid column in the select list of the SELECT clause.
For further information on using the rowid column in column expressions,
see Expression on page 1-671.
ORDER BY Clause with DECLARE
You cannot use a DECLARE statement with a FOR UPDATE clause to associate
a cursor with a SELECT statement that has an ORDER BY clause.
ESQL
1-492 Informi x Gui de to SQL: Syntax
SELECT
Placing Indexes on ORDER BY Columns
When you include an ORDER BY clause in a SELECT statement, you can
improve the performance of the query by creating an index on the column or
columns that the ORDER BY clause species. The database server uses the
index that you placed on the ORDER BY columns to sort the query results in
the most efcient manner. For further information on creating indexes that
correspond to the columns of an ORDER BY clause, see The ASC and DESC
Keywords on page 1-113 under the CREATE INDEX statement.
FOR UPDATE Clause
Use the FOR UPDATE clause when you prepare a SELECT statement, and you
intend to update the values returned by the SELECT statement when the
values are fetched. Preparing a SELECT statement that contains a FOR
UPDATE clause is equivalent to preparing the SELECT statement without the
FOR UPDATE clause and then declaring a FOR UPDATE cursor for the
prepared statement.
The FOR UPDATE keyword noties the database server that updating is
possible, causing it to use more-stringent locking than it would with a select
cursor. You cannot modify data through a cursor without this clause. You can
specify particular columns that can be updated.
After you declare a cursor for a SELECT... FOR UPDATE statement, you can
update or delete the currently selected row using an UPDATE or DELETE
statement with the WHERE CURRENT OF clause. The words CURRENT OF
refer to the row that was most recently fetched; they replace the usual test
expressions in the WHERE clause.
To update rows with a particular value, your program might contain state-
ments such as the sequence of statements shown in the following example:
EXEC SQL BEGIN DECLARE SECTION;
char fname[ 16];
char lname[ 16];
EXEC SQL END DECLARE SECTION;
.
.
.
EXEC SQL connect to 'stores7';
/* select statement being prepared contains a for update clause */
EXEC SQL prepare x from 'select fname, lname from customer for update';
EXEC SQL declare xc cursor for x; --note no 'for update' clause in declare
SQL Statements 1-493
SELECT
for (;;)
{
EXEC SQL fetch xc into $fname, $lname;
if (strncmp(SQLSTATE, '00', 2) != 0) break;
printf("%d %s %s\n",cnum, fname, lname );
if (cnum == 999)--update rows with 999 customer_num
EXEC SQL update customer set fname = 'rosey' where current of xc;
}
EXEC SQL close xc;
EXEC SQL disconnect current;
A SELECT ... FOR UPDATE statement, like an update cursor, allows you to
perform updates that are not possible with the UPDATE statement alone,
because both the decision to update and the values of the new data items can
be based on the original contents of the row. The UPDATE statement cannot
interrogate the table that is being updated.
Syntax That is Incompatible with the FOR UPDATE Clause
A SELECT statement that uses a FOR UPDATE clause must conform to the
following restrictions:
I The statement can select data from only one table.
I The statement cannot include any aggregate functions.
I The statement cannot include any of the following clauses or
keywords: DISTINCT, FOR READ ONLY, GROUP BY, INTO TEMP,
ORDER BY, UNION, or UNIQUE.
For information on how to declare an update cursor for a SELECT statement
that does not include a FOR UPDATE clause, see page 1-242.
FOR READ ONLY Clause
Use the FOR READ ONLY clause to specify that the select cursor declared for
the SELECT statement is a read-only cursor. A read-only cursor is a cursor that
cannot modify data. This section provides the following information about
the FOR READ ONLY clause:
I When you must use the FOR READ ONLY clause
I Syntax restrictions on a SELECT statement that uses a FOR READ
ONLY clause
1-494 Informi x Gui de to SQL: Syntax
SELECT
Using the FOR READ ONLY Clause in Read-Only Mode
Normally, you do not need to include the FOR READ ONLY clause in a SELECT
statement. A SELECT statement is a read-only operation by denition, so the
FOR READ ONLY clause is usually unnecessary. However, in certain special
circumstances, you must include the FOR READ ONLY clause in a SELECT
statement.
If you have used the High-Performance Loader (HPL) in express mode to
load data into the tables of an ANSI-mode database, and you have not yet
performed a level-0 backup of this data, the database is in read-only mode.
When the database is in read-only mode, the database server rejects any
attempts by a select cursor to access the data unless the SELECT or the
DECLARE includes a FOR READ ONLY clause. This restriction remains in effect
until the user has performed a level-0 backup of the data.
When the database is an ANSI-mode database, select cursors are update
cursors by default. An update cursor is a cursor that can be used to modify
data. These update cursors are incompatible with the read-only mode of the
database. For example, the following SELECT statement against the
customer_ansi table fails:
EXEC SQL declare ansi_curs cursor for
select * from customer_ansi;
The solution is to include the FOR READ ONLY clause in your select cursors.
The read-only cursor that this clause species is compatible with the read-
only mode of the database. For example, the following SELECT FOR READ
ONLY statement against the customer_ansi table succeeds:
EXEC SQL declare ansi_read cursor for
select * from customer_ansi for read only;
DB-Access executes all SELECT statements with select cursors. Therefore, you
must include the FOR READ ONLY clause in all SELECT statements that access
data in a read-only ANSI-mode database. The FOR READ ONLY clause causes
DB-Access to declare the cursor for the SELECT statement as a read-only
cursor.
ANSI
D/B
SQL Statements 1-495
SELECT
For more information on the express mode of HPL, see the Guide to the
High-Performance Loader. For more information on level-0 backups, see the
INFORMIX-OnLine Dynamic Server Archive and Backup Guide. For more infor-
mation on select cursors, read-only cursors, and update cursors, see the
DECLARE statement on page 1-234.
Syntax That Is Incompatible with the FOR READ ONLY Clause
Whether your database is an ANSI-mode database or a database that is not
ANSI compliant, you cannot include both the FOR READ ONLY clause and the
FOR UPDATE clause in the same SELECT statement. If you attempt to do so,
the SELECT statement fails.
For information on how to declare a read-only cursor for a SELECT statement
that does not include a FOR READ ONLY clause, see page 1-245.
INTO TEMP Clause
WITH NO LOG
INTO TEMP
temp table name
INTO TEMP
Clause
1-496 Informi x Gui de to SQL: Syntax
SELECT
The INTO TEMP clause creates a temporary table that contains the query
results. The initial and next extents for the temporary table are always eight
pages. Temporary tables created with the INTO TEMP clause are explicit
temporary tables. Explicit temporary tables can also be created with the
CREATE TEMP TABLE statement.
If the DBSPACETEMP environment variable is set for INFORMIX-OnLine
Dynamic Server, temporary tables created with the INTO TEMP clause are
located in the dbspaces that are specied in the DBSPACETEMP list. You can
also specify dbspace settings with the ONCONFIG parameter DBSPACETEMP.
If neither the environment variable nor conguration parameter is set, the
default setting is the root dbspace. The settings specied for the
DBSPACETEMP environment variable take precedence over the ONCONFIG
parameter DBSPACETEMP and the default setting. For more information
about creating temporary tables, see the CREATE TABLE statement on page
1-154. For more information about the DBSPACETEMP environment variable,
see Chapter 4 of the Informix Guide to SQL: Reference. For more information
about the ONCONFIG parameter DBSPACETEMP, see the INFORMIX-OnLine
Dynamic Server Administrators Guide.
Temporary tables are located in whatever directory is specied in the
DBTEMP environment variable setting or in the directory of the database
(that is, the *.dbs directory).
Element Purpose Restrictions Syntax
temp table name The simple name of a temporary
table. This table contains the
results of the SELECT statement.
The column names of the
temporary table are those that
are named in the select list of the
SELECT clause.
The name must be different from
any existing table, view, or
synonym name in the current
database, but it does not have to
be different from other
temporary table names used by
other users. You must have the
Connect privilege on a database
to create a temporary table in
that database. If you use the
INTO TEMP clause to create a
temporary table, you must
supply a display label for all
expressions in the select list
other than simple column
expressions.
Identier, p. 1-723
SE
SQL Statements 1-497
SELECT
The temporary table disappears when your program ends or when you issue
a DROP TABLE statement on the temporary table. If your database does not
have logging, or if it has logging, and you created the temporary table
without the WITH NO LOG keywords, the temporary table disappears when
you close the current database.
If you use the same query results more than once, using a temporary table
saves time. In addition, using an INTO TEMP clause often gives you clearer
and more understandable SELECT statements. However, the data in the
temporary table is static; data is not updated as changes are made to the
tables used to build the temporary table.
The column names of the temporary table are those named in the SELECT
clause. You must supply a display label for all expressions other than simple
column expressions. The display label for a column or expression becomes
the column name in the temporary table. If you do not provide a display label
for a column expression, the temporary table uses the column name from the
select list. The following example creates the pushdate table with two
columns, customer_num and slowdate:
SELECT customer_num, call_dtime + 5 UNITS DAY slowdate
FROM cust_calls INTO TEMP pushdate
You can put indexes on a temporary table.
INTO TEMP Clause and WHERE Clause
When you use the INTO TEMP clause combined with the WHERE clause, and
no rows are returned, the SQLNOTFOUND value is 100 in ANSI-compliant
databases and 0 in databases that are not ANSI compliant. If the SELECT INTO
TEMP ... WHERE ... statement is a part of a multistatement prepare and no
rows are returned, the SQLNOTFOUND value is 100 for both ANSI-compliant
databases and databases that are not ANSI-compliant.
1-498 Informi x Gui de to SQL: Syntax
SELECT
INTO TEMP Clause and INTO
Do not use the INTO option with the INTO TEMP clause: If you do, no results
are returned to the program variables and the sqlcode variable is set to a
negative value. The name of the sqlcode variable for each product is shown
in the following table.
WITH NO LOG Option
If you use the WITH NO LOG keywords, operations on the temporary table are
not included in the transaction-log operations. You can use this option to
reduce the overhead of transaction logging.
UNION Operator
Place the UNION operator between two SELECT statements to combine the
queries into a single query. You can string several SELECT statements
together using the UNION operator. Corresponding items do not need to
have the same name.
Restrictions on a Combined SELECT
Several restrictions apply on the queries that you can connect with a UNION
operator, as the following list describes:
I The number of items in the SELECT clause of each query must be the
same, and the corresponding items in each SELECT clause must have
compatible data types.
I If you use an ORDER BY clause, it must follow the last SELECT clause,
and you must refer to the item ordered by integer, not by identier.
Ordering takes place after the set operation is complete.
Product Variable Name
ESQL/C sqlca.sqlcode, SQLCODE
ESQL/COBOL SQLCODE OF SQLCA
ESQL
SQL Statements 1-499
SELECT
I You cannot use a UNION operator inside a subquery or in the
denition of a view.
I You cannot use an INTO clause in a query unless you are sure that the
compound query returns exactly one row, and you are not using a
cursor. In this case, the INTO clause must be in the rst SELECT
statement.
To put the results of a UNION operator into a temporary table, use an INTO
TEMP clause in the nal SELECT statement.
Duplicate Rows in a Combined SELECT
If you use the UNION operator alone, the duplicate rows are removed from
the complete set of rows. That is, if multiple rows contain identical values in
each column, only one row is retained. If you use the UNION ALL operator,
all the selected rows are returned (the duplicates are not removed). The
following example uses the UNION ALL operator to join two SELECT
statements without removing duplicates. The query returns a list of all the
calls that were received during the rst quarter of 1993 and the rst quarter
of 1994.
SELECT customer_num, call_code FROM cust_calls
WHERE call_dtime BETWEEN
DATETIME (1993-1-1) YEAR TO DAY
AND DATETIME (1993-3-31) YEAR TO DAY
UNION ALL
SELECT customer_num, call_code FROM cust_calls
WHERE call_dtime BETWEEN
DATETIME (1994-1-1)YEAR TO DAY
AND DATETIME (1994-3-31) YEAR TO DAY
If you want to remove duplicates, use the UNION operator without the
keyword ALL in the query. In the preceding example, if the combination 101
B were returned in both SELECT statements, a UNION operator would cause
the combination to be listed once. (If you want to remove duplicates within
each SELECT statement, use the DISTINCT keyword in the SELECT clause, as
described on page 1-461.)
ESQL
1-500 Informi x Gui de to SQL: Syntax
SELECT
References
In the Informix Guide to SQL: Tutorial, see the discussion of the SELECT
statement in Chapter 2 and Chapter 3.
In the Guide to GLS Functionality, see the discussion of the GLS aspects of the
SELECT statement.
SQL Statements 1-501
SET
SET
The SET statement allows you to change the object mode of the following
database objects: constraints, indexes, and triggers. You can also use the SET
statement to specify the transaction mode of constraints.
Syntax
Usage
The SET statement has the following purposes:
I To change the object mode of constraints, indexes, and triggers
When you change the object mode of constraints, indexes, or
triggers, the change is permanent. The setting that the SET statement
produces remains in effect until you change the object mode of the
object again.
I To set the transaction mode of constraints by specifying whether
constraints are checked at the statement level or at the transaction
level
When you set the transaction mode of constraints, the effect of the
SET statement is limited to the transaction in which it is executed.
The setting that the SET statement produces is effective only during
the transaction. For further information on setting the transaction
mode for constraints, see Transaction-Mode Format on page 1-523.
SET +
Table-Mode
Format
p. 1-503
List-Mode
Format
p. 1-508
Transaction-
Mode Format
p. 1-523
OL
1-502 Informi x Gui de to SQL: Syntax
SET
Terminology for Object Modes
The SET statement operates on database objects by changing the object mode
of those objects. The terms database objects and objects have a restricted
meaning in the context of the SET statement. Both terms refer to the
constraints, indexes, and triggers in a database.
Similarly, the termobject modes has a restricted meaning in the context of the
SET statement. The term refers to the three states that a database object can
have: enabled, disabled, and ltering. The sysobjstate system catalog table
lists all of the objects in the database and the current object mode of each
object.
Do not confuse the terms objects and object modes as used in the SET statement
with the termobjects in INFORMIX-NewEra. In the context of
INFORMIX-NewEra, objects refers to objects within an application.
Methods for Changing Object Modes
The SET statement provides the following formats for changing object modes:
table mode and list mode. For an explanation of the table-mode format, see
Table-Mode Format on page 1-503. For an explanation of the list-mode
format, see List-Mode Format on page 1-508.
Privileges Required for Changing Object Modes
To change the object mode of a constraint, index, or trigger, you must have
the necessary privileges. Specically, you must meet one of the following
requirements:
I You must have the DBA privilege on the database.
I You must be the owner of the table on which the object is dened and
must have the Resource privilege on the database.
I You must have the Alter privilege on the table on which the object is
dened and the Resource privilege on the database.
SQL Statements 1-503
SET
Table-Mode Format
Use the table-mode format to change the object mode of all objects of a given
type that have been dened on a particular table. For example, to change the
object mode of all constraints that are dened on the cust_subset table to the
disabled mode, enter the following statement:
SET CONSTRAINTS FOR cust_subset DISABLED
By using the table-mode format, you can change the object modes of more
than one object type with a single SET statement. For example, to change the
object mode of all constraints, indexes, and triggers that are dened on the
cust_subset table to the enabled mode, enter the following statement:
SET CONSTRAINTS, INDEXES, TRIGGERS FOR cust_subset
ENABLED
Element Purpose Restrictions Syntax
table name The name of the table whose
objects will have their object
mode changed. There is no
default value.
The table must be a local table.
You cannot set the object modes
of objects dened on a
temporary table to the disabled
or ltering modes. For infor-
mation on the privileges
required to change the object
mode of the objects dened on a
table, see Privileges Required
for Changing Object Modes on
page 1-502.
Identier, p. 1-723
FOR
,
INDEXES
CONSTRAINTS
TRIGGERS
table name
Object Modes for
Constraints and
Unique Indexes
p. 1-504
Object Modes for
Triggers and
Duplicate Indexes
p. 1-507
Table-Mode Format
1-504 Informi x Gui de to SQL: Syntax
SET
Object Modes for Constraints and Unique Indexes
You can specify the disabled, enabled, or ltering object modes for a
constraint or a unique index. You must specify one of these object modes in
your SET statement. The SET statement has no default object mode.
You can also specify the object mode for a constraint when you create the
constraint with the ALTER TABLE or CREATE TABLE statements. If you do not
specify the object mode for a constraint in one of these statements or in a SET
statement, the constraint is in the enabled object mode by default.
You can also specify the object mode for a unique index when you create the
index with the CREATE INDEX statement. If you do not specify the object
mode for a unique index in the CREATE INDEX statement or in a SET
statement, the unique index is in the enabled object mode by default.
For denitions of the disabled, enabled, and ltering object modes see Using
Object Modes with Data Manipulation Statements on page 1-509. For an
explanation of the benets of these object modes, see Benets of Object
Modes on page 1-521.
Error Options for Filtering Mode
When you change the object mode of a constraint or unique index to the
ltering mode, you can specify the following error options: WITHOUT ERROR
or WITH ERROR.
Object Modes for Constraints
and Unique Indexes
DISABLED
WITHOUT
ERROR
WITH
ERROR
FILTERING
ENABLED
SQL Statements 1-505
SET
The WITHOUT ERROR Option
The WITHOUT ERROR option signies that when the database server executes
an INSERT, DELETE, or UPDATE statement, and one or more of the target rows
causes a constraint violation or unique-index violation, no integrity-violation
error message is returned to the user. The WITHOUT ERROR option is the
default error option.
The WITH ERROR Option
The WITH ERROR option signies that when the database server executes an
INSERT, DELETE, or UPDATE statement, and one or more of the target rows
causes a constraint violation or unique-index violation, an integrity-violation
error message is returned to the user.
Scope of Error Options
The WITH ERROR and WITHOUT ERROR options apply only when the
database server executes an INSERT, DELETE, or UPDATE statement, and one
or more of the target rows causes a constraint violation or unique index
violation. These error options control whether the database server displays
an integrity-violation error message after it executes these statements.
These error options do not apply when you attempt to change the object
mode of a disabled constraint or disabled unique index to the enabled or
ltering mode, and the SET statement fails because one or more rows in the
target table violates the constraint or the unique-index requirement. In these
cases, if a violations table has been started for the table that contains the
inconsistent data, the database server returns an integrity-violation error
message regardless of the error option that is specied in the SET statement.
Violations and Diagnostics Tables for Filtering Mode
When you specify the ltering mode for constraints or unique indexes in a
SET statement, violations and diagnostics tables are not automatically started
for the target table. When you set objects to the ltering mode, be sure to start
the violations and diagnostics tables for the target table on which the ltering
mode objects are dened. The violations table captures rows that fail to meet
integrity requirements. The diagnostics table captures information about
each row that fails to meet integrity requirements.
1-506 Informi x Gui de to SQL: Syntax
SET
When to Start the Violations and Diagnostics Tables
You are not required to start the violations and diagnostics tables before you
set objects to the ltering mode. If you have not started a violations and
diagnostics table when you set an object to the ltering mode, the database
server executes your SET statement and does not return an error. Similarly, if
you issue an INSERT, DELETE, or UPDATE statement on the target table, and
you have not started a violations and diagnostics table for the target table, the
database server executes the statement and does not return an error as long
as all of the integrity requirements on the table are satised.
If you have not started a violations and diagnostics table for the target table
with ltering-mode objects, the database server does not return an error until
an INSERT, DELETE, or UPDATE statement fails to satisfy an integrity
requirement on the table. If an INSERT, DELETE, or UPDATE statement fails to
satisfy the constraint or unique-index requirement for a particular row, the
database server cannot lter the bad row to the violations table because no
violations table is associated with the target table. The user receives an error
message indicating that no violations table has been started for the target
table.
To prevent such errors, start the violations and diagnostics tables for the
target table at one of the following points:
I You can start the violations and diagnostics tables before you set any
objects that are dened on the table to the ltering mode.
I You can start the violations and diagnostics tables after you set
objects to the ltering mode but before any users issue INSERT,
DELETE, or UPDATE statements that could violate any integrity
requirements on the target table.
How to Start the Violations and Diagnostics Tables
To create the violations and diagnostics tables and associate them with the
target table, use the START VIOLATIONS TABLE statement. In this statement,
specify the name of the target table for which the violations and diagnostics
tables are to be started. You can also assign names to the violations and
diagnostics tables in this statement.
For further information on the START VIOLATIONS TABLE statement and the
structure of the violations and diagnostics tables themselves, see the START
VIOLATIONS TABLE statement on page 1-584.
SQL Statements 1-507
SET
How to Stop the Violations and Diagnostics Tables
After you turn off ltering mode for the objects that are dened on a target
table, and you no longer need the violations and diagnostics tables, use the
STOP VIOLATIONS TABLE statement to drop the association between the
target table and the violations and diagnostics tables. In this statement, you
specify the name of the target table whose association with the violations and
diagnostics tables is to be dropped.
For further information on using the STOP VIOLATIONS TABLE statement, see
the STOP VIOLATIONS TABLE statement on page 1-603.
Object Modes for Triggers and Duplicate Indexes
You can specify the disabled or enabled object modes for triggers or duplicate
indexes. You must specify one of these object modes in your SET statement.
The SET statement has no default object mode.
You can also specify the object mode for a trigger when you create the trigger
with the CREATE TRIGGER statement. If you do not specify the object mode
for a trigger in the CREATE TRIGGER statement or in a SET statement, the
trigger is in the enabled object mode by default.
You can also specify the object mode for a duplicate index when you create
the index with the CREATE INDEX statement. If you do not specify the object
mode for a duplicate index in the CREATE INDEX statement or in a SET
statement, the duplicate index is in the enabled object mode by default.
For denitions of the disabled and enabled object modes, see Using Object
Modes with Data Manipulation Statements on page 1-509. For an expla-
nation of the benets of these two object modes, see Benets of Object
Modes on page 1-521.
DISABLED
ENABLED
Object Modes for Triggers
and Duplicate Indexes
1-508 Informi x Gui de to SQL: Syntax
SET
List-Mode Format
Use the list-mode format to change the object mode for a particular
constraint, index, or trigger. For example, to change the object mode of the
unique index unq_ssn on the cust_subset table to ltering mode, enter the
following statement:
SET INDEXES unq_ssn FILTERING
Element Purpose Restrictions Syntax
constraint name The name of the constraint
whose object mode is to be set, or
a list of constraint names. There
is no default value.
Each constraint in the list must
be a local constraint. All
constraints in the list must be
dened on the same table.
Identier, p. 1-723
index name The name of the index whose
object mode is to be set, or a list
of index names. There is no
default value.
Each index in the list must be a
local index. All indexes in the list
must be dened on the same
table.
Identier, p. 1-723
trigger name The name of the trigger whose
object mode is to be set, or a list
of trigger names. There is no
default value.
Each trigger in the list must be a
local trigger. All triggers in the
list must be dened on the same
table.
Identier, p. 1-723
CONSTRAINTS
,
constraint
name
Object Modes for
Triggers and
Duplicate Indexes
p. 1-507
INDEXES
,
index name
Object Modes for
Constraints and
Unique Indexes
p. 1-504
Object Modes for
Constraints and
Unique Indexes
p. 1-504
,
List-Mode Format
TRIGGERS trigger name
Object Modes for
Triggers and
Duplicate Indexes
p. 1-507
SQL Statements 1-509
SET
You can also use the list-mode format to change the object mode for a list of
constraints, indexes, or triggers that are dened on the same table. Assume
that four triggers are dened on the cust_subset table: insert_trig,
update_trig, delete_trig, and execute_trig. Also assume that all four triggers
are in the enabled mode. To change the object mode of all the triggers except
execute_trig to the disabled mode, enter the following statement:
SET TRIGGERS insert_trig, update_trig, delete_trig DISABLED
Using Object Modes with Data Manipulation Statements
You can use object modes to control the effects of INSERT, DELETE, and
UPDATE statements. Your choice of object modes affects the tables whose
data you are manipulating, the behavior of the objects dened on those
tables, and the behavior of the data manipulation statements themselves.
What do we mean by the terms enabled, disabled, and ltering? Denitions of
these object modes follow. These denitions explain how each object mode
affects tables and data manipulation statements. The denitions focus on the
object modes of constraints as an illustration, but the same principles apply
to indexes and triggers as well.
Denition of Enabled Mode
Constraints, indexes, and triggers are in the enabled mode by default. When
an object is in the enabled mode, the database server recognizes the existence
of the object and takes the object into consideration while it executes data
manipulation statements. For example, when a constraint is enabled, any
INSERT, UPDATE, or DELETE statement that violates the constraint fails, and
the target row remains unchanged. In addition, the user receives an error
message.
Definition of Disabled Mode
When an object is in the disabled mode, the database server acts as if the
object did not exist and does not take it into consideration during the
execution of data manipulation statements. For example, when a constraint
is disabled, any INSERT, UPDATE, or DELETE statement that violates the
constraint succeeds, and the target row is changed. The user does not receive
an error message.
1-510 Informi x Gui de to SQL: Syntax
SET
Denition of Filtering Mode
When an object is in the ltering mode, the object behaves the same as in the
enabled mode in that the database server recognizes the existence of the
object during INSERT, UPDATE, and DELETE statements. For example, when
a constraint is in the ltering mode, and an INSERT, DELETE, or UPDATE
statement is executed, any target rows that violate the constraint remain
unchanged.
However, the database server handles data manipulation statements differ-
ently for objects in enabled and ltering mode, as the following paragraphs
describe:
I If a constraint or unique index is in the enabled mode, the database
server carries out the INSERT, UPDATE, or DELETE statement only if
all the target rows affected by the statement satisfy the constraint or
the unique index requirement. The database server updates all the
target rows in the table.
I If a constraint or unique index is in the ltering mode, the database
server carries out the INSERT, UPDATE, or DELETE statement even if
one or more of the target rows fail to satisfy the constraint or the
unique index requirement. The database server updates the good
rows in the table (the target rows that satisfy the constraint or unique
index requirement). The database server does not update the bad
rows in the table (that is, the target rows that fail to satisfy the
constraint or unique index requirement). Instead the database server
sends each bad row to a special table called the violations table. The
database server places information about the nature of the violation
for each bad row in another special table called the diagnostics table.
Example of Object Modes with Data Manipulation
Statements
An example with the INSERT statement can illustrate the differences between
the enabled, disabled, and ltering modes. Consider an INSERT statement in
which a user tries to add a row that does not satisfy an integrity constraint on
a table. For example, assume that a user joe has created a table named
cust_subset, andthis table consists of the following columns: ssn(customers
social security number), fname (customers rst name), lname (customers
last name), and city (city in which the customer lives). The ssn column has
the INT data type. The other three columns have the CHAR data type.
SQL Statements 1-511
SET
Assume that user joe has dened the lname column as not null but has not
assigned a name to the not null constraint, so the database server has
implicitly assigned the name n104_7 to this constraint. Finally, assume that
user joe has created a unique index named unq_ssn on the ssn column.
Now a user linda who has the Insert privilege on the cust_subset table enters
the following INSERT statement on this table:
INSERT INTO cust_subset (ssn, fname, city)
VALUES (973824499, "jane", "los altos")
User linda has entered values for all the columns of the new row except for
the lname column, even though the lname column has been dened as a not
null column. The database server behaves in the following ways, depending
on the object mode of the constraint:
I If the constraint is disabled, the row is inserted in the target table, and
no error is returned to the user.
I If the constraint is enabled, the row is not inserted in the target table.
A constraint-violation error is returned to the user, and the effects of
the statement are rolled back (if the database is an OnLine database
with logging).
I If the constraint is ltering, the row is not inserted in the target table.
Instead the row is inserted in the violations table. Information about
the integrity violation caused by the row is placed in the diagnostics
table. The effects of the INSERT statement are not rolled back. You
receive an error message if you specied the WITH ERROR option for
the ltering-mode constraint. By analyzing the contents of the viola-
tions and the diagnostics tables, you can identify the reason for the
failure and either take corrective action or roll back the operation.
We can better grasp the distinctions among disabled, enabled, and ltering
modes by viewing the actual results of the INSERT statement shown in the
preceding example.
1-512 Informi x Gui de to SQL: Syntax
SET
Results of the Insert Operation When the Constraint Is Disabled
If the not null constraint on the cust_subset table is disabled, the INSERT
statement that user linda issues successfully inserts the new row in this table.
The new row of the cust_subset table has the following column values.
Results of the Insert Operation When the Constraint Is Enabled
If the not null constraint on the cust_subset table is enabled, the INSERT
statement fails to insert the new row in this table. Instead user linda receives
the following error message when she enters the INSERT statement:
-292 An implied insert column lname does not accept NULLs.
Results of the Insert When Constraint Is in Filtering Mode
If the not null constraint on the cust_subset table is set to the ltering mode,
the INSERT statement that user linda issues fails to insert the new row in this
table. Instead the new row is inserted into the violations table, and a
diagnostic row that describes the integrity violation is added to the
diagnostics table.
Assume that user joe has started a violations and diagnostics table for the
cust_subset table. The violations table is named cust_subset_vio, and the
diagnostics table is named cust_subset_dia. The new row added to the
cust_subset_vio violations table when user linda issues the INSERT
statement on the cust_subset target table has the following column values.
ssn fname lname city
973824499 jane NULL los altos
ssn fname lname city informix_tupleid informix_optype informix_recowner
973824499 jane NULL los altos 1 I linda
SQL Statements 1-513
SET
This new row in the cust_subset_vio violations table has the following
characteristics:
I The rst four columns of the violations table exactly match the
columns of the target table. These four columns have the same names
and the same data types as the corresponding columns of the target
table, and they have the column values that were supplied by the
INSERT statement that user linda entered.
I The value 1 in the informix_tupleid column is a unique serial
identier that is assigned to the nonconforming row.
I The value I in the informix_optype column is a code that identies
the type of operation that has caused this nonconforming row to be
created. Specically, I stands for an insert operation.
I The value linda in the informix_recowner column identies the
user who issued the statement that caused this nonconforming row
to be created.
The INSERT statement that user linda issued on the cust_subset target table
also causes a diagnostic row to be added to the cust_subset_dia diagnostics
table. The new diagnostic row added to the diagnostics table has the
following column values.
This new diagnostic row in the cust_subset_dia diagnostics table has the
following characteristics:
I This row of the diagnostics table is linked to the corresponding row
of the violations table by means of the informix_tupleid column that
appears in both tables. The value 1 appears in this column in both
tables.
I The value C in the objtype column identies the type of integrity
violation that the corresponding row in the violations table caused.
Specically, the value C stands for a constraint violation.
informix_tupleid objtype objowner objname
1 C joe n104_7
1-514 Informi x Gui de to SQL: Syntax
SET
I The value joe in the objowner column identies the owner of the
constraint for which an integrity violation was detected.
I The value n104_7 in the objname column gives the name of the
constraint for which an integrity violation was detected.
By joining the violations and diagnostics tables, user joe (who owns the
cust_subset target table and its associated special tables) or the DBA can nd
out that the row in the violations table whose informix_tupleid value is 1
was created after an INSERT statement and that this row is violating a
constraint. The table owner or DBA can query the sysconstraints system
catalog table to determine that this constraint is a not null constraint. Now
that the reason for the failure of the INSERT statement is known, user joe or
the DBA can take corrective action.
Multiple Diagnostic Rows for One Violations Row
In the preceding example, only one row in the diagnostics table corresponds
to the new row in the violations table. However, more than one diagnostic
row can be added to the diagnostics table when a single new row is added to
the violations table. For example, if the ssn value (973824499) that user linda
entered in the INSERT statement had been the same as an existing value in the
ssn column of the cust_subset target table, only one new row would appear
in the violations table, but the following two diagnostic rows would be
present in the cust_subset_dia diagnostics table.
Both rows in the diagnostics table correspond to the same row of the
violations table because both of these rows have the value 1 in the
informix_tupleid column. However, the rst diagnostic row identies the
constraint violation caused by the INSERT statement that user linda issued,
while the second diagnostic row identies the unique-index violation caused
by the same INSERT statement. In this second diagnostic row, the value I in
the objtype column stands for a unique-index violation, and the value
unq_ssn in the objname column gives the name of the index for which the
integrity violation was detected.
informix_tupleid objtype objowner objname
1 C joe n104_7
1 I joe unq_ssn
SQL Statements 1-515
SET
For information on when and how to start violations and diagnostics tables
for a target table, see Violations and Diagnostics Tables for Filtering Mode
on page 1-505. For further information on the structure of the violations and
diagnostics tables, see the START VIOLATIONS TABLE statement on
page 1-584.
Using Object Modes to Achieve Data Integrity
In addition to using object modes with data manipulation statements, you
can also use object modes when you add a new constraint or new unique
index to a target table. By selecting the correct object mode, you can add the
constraint or index to the target table easily even if existing rows in the target
table violate the new integrity specication.
You can add a new constraint or index easily by taking the following steps. If
you follow this procedure, you do not have to examine the entire target table
to identify rows that fail to satisfy the constraint or unique-index
requirement:
I Add the constraint or index in the enabled mode. If all existing rows
in the table satisfy the constraint or unique-index requirement, your
ALTER TABLE or CREATE INDEX statement executes successfully, and
you do not need to take any further steps. However, if any existing
rows in the table fail to satisfy the constraint or unique-index
requirement, your ALTER TABLE or CREATE INDEX statement returns
an error message, and you need to take the following steps.
I Add the constraint or index in the disabled mode. Issue the ALTER
TABLE statement again, and specify the DISABLED keyword in the
ADD CONSTRAINT or MODIFY clause; or issue the CREATE INDEX
statement again, and specify the DISABLED keyword.
I Start a violations and diagnostics table for the target table with the
START VIOLATIONS TABLE statement.
I Issue a SET statement to switch the object mode of the constraint or
index to the enabled mode. When you issue this statement, the
statement fails, and existing rows in the target table that violate the
constraint or the unique-index requirement are duplicated in the
violations table. The constraint or index remains disabled, and you
receive an integrity-violation error message.
1-516 Informi x Gui de to SQL: Syntax
SET
I Issue a SELECT statement on the violations table to retrieve the
nonconforming rows that were duplicated from the target table. You
might need to join the violations and diagnostics tables to get all the
necessary information.
I Take corrective action on the rows in the target table that violate the
constraint.
I After you x all the nonconforming rows in the target table, issue the
SET statement again to switch the disabled constraint or index to the
enabled mode. This time the constraint or index is enabled, and no
integrity-violation error message is returned because all rows in the
target table now satisfy the new constraint or unique-index
requirement.
Example of Using Object Modes to Achieve Data Integrity
The following example shows how to use object modes to add a constraint
and unique index to a target table easily. Assume that a user joe has created
a table named cust_subset, and this table consists of the following columns:
ssn (customers social security number), fname (customers rst name),
lname (customers last name), and city (city in which the customer lives).
Also assume that no constraints or unique indexes are dened on the
cust_subset table and that the fname column is the primary key. In addition,
assume that no violations and diagnostics tables currently exist for this target
table. Finally, assume that this table currently contains four rows with the
following column values.
ssn fname lname city
111763227 mark jackson sunnyvale
222781244 rhonda NULL palo alto
111763227 steve NULL san mateo
333992276 tammy jones san jose
SQL Statements 1-517
SET
Adding the Objects in the Enabled Mode
User joe, the owner of the cust_subset table, enters the following statements
to add a unique index on the ssn column and a not null constraint on the
lname column:
CREATE UNIQUE INDEX unq_ssn ON cust_subset (ssn) ENABLED;
ALTER TABLE cust_subset MODIFY (lname CHAR(15)
NOT NULL CONSTRAINT lname_notblank ENABLED);
Both of these statements fail because existing rows in the cust_subset table
violate the integrity specications. The row whose fname value is rhonda
violates the not null constraint on the lname column. The row whose fname
value is steve violates both the not null constraint on the lname column and
the unique-index requirement on the ssn column.
Adding the Objects in the Disabled Mode
To recover from the preceding errors, user joe reenters the CREATE INDEX
and ALTER TABLE statements and species the disabled mode in both state-
ments, as follows:
CREATE UNIQUE INDEX unq_ssn ON cust_subset (ssn) DISABLED;
ALTER TABLE cust_subset MODIFY (lname CHAR(15)
NOT NULL CONSTRAINT lname_notblank DISABLED);
Both of these statements execute successfully because the database server
does not enforce unique-index requirements or constraint specications
when these objects are disabled.
Starting a Violations and Diagnostics Table
Now that the new constraint and index are added for the cust_subset table,
user joe takes steps to nd out which existing rows in the cust_subset table
violate the constraint and the index.
First, user joe enters the following statement to start a violations and
diagnostics table for the cust_subset table:
START VIOLATIONS TABLE FOR cust_subset
Because user joe has not assigned names to the violations and diagnostics
tables in this statement, the tables are named cust_subset_vio and
cust_subset_dia by default.
1-518 Informi x Gui de to SQL: Syntax
SET
Using the SET Statement to Capture Violations
Now that violations and diagnostics tables exist for the target table, user joe
issues the following SET statement to switch the mode of the new index and
constraint from the disabled mode to the enabled mode:
SET CONSTRAINTS, INDEXES FOR cust_subset ENABLED
The result of this SET statement is that the existing rows in the cust_subset
table that violate the constraint and the unique-index requirement are copied
to the cust_subset_vio violations table, and diagnostic information about the
nonconforming rows is added to the cust_subset_dia diagnostics table. The
SET statement fails, and the constraint and index remain disabled.
The following table shows the contents of the cust_subset_vio violations
table after user joe issues the SET statement.
These two rows in the cust_subset_vio violations table have the following
characteristics:
I The row in the cust_subset target table whose fname value is rhonda
is duplicated to the cust_subset_vio violations table because this
row violates the not null constraint on the lname column.
I The row in the cust_subset target table whose fname value is steve
is duplicated to the cust_subset_vio violations table because this
row violates the not null constraint on the lname column and the
unique-index requirement on the ssn column.
I The value 1 in the informix_tupleid column for the rst row and the
value 2 in the informix_tupleid column for the second row are
unique serial identiers assigned to the nonconforming rows.
ssn fname lname city informix_tupleid informix_optype informix_recowner
222781244 rhonda NULL palo alto 1 S joe
111763227 steve NULL san mateo 2 S joe
SQL Statements 1-519
SET
I The value S in the informix_optype column for each row is a code
that identies the type of operation that has caused this noncon-
forming row to be placed in the violations table. Specically, the S
stands for a SET statement.
I The value joe in the informix_recowner column for each row
identies the user who issued the statement that caused this noncon-
forming row to be placed in the violations table.
The following table shows contents of the cust_subset_dia diagnostics table
after user joe issues the SET statement.
These three rows in the cust_subset_dia diagnostics table have the following
characteristics:
I Each row in the diagnostics table and the corresponding row in the
violations table are joined by the informix_tupleid column that
appears in both tables.
I The rst row in the diagnostics table has an informix_tupleid value
of 1. It is joined to the row in the violations table whose
informix_tupleid value is 1. The value C in the objtype column for
this diagnostic row identies the type of integrity violation that was
caused by the corresponding row in the violations table. Specically,
the value C stands for a constraint violation. The value
lname_notblank in the objname column for this diagnostic row
gives the name of the constraint for which an integrity violation was
detected.
informix_tupleid objtype objowner objname
1 C joe lname_notblank
2 C joe lname_notblank
2 I joe unq_ssn
1-520 Informi x Gui de to SQL: Syntax
SET
I The second row in the diagnostics table has an informix_tupleid
value of 2. It is joined to the row in the violations table whose
informix_tupleid value is 2. The value C in the objtype column for
this second diagnostic row indicates that a constraint violation was
caused by the corresponding row in the violations table. The value
lname_notblank in the objname column for this diagnostic row
gives the name of the constraint for which an integrity violation was
detected.
I The third row in the diagnostics table has an informix_tupleid value
of 2. It is also joined to the row in the violations table whose
informix_tupleid value is 2. The value I in the objtype column for
this third diagnostic row indicates that a unique-index violation was
caused by the corresponding row in the violations table. The value
unq_ssn in the objname column for this diagnostic row gives the
name of the index for which an integrity violation was detected.
I The value joe in the objowner column of all three diagnostic rows
identies the owner of the object for which an integrity violation was
detected. The name of user joe appears in all three rows because he
created the constraint and index on the cust_subset table.
Identifying Nonconforming Rows to Obtain Information
To determine the contents of the violations table, user joe enters a SELECT
statement to retrieve all rows from the table. Then, to obtain complete
diagnostic information about the nonconforming rows, user joe joins the
violations and diagnostics tables by means of another SELECT statement.
User joe can perform these operations either interactively or through a
program.
Taking Corrective Action on the Nonconforming Rows
After the user joe identies the nonconforming rows in the cust_subset table,
he can correct them. For example, he can enter UPDATE statements on the
cust_subset table either interactively or through a program.
SQL Statements 1-521
SET
Enabling the Disabled Objects
Once all the nonconforming rows in the cust_subset table are corrected, user
joe issues the following SET statement to set the new constraint and index to
the enabled mode:
SET CONSTRAINTS, INDEXES FOR cust_subset ENABLED
This time the SET statement executes successfully. The new constraint and
new unique index are enabled, and no error message is returned to user joe
because all rows in the cust_subset table now satisfy the new constraint
specication and unique-index requirement.
Benets of Object Modes
The preceding examples show how object modes work when users execute
data manipulation statements on target tables or add new constraints and
indexes to target tables. The preceding examples suggest some of the benets
of the different object modes. The following sections state these benets
explicitly.
Benets of Disabled Mode
The benets of the disabled mode are as follows:
I You can use the disabled mode to insert many rows quickly into a
target table. Especially during load operations, updates of the
existing indexes and enforcement of referential constraints make up
a big part of the total cost of the operation. By disabling the indexes
and referential constraints during the load operation, you improve
the performance and efciency of the load.
1-522 Informi x Gui de to SQL: Syntax
SET
I To add a new constraint or new unique index to an existing table, you
can add the object even if some rows in the table do not satisfy the
new integrity specication. If the constraint or index is added to the
table in disabled mode, your ALTER TABLE or CREATE INDEX
statement does not fail no matter how many existing rows violate the
new integrity requirement.
If a violations table has been started, a SET statement that switches
the disabled objects to the enabled or ltering mode fails, but it
causes the nonconforming rows in the target table to be duplicated
in the violations table so that you can identify the rows and take
corrective action. After you x the nonconforming rows in the target
table, you can reissue the SET statement to switch the disabled objects
to the enabled or ltering mode.
Benets of Enabled Mode
The enabled mode is the default object mode for all database objects. We can
summarize the benets of this mode for each type of database object as
follows:
I The benet of enabled mode for constraints is that the database
server enforces the constraint and thus ensures the consistency of the
data in the database.
I The benet of enabled mode for indexes is that the database server
updates the index after insert, delete, and update operations. Thus
the index is up to date and is used by the optimizer during database
queries.
I The benet of enabled mode for triggers is that the trigger event
always sets the triggered action in motion. Thus the purpose of the
trigger is always realized during actual data-manipulation
operations.
SQL Statements 1-523
SET
Benets of Filtering Mode
The benets of setting a constraint or unique index to the ltering mode are
as follows:
I During load operations, inserts that violate a ltering mode
constraint or unique index do not cause the load operation to fail.
Instead, the database server lters the bad rows to the violations
table and continues the load operation.
I When an INSERT, DELETE, or UPDATE statement that affects multiple
rows causes a ltering mode constraint or unique index to be
violated for a particular row or rows, the statement does not fail.
Instead, the database server lters the bad row or rows to the viola-
tions table and continues to execute the statement.
I When any INSERT, DELETE, or UPDATE statement violates a ltering
mode constraint or unique index, the user can identify the failed row
or rows and take corrective action. The violations and diagnostics
tables capture the necessary information, and users can take
corrective action after they analyze this information.
Transaction-Mode Format
Element Purpose Restrictions Syntax
constraint name The name of the constraint
whose transaction mode is to be
changed, or a list of constraint
names. There is no default value.
The specied constraint must
exist in an OnLine database with
logging. You cannot change the
transaction mode of a constraint
to deferred mode unless the
constraint is currently in the
enabled mode. All constraints in
a list of constraints must exist in
the same database.
Identier, p. 1-723
DEFERRED
IMMEDIATE CONSTRAINTS
,
constraint
name
Transaction-Mode Format
ALL
1-524 Informi x Gui de to SQL: Syntax
SET
You can use the transaction-mode format of the SET statement to set the
transaction mode of constraints.
You use the IMMEDIATE keyword to set the transaction mode of constraints
to statement-level checking. You use the DEFERRED keyword to set the trans-
action mode to transaction-level checking.
You can set the transaction mode of constraints only in an OnLine database
with logging.
Statement-Level Checking
When you set the transaction mode to immediate, statement-level checking
is turned on, and all specied constraints are checked at the end of each
INSERT, UPDATE, or DELETE statement. If a constraint violation occurs, the
statement is not executed. Immediate is the default transaction mode of
constraints.
Transaction-Level Checking
When you set the transaction mode of constraints to deferred, statement-
level checking is turned off, and all specied constraints are not checked until
the transaction is committed. If a constraint violation occurs while the
transaction is being committed, the transaction is rolled back.
Tip: If you defer checking a primary-key constraint, the checking of the not null
constraint for that column or set of columns is also deferred.
Duration of Transaction Modes
The duration of the transaction mode that the SET statement species is the
transaction in which the SET statement is executed. You cannot execute this
form of the SET statement outside a transaction. Once a COMMIT WORK or
ROLLBACK WORK statement is successfully completed, the transaction mode
of all constraints reverts to IMMEDIATE.
SQL Statements 1-525
SET
Switching Transaction Modes
To switch from transaction-level checking to statement-level checking, you
can use the SET statement to set the transaction mode to immediate, or you
can use a COMMIT WORK or ROLLBACK WORK statement in your transaction.
Specifying All Constraints or a List of Constraints
You can specify all constraints in the database in your SET statement, or you
can specify a single constraint or list of constraints.
Specifying All Constraints
If you specify the ALL keyword, the SET statement sets the transaction mode
for all constraints in the database. If any statement in the transaction requires
that any constraint on any table in the database be checked, the database
server performs the checks at the statement level or the transaction level,
depending on the setting that you specify in the SET statement.
Specifying a List of Constraints
If you specify a single constraint name or a list of constraints, the SET
statement sets the transaction mode for the specied constraints only. If any
statement in the transaction requires checking of a constraint that you did not
specify in the SET statement, that constraint is checked at the statement level
regardless of the setting that you specied in the SET statement for other
constraints.
When you specify a list of constraints, the constraints do not have to be
dened on the same table, but they must exist in the same database.
Specifying Remote Constraints
You can set the transaction mode of local constraints or remote constraints.
That is, the constraints that are specied in the transaction-mode form of the
SET statement can be constraints that are dened on local tables or constraints
that are dened on remote tables.
1-526 Informi x Gui de to SQL: Syntax
SET
Examples of Setting the Transaction Mode for Constraints
The following example shows how to defer checking constraints within a
transaction until the transaction is complete. The SET CONSTRAINTS
statement in the example species that any constraints on any tables in the
database are not checked until the COMMIT WORK statement is encountered.
BEGIN WORK
SET CONSTRAINTS ALL DEFERRED
.
.
.
COMMIT WORK
The following example species that a list of constraints is not checked until
the transaction is complete:
BEGIN WORK
SET CONSTRAINTS update_const, insert_const DEFERRED
.
.
.
COMMIT WORK
References
See the START VIOLATIONS TABLE and STOP VIOLATIONS TABLE statements
in this manual.
For information on the system catalog tables associated with the SET
statement, see the sysobjstate and sysviolations tables in the Informix Guide
to SQL: Reference.
SQL Statements 1-527
SET CONNECTION
SET CONNECTION
The SET CONNECTION statement reestablishes a connection between an
application and a database environment and makes the connection current.
You can also use the SET CONNECTION statement with the DORMANT option
to put the current connection in a dormant state.
Syntax
Element Purpose Restrictions Syntax
connection
name
Quoted string that identies the
connection name that you
assigned to a specic
connection. It is the connection
name assigned by the CONNECT
statement when the initial
connection was made.
The database must already exist.
If you use the SET CONNECTION
statement with the DORMANT
option, connection name must
represent the current
connection. If you use the SET
CONNECTION statement
without the DORMANT option,
connection name must represent a
dormant connection.
Quoted String,
p. 1-757
conn_nm
variable
Host variable that contains the
value of connection name
Variable must be the character
data type.
Variable name must
conform to
language-specic
rules for variable
names.
'connection name' SET CONNECTION ESQL
conn_nm variable
+
DEFAULT
Database
Environment
p. 1-94
CURRENT
DORMANT
+
+
+
E/C
E/C
DORMANT
1-528 Informi x Gui de to SQL: Syntax
SET CONNECTION
Usage
You can use the SET CONNECTION statement to change the state of a
connection in the following ways:
I Make a dormant connection current
For information on using SET CONNECTION to make a dormant
connection current, see Making a Dormant Connection the Current
Connection below.
I Make the current connection dormant
For information on using SET CONNECTION to make the current
connection dormant, see Making a Current Connection Dormant
on page 1-529.
Making a Dormant Connection the Current Connection
The SET CONNECTION statement, with no DORMANT option, makes the
specied dormant connection the current one. The connection that the appli-
cation species must be dormant. The connection that is current when the
statement executes becomes dormant. A dormant connection is a connection
that has been established but is not current.
The SET CONNECTION statement in the following example makes connection
con1 the current connection and makes con2 a dormant connection:
CONNECT TO 'stores7' AS 'con1'
...
CONNECT TO 'demo7' AS 'con2'
...
SET CONNECTION 'con1'
A dormant connection has a connection context associated with it. When an
application makes a dormant connection current, it reestablishes that
connection to a database environment and restores its connection context.
(For more information on connection context, see page 1-91.) Reestablishing
a connection is comparable to establishing the initial connection, except that
it typically avoids authenticating the users permissions again, and it saves
reallocating resources associated with the initial connection. For example, the
application does not need to reprepare any statements that have previously
been prepared in the connection nor does it need to redeclare any cursors.
SQL Statements 1-529
SET CONNECTION
Making a Current Connection Dormant
The SET CONNECTION statement with the DORMANT option makes the
specied current connection a dormant connection. For example, the
following SET CONNECTION statement makes connection con1 dormant:
SET CONNECTION 'con1' DORMANT
The SET CONNECTION statement with the DORMANT option generates an
error if you specify a connection that is already dormant. For example, if
connection con1 is current and connection con2 is dormant, the following
SET CONNECTION statement returns an error message:
SET CONNECTION 'con2' DORMANT
However, the following SET CONNECTION statement executes successfully:
SET CONNECTION 'con1' DORMANT
Dormant Connections in a Single-Threaded Environment
In a single-threaded application (an ESQL/C application that does not use
threads or an ESQL/COBOL application), the DORMANT option makes the
current connection dormant. The availability of the DORMANT option in
single-threaded applications makes single-threaded ESQL/C applications
upwardly compatible with thread-safe ESQL/C applications.
Dormant Connections in a Thread-Safe ESQL/C Environment
As in a single-threaded application, a thread-safe ESQL/C application (an
ESQL/C application that uses threads) can establish many connections to one
or more databases. However, in the single-threaded environment, only one
connection can be active while the program executes. In the thread-safe
environment, there can be many threads (concurrent pieces of work
performing particular tasks) in one ESQL/C application, and each thread can
have one active connection.
E/C
1-530 Informi x Gui de to SQL: Syntax
SET CONNECTION
An active connection is associated with a particular thread. Two threads
cannot share the same active connection. Once a thread makes an active
connection dormant, that connection is available to other threads. A dormant
connection is still established but is not currently associated with any thread.
For example, if the connection named con1 is active in the thread named
thread_1, the thread named thread_2 cannot make connection con1 its
active connection until thread_1 has made connection con1 dormant.
In a thread-safe ESQL/C application, the DORMANT option makes an active
connection dormant. Another thread can now use the connection by issuing
the SET CONNECTION statement without the DORMANT option.
The following code fragment from a thread-safe ESQL/C program shows
how a particular thread within a thread-safe application makes a connection
active, performs work on a table through this connection, and then makes the
connection dormant so that other threads can use the connection:
thread_2()
{ /* Make con2 an active connection */
EXEC SQL connect to 'db2' as 'con2';
/*Do insert on table t2 in db2*/
EXEC SQL insert into table t2 values(10);
/* make con2 available to other threads */
EXEC SQL set connection 'con2' dormant;
}
.
.
.
If a connection to a database environment is initiated with the WITH
CONCURRENT TRANSACTION clause of the CONNECT statement, an ongoing
transaction can used by any thread that subsequently connects to that
database environment. In addition, if an open cursor is associated with such
a connection, the cursor remains open when the connection is made dormant.
Threads within a thread-safe ESQL/C application can use the same cursor by
making the associated connection current even though only one thread can
use the connection at any given time.
For a detailed discussion of thread-safe ESQL/C applications and the use of
the SET CONNECTION statement in these applications, see Chapter 11 of the
INFORMIX-ESQL/C Programmers Manual.
SQL Statements 1-531
SET CONNECTION
Identifying the Connection
If the application did not use connection name in the initial CONNECT
statement, you must use a database environment (such as a database name
or a database pathname) as the connection name. For example, the following
SET CONNECTIONstatement uses a database environment for the connection
name because the CONNECT statement does not use connection name. For
information about quoted strings that contain a database environment , see
Database Environment on page 1-94.
CONNECT TO 'stores7'
...
CONNECT TO 'demo7'
...
SET CONNECTION 'stores7'
If a connection to a database server was assigned a connection name, however,
you must use the connection name to reconnect to the database server. An
error is returned if you use a database environment rather than the
connection name when a connection name exists.
The DEFAULT Option
Use the DEFAULT option to identify the default connection for a SET
CONNECTION statement. The default connection is one of the following
connections:
I An explicit default connection (a connection established with the
CONNECT TO DEFAULT statement)
I An implicit default connection (any connection made using the
DATABASE, CREATE DATABASE, or START DATABASE statements)
You can use SET CONNECTION without a DORMANT option to reestablish the
default connection or with the DORMANT option to make the default
connection dormant. See The DEFAULT Option on page 1-91 and The
Implicit Connection with DATABASE Statements on page 1-92 for more
information.
1-532 Informi x Gui de to SQL: Syntax
SET CONNECTION
The CURRENT Keyword
Use the CURRENT keyword with the DORMANT option of the SET
CONNECTION statement as a shorthand form of identifying the current
connection. The CURRENT keyword replaces the current connection name. If
the current connection is con1, the following two statements are equivalent:
SET CONNECTION 'con1' DORMANT;
SET CONNECTION CURRENT DORMANT;
When a Transaction is Active
When you issue a SET CONNECTION statement without the DORMANT
option, the SET CONNECTION statement implicitly puts the current
connection in the dormant state. When you issue a SET CONNECTION
statement (with the DORMANT option), the SET CONNECTION statement
explicitly puts the current connection in the dormant state. In either case, the
statement can fail if a connection that becomes dormant has an uncommitted
transaction.
If the connection that becomes dormant has an uncommitted transaction, the
following conditions apply:
I If the connection was established with the WITH CONCURRENT
TRANSACTION clause of the CONNECT statement, the SET
CONNECTION statement succeeds and puts the connection in a
dormant state.
I If the connection was established without the WITH CONCURRENT
TRANSACTION clause of the CONNECT statement, the SET
CONNECTION statement fails and cannot set the connection to a
dormant state and the transaction in the current connection
continues to be active. The statement generates an error and the
application must decide whether to commit or roll back the active
transaction.
SQL Statements 1-533
SET CONNECTION
When Current Connection Is to INFORMIX-OnLine Dynamic Server
Prior to Version 6. 0
If the current connection is to a version of the OnLine database server prior
to 6.0, the following conditions apply when a SET CONNECTION statement
with or without the DORMANT option executes:
I If the connection to be made dormant was established using the
WITH CONCURRENT TRANSACTION clause of the CONNECT
statement, the application can switch to a different connection.
I If the connection to be made dormant was established without the
WITH CONCURRENT TRANSACTION clause of the CONNECT
statement, the application cannot switch to a different connection; the
SET CONNECTION statement returns an error. The application must
use the CLOSE DATABASE statement to close the database and drop
the connection.
References
See the CONNECT, DISCONNECT, and DATABASE statements in this manual.
In the INFORMIX-ESQL/C Programmers Manual, see the discussions of the
SET CONNECTION statement and thread-safe applications.
1-534 Informi x Gui de to SQL: Syntax
SET DATASKIP
SET DATASKIP
The SET DATASKIP statement allows you to control whether OnLine skips a
dbspace that is unavailable (for example, due to a media failure) in the course
of processing a transaction.
Syntax
Usage
Use the SET DATASKIP statement to instruct the database server to skip a
dbspace that is unavailable during the course of processing a transaction.
You receive a warning if a dbspace is skipped. The warning ag
sqlca.sqlwarn.sqlwarn6 is set to W if a dbspace is skipped. For more infor-
mation about this topic, see the INFORMIX-ESQL/C Programmers Manual or
the INFORMIX-ESQL/COBOL Programmers Manual.
When you SET DATASKIP ON without specifying a dbspace, you are telling
the database server to skip any dbspaces in the fragmentation list that are
unavailable. You can use the onstat -d or -D utility to determine if a dbspace
is down.
When you SET DATASKIP ON dbspace, you are telling the database server to
skip the specied dbspace if it is unavailable.
Element Purpose Restrictions Syntax
dbspace The name of the skipped
dbspace
The dbspace must exist at the
time the statement is executed.
Identier, p. 1-723
SET DATASKIP ON
OFF
DEFAULT
OL
,
dbspace
+
ESQL
SQL Statements 1-535
SET DATASKIP
Use the SET DATASKIP OFF statement to turn off the dataskip feature.
When the setting is DEFAULT, the database server uses the setting for the
dataskip feature from the ONCONFIG le. The OnLine administrator can
change the setting of the dataskip feature at runtime. See the
INFORMIX-OnLine Dynamic Server Administrators Guide for more
information.
Under What Circumstances Is a Dbspace Skipped?
The database server skips a dbspace when SET DATASKIP is set to ON and the
dbspace is unavailable.
The database server cannot skip a dbspace under certain conditions. The
following list outlines those conditions:
I Referential constraint checking
When you want to delete a parent row, the child rows must also be
available for deletion. The child rows must exist in an available
fragment.
When you want to insert a new child table, the parent table must be
found in the available fragments.
I Updates
When you perform an update that moves a record from one
fragment to another, both fragments must be available.
I Inserts
When you try to insert records in a expression-based fragmentation
strategy and the dbspace is unavailable, an error is returned. When
you try to insert records in a round-robin fragment-based strategy,
and a dbspace is down, the database server inserts the rows into any
available dbspace. When no dbspace is available, an error is
returned.
1-536 Informi x Gui de to SQL: Syntax
SET DATASKIP
I Indexing
When you perform updates that affect the index, such as when you
insert or delete records, or when you update an indexed eld, the
index must be available.
When you try to create an index, the dbspace you want to use must
be available.
I Serial keys
The rst fragment is used to store the current serial-key value inter-
nally. This is not visible to you except when the rst fragment
becomes unavailable and a new serial key value is required, which
happens during insert statements.
References
For additional information about how to set the dataskip feature in the
ONCONFIG le and how to use the onspaces utility, see the
INFORMIX-OnLine Dynamic Server Administrators Guide.
SQL Statements 1-537
SET DEBUG FILE TO
SET DEBUG FILE TO
Use the SET DEBUG FILE TO statement to name the le that is to hold the run-
time trace output of a stored procedure.
Syntax
Element Purpose Restrictions Syntax
character
expression
An expression that evaluates to a
lename
The lename that is derived
from the expression must be
usable. The same restrictions
apply to the derived lename as
to the lename parameter.
Expression, p. 1-671
lename A quoted string that identies
the pathname and lename of
the le that contains the output
of the TRACE statement. See
Location of the Output File on
page 1-539 for information on
the default actions that are taken
if you omit the pathname.
You can specify a new or existing
le. If you specify an existing
le, you must include the WITH
APPEND keywords if you want
to preserve the current contents
of the le intact. See Using the
WITH APPEND Option on
page 1-538 for further
information.
Quoted String,
p. 1-757. The
pathname and
lename must
conform to the
conventions of your
operating system.
variable name A host variable that holds the
value of lename
The host variable must be a
character data type.
The name of the host
variable must
conform to
language-specic
rules for variable
names.
lename '
+
SET DEBUG FILE TO '
WITH APPEND variable name
character
expression
1-538 Informi x Gui de to SQL: Syntax
SET DEBUG FILE TO
Usage
This statement indicates that the output of the TRACE statement in the stored
procedure goes to the le that lename indicates. Each time the TRACE
statement is executed, the trace data is added to this output le.
Using the WITH APPEND Option
The output le that you specify in the SET DEBUG TO le statement can be a
new le or existing le.
If you specify an existing le, the current contents of the le are purged when
you issue the SET DEBUG TO FILE statement. The rst execution of a TRACE
command sends trace output to the beginning of the le.
However, if you include the WITH APPEND option, the current contents of the
le are preserved when you issue the SET DEBUG TO FILE statement. The rst
execution of a TRACE command adds trace output to the end of the le.
If you specify a new le in the SET DEBUG TO FILE statement, it makes no
difference whether you include the WITH APPEND option. The rst execution
of a TRACE command sends trace output to the beginning of the new le
whether you include or omit the WITH APPEND option.
Closing the Output File
To close the le that the SET DEBUG FILE TO statement opened, issue another
SET DEBUG FILE TO statement with another lename. You can then edit the
contents of the rst le.
Redirecting Trace Output
You can use the SET DEBUG FILE TO statement outside a procedure to direct
the trace output of the procedure to a le. You also can use this statement
inside a procedure to redirect its own output.
SQL Statements 1-539
SET DEBUG FILE TO
Location of the Output File
If you invoke a SET DEBUG FILE TO statement with a simple lename on a
local database, the output le is located in your current directory. If your
current database is on a remote database server, the output le is located in
your home directory on the remote database server. If you provide a full
pathname for the debug le, the le is placed in the directory and le that you
specify on the remote database server. If you do not have write permissions
in the directory, you get an error.
Example of the SET DEBUG FILE TO Statement
The following example sends the output of the SET DEBUG FILE TO statement
to a le called debugging.out:
SET DEBUG FILE TO 'debugging' || '.out'
References
See the TRACE statement in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of stored procedures
in Chapter 12.
1-540 Informi x Gui de to SQL: Syntax
SET DESCRIPTOR
SET DESCRIPTOR
Use the SET DESCRIPTOR statement to assign values to a system-descriptor
area.
Syntax
value
ESQL
'descriptor'
item
number
SET DESCRIPTOR
descriptor
variable ,
item
number
variable
VALUE
COUNT =
Item
Descriptor
Information
Item
Descriptor
Information
count
variable
literal integer
=
TYPE
LENGTH
PRECISION
SCALE
NULLABLE
INDICATOR
ITYPE
IDATA
ILENGTH
NAME
=
Literal Number
p. 1-752
Literal INTERVAL
p. 1-749
Literal DATETIME
p. 1-746
Quoted String
p. 1-757
data variable
integer-host
variable
DATA
+
SQL Statements 1-541
SET DESCRIPTOR
Element Purpose Restrictions Syntax
count variable A host variable that holds a
literal integer. This integer
species how many items are
actually described in the system-
descriptor area.
See restriction for value in this
table.
The name of the host
variable must
conform to
language-specic
rules for variable
names.
data variable A host variable that contains the
information for the specied
eld (DATA, IDATA, or NAME) in
the specied item descriptor
The information that is
contained indata variable must be
appropriate for the specied
eld.
The name of the host
variable must
conform to
language-specic
rules for variable
names.
descriptor A string that identies the
system-descriptor area to which
values will be assigned
The system-descriptor area must
have been previously allocated
with the ALLOCATE
DESCRIPTOR statement.
Quoted String,
p. 1-757
descriptor
variable
A host variable that holds the
value of descriptor
The same restrictions apply to
descriptor variable as apply to
descriptor.
The name of the host
variable must
conform to
language-specic
rules for variable
names.
integer host
variable
The name of a host variable that
contains the value of literal
integer
The same restrictions apply to
integer host variable as apply to
literal integer.
The name of the host
variable must
conform to
language-specic
rules for variable
names.
item number An unsigned integer that
species one of the occurrences
(item descriptors) in the system-
descriptor area
The value of item number must be
greater than 0 and less than (or
equal to) the number of occur-
rences that were specied when
the system-descriptor area was
allocated with the ALLOCATE
DESCRIPTOR statement.
Literal Number,
p. 1-752
(1 of 2)
1-542 Informi x Gui de to SQL: Syntax
SET DESCRIPTOR
Usage
Use the SET DESCRIPTOR statement to assign values to a system-descriptor
area in the following instances:
I To set the COUNT eld of a system-descriptor area to match the
number of items for which you are providing descriptions in the
system-descriptor area (typically the items are in a WHERE clause)
I To set the item descriptor elds for each value for which you are
providing descriptions in the system-descriptor area (typically the
items are in a WHERE clause)
item number
variable
The name of an integer host
variable that holds the value of
item number
The same restrictions apply to
item number variable as apply to
item number.
The name of the host
variable must
conform to
language-specic
rules for variable
names.
literal integer A positive, nonzero integer that
assigns a value to the specied
eld in the specied item
descriptor. The specied eld
must be one of the following
keywords: TYPE, LENGTH,
PRECISION, SCALE, NULLABLE,
INDICATOR, ITYPE, or ILENGTH.
The restrictions that apply to
literal integer vary with the eld
type you specify in the VALUE
option (TYPE, LENGTH, and so
on). For information on the
codes that are allowed for the
TYPE eld and their meaning,
see Setting the TYPE Field on
page 1-544. For the restrictions
that apply to other eld types,
see the individual headings for
eld types under VALUE
Option on page 1-543.
Literal Number,
p. 1-752
value A literal integer that species
how many items are actually
described in the system-
descriptor area
The integer that value species
must be greater than 0 and less
than (or equal to) the number of
occurrences that were specied
when the system-descriptor area
was allocated with the
ALLOCATE DESCRIPTOR
statement.
Literal Number,
p. 1-752
Element Purpose Restrictions Syntax
(2 of 2)
SQL Statements 1-543
SET DESCRIPTOR
I To modify the contents of an item-descriptor eld after you use the
DESCRIBE statement to ll the elds for a SELECT or an INSERT
statement
If an error occurs during the assignment to any identied system-descriptor
elds, the contents of all identied elds are set to 0 or null, depending on
the variable type.
COUNT Option
Use the COUNT option to set the number of items that are to be used in the
system-descriptor area.
If you allocate a system-descriptor area with more items than you are using,
you need to set the COUNT eld to the number of items that you are actually
using. The following example shows the sequence of statements in
INFORMIX-ESQL/C that can be used in a program:
EXEC SQL BEGIN DECLARE SECTION;
int count;
EXEC SQL END DECLARE SECTION;
EXEC SQL allocate descriptor 'desc_100'; /*allocates for 100 items*/
count = 2;
EXEC SQL set descriptor 'desc_100' count = :count;
VALUE Option
Use the VALUE option to assign values from host variables into elds for a
particular item in a system-descriptor area. You can assign values for items
for which you are providing a description (such as parameters in a WHERE
clause), or you can modify values for items that the database server described
during a DESCRIBE statement.
1-544 Informi x Gui de to SQL: Syntax
SET DESCRIPTOR
Setting the TYPE Field
Use the following codes to set the value of TYPE for each item.
For code that is easier to maintain, use the predened constants for these SQL
data types instead of their actual integer value. These constants are dened
in the sqltypes.h header le.
The following example shows how you can set the TYPE eld in ESQL/C:
main()
{
EXEC SQL BEGIN DECLARE SECTION;
int itemno, type;
EXEC SQL END DECLARE SECTION;
...
EXEC SQL allocate descriptor 'desc1' with max 5;
...
EXEC SQL set descriptor 'desc1' value 2 type = 5;
type = 2; itemno = 3;
EXEC SQL set descriptor 'desc1' value :itemno type = :type;
}
SQL Data Type Integer Value
CHAR 0
SMALLINT 1
INTEGER 2
FLOAT 3
SMALLFLOAT 4
DECIMAL 5
SERIAL 6
DATE 7
MONEY 8
DATETIME 10
BYTE 11
TEXT 12
VARCHAR 13
INTERVAL 14
NCHAR 15
NVARCHAR 16
E/C
SQL Statements 1-545
SET DESCRIPTOR
Compiling Without the -xopen Option
If you do not compile using the -xopen option, the regular Informix <vk>SQL
code is assigned for TYPE. You must be careful not to mix normal andX/Open
modes because errors can result. For example, if a particular type is not
dened under X/Open mode but is dened under normal mode, executing a
SET DESCRIPTOR statement can result in an error.
Setting the TYPE Field in X/Open Programs
In X/Open mode, you must use the X/Open set of integer codes for the data
type in the TYPE eld. The following table shows the X/Open codes for data
types.
If you use the ILENGTH, IDATA, or ITYPE elds in a SET DESCRIPTOR
statement, a warning message appears. The warning indicates that these
elds are not standard X/Open elds for a system-descriptor area.
For code that is easier to maintain, use the predened constants for these
X/Open SQL data types instead of their actual integer value. These constants
are dened in the sqlxtype.h header le.
Setting the DATA Field
When you set the DATA eld, you must provide the appropriate type of data
(character string for CHAR or VARCHAR, integer for INTEGER, and so on).
When any value other than DATA is set, the value of DATA is undened. You
cannot set the DATA eld for an item without setting TYPE for that item. If
you set the TYPE eld for an item to a character type, you must also set the
LENGTH eld. If you do not set the LENGTH eld for a character item, you
receive an error.
SQL Data Type Integer Value
CHAR 1
SMALLINT 4
INTEGER 5
FLOAT 6
DECIMAL 3
X/O
E/C
1-546 Informi x Gui de to SQL: Syntax
SET DESCRIPTOR
Using LENGTH or ILENGTH
If your DATA or IDATA eld contains a character string, you must specify a
value for LENGTH. If you specify LENGTH=0, LENGTH sets automatically to
the maximum length of the string. The DATA or IDATA eld can contain a
368-literal character string or a character string derived from a character
variable of CHAR or VARCHAR data type. This provides a method to
determine the length of a string in the DATA or IDATA eld dynamically.
If a DESCRIBE statement precedes a SET DESCRIPTOR statement, LENGTH
automatically sets to the maximum length of the character eld that is
specied in your table.
This information is identical for ILENGTH.
Using DECIMAL or MONEY Data Types
If you set the TYPE eld for a DECIMAL or MONEY data type, and you want
to use a scale or precision other than the default values, set the SCALE and
PRECISION elds. You do not need to set the LENGTHeld for a DECIMAL
or MONEY item; the LENGTH eld is set accordingly from the SCALE and
PRECISION elds.
Using DATETIME or INTERVAL Data Types
If you set the TYPE eld for a DATETIME or INTERVAL value, you can set the
DATA eld as a literal DATETIME or INTERVAL or as a character string. If you
use a character string, you must set the LENGTH eld to the encoded qualier
value.
To determine the encoded qualiers for a DATETIME or INTERVAL character
string, use the datetime and interval macros in the datetime.h header le.
If you set DATA to a host variable of DATETIME or INTERVAL, you do not need
to set LENGTH explicitly to the encoded qualier integer.
To determine the encoded qualiers for a DATETIME or INTERVAL character
string, use the ECO-IQU routine.
E/C
E/CO
SQL Statements 1-547
SET DESCRIPTOR
Setting the INDICATOR Field
If you want to put a null value into the system-descriptor area, set the
INDICATOR eld to -1, and do not set the DATA eld.
If you set the INDICATOR eld to 0 to indicate that the data is not null, you
must set the DATA eld.
Setting the ITYPE Field
The ITYPE eld expects an integer constant that indicates the data type of
your indicator variable. Use the same set of constants as for the TYPE eld.
The constants are listed on page 1-544.
Modifying Values Set by the DESCRIBE Statement
You can use a DESCRIBE statement to modify the contents of a system-
descriptor area after it is set.
To determine the encoded qualiers for a DATETIME or INTERVAL character
string, use the ECO-IQU routine. See the INFORMIX-ESQL/COBOL
Programmers Manual for information on this routine.
After you use a DESCRIBE statement on SELECT or an INSERT statement, you
must check to determine whether the TYPE eld is set to either 11 or 12 to
indicate a TEXT or BYTE data type. If TYPE contains an 11 or a 12, you must
use the SET DESCRIPTOR statement to reset TYPE to 116, which indicates FILE
type.
References
See the ALLOCATE DESCRIPTOR, DEALLOCATE DESCRIPTOR, DECLARE,
DESCRIBE, EXECUTE, FETCH, GET DESCRIPTOR, OPEN, PREPARE, and PUT
statements in this manual for further information about using dynamic SQL
statements.
For further information about the system-descriptor area, see your SQL API
product manual.
E/CO
1-548 Informi x Gui de to SQL: Syntax
SET EXPLAIN
SET EXPLAIN
Use the SET EXPLAIN statement to obtain a measure of the work involved in
performing a query.
Syntax
Usage
The SET EXPLAIN statement executes during the database server
optimization phase, which occurs when you initiate a query. For queries that
are associated with a cursor, if the query is prepared and does not have host
variables, optimization occurs when you prepare it; otherwise, it occurs
when you open the cursor.
When you issue a SET EXPLAIN ON statement, the path that the optimizer
chooses for each subsequent query is written to the sqexplain.out le. The
SET EXPLAIN ON statement remains in effect until you issue a SET EXPLAIN
OFF statement or until the program ends. The owner name (for example,
owner.customer) qualies table names in the sqexplain.out le.
If the le already exists, subsequent output is appended to the le. If the
client application and the database server are on the same computer, the
sqexplain.out le is stored in your current directory.
When the current database is on another computer, the sqexplain.out le is
stored in your home directory on the remote host. If you do not have a home
directory on the remote host, the program stores sqexplain.out in the
directory from which the database server was started.
If you do not have write privileges to a directory, INFORMIX-SE generates an
error.
SET EXPLAIN
OFF
+
ON
SE
SQL Statements 1-549
SET EXPLAIN
SET EXPLAIN Output
The SET EXPLAIN output le contains a copy of the query, a plan of execution
that the database-server optimizer selects, and an estimate of the amount of
work. The optimizer selects a plan to provide the most efcient way to
perform the query, based on such things as the presence and type of indexes
and the number of rows in each table.
The optimizer uses an estimate to compare the cost of one path with another.
The estimated cost does not translate directly into time. However, when data
distributions are used, a query with a higher estimate generally takes longer
to run than one with a smaller estimate.
The estimated cost of the query is included in the SET EXPLAIN output. In the
case of a query and a subquery, two estimated cost gures are returned; the
query gure also contains the subquery cost. The subquery cost is shown
only so you can see the cost that is associated with the subquery.
In addition to the estimated cost, the output le contains the following
information:
I An estimate of the number of rows to be returned
I The order in which tables are accessed during execution
I The table column or columns that serve as a lter, if any, and whether
the ltering occurs through an index
I The method (access path) by which the executor reads each table.
The following list shows the possible methods.
Method Effect
SEQUENTIAL SCAN Reads rows in sequence
INDEX PATH Scans one or more indexes
AUTOINDEX PATH Creates a temporary index
SORT SCAN Sorts the result of the preceding join or table scan
MERGE JOIN Uses a sort/merge join instead of nested-loop join
REMOTE PATH Accesses another distributed database
HASH JOIN Uses a hash join
1-550 Informi x Gui de to SQL: Syntax
SET EXPLAIN
The optimizer chooses the best path of execution to produce the fastest
possible table join using a nested-loop join or sort-merge join wherever
appropriate.
The SORT SCAN section indicates that sorting the result of the preceding join
or table scan is necessary for a sort-merge join. It includes a list of the columns
that form the sort key. The order of the columns is the order of the sort. As
with indexes, the default order is ascending. Where possible, this ordering is
arranged to support any requested ORDER BY or GROUP BY clause. If the
ordering can be generated from a previous sort or an index lookup, the SORT
SCAN section does not appear.
The MERGE JOIN section indicates that a sort-merge join, instead of the
nested-loop join, is to be used on the preceding join/table pair. It includes a
list of the lters that control the sort-merge join and, where applicable, a list
of any other join lters. For example, a join of tables A and B with the lters
A.c1 = B.c1 and A.c2 < B.c2 lists the rst join under Merge Filters and
the second join under Other Join Filters.
The DYNAMIC HASH JOIN section indicates that a hash join is to be used on
the preceding join/table pair. It includes a list of the lters used to join the
tables together.
A dynamic hash join uses one of the tables to construct a hash index and adds
the index for the other table into the hash index. This is referred to as the build
phase. If DYNAMIC HASH JOIN is followed by the (Build Outer) in the output,
then the build phase is occurring on the rst table; otherwise it occurs on the
second table, preceding the DYNAMIC HASH JOIN. In the following example,
the build phase occurs on table username.a:
SELECT a.adatetime FROM manytypes a, alltypes b
WHERE a.adatetime = b.adate and a.along + 7 = b.along/3
Estimated Cost: 10
Estimated # of Rows Returned: 2
1) username.a: SEQUENTIAL SCAN
2) username.b: SEQUENTIAL SCAN
DYNAMIC HASH JOIN
Dynamic Hash Filters: username.a.adatetime =
username.b.adate and a.along + 7 = b.along/3
SQL Statements 1-551
SET EXPLAIN
When data distributions are not used, an INFORMIX-SE database server
generates fewer query-processing statistics than are available from an
OnLine database server. As a result, estimates for the cost and the number of
rows that are returned might be more precise if you use INFORMIX-OnLine
Dynamic Server than if you use INFORMIX-SE. Estimates returned for queries
that include joins tend to be highly inaccurate.
The following output examples represent what you might see when a SET
EXPLAIN ON statement is issued using INFORMIX-OnLine Dynamic Server.
The rst two examples contain two entries for a multiple-table query and
show the SORT SCAN and MERGE JOIN lines. Note that in both cases, if SORT
MERGE was not chosen, the second table would have been scanned using an
autoindex path. An autoindex path is an index constructed automatically at
execution time by the database server. It is removed when the query
completes.
QUERY:
-----------
select i.stock_num from items i, stock s, manufact m
where i.stock_num = s.stock_num
and i.manu_code = s.manu_code
and s.manu_code = m.manu_code
Estimated Cost: 52
Estimated # of Rows Returned: 130
1) rdtest.m: SEQUENTIAL SCAN
SORT SCAN: rdtest.m.manu_code
2) rdtest.s: SEQUENTIAL SCAN
SORT SCAN: rdtest.s.manu_code
MERGE JOIN:
Merge Filters: rdtest.m.manu_code = rdtest.s.manu_code
3) rdtest.i: INDEX PATH
(1) Index Keys: stock_num manu_code
Lower Index Filter: (rdtest.i.stock_num = rdtest.s.stock_num AND
rdtest.i.manu_code = rdtest.s.manu_code)
QUERY:
-----------
select stock.description from stock, stock2
where stock.description = stock2.description
and stock.unit_price < stock2.unit_price
Estimated Cost: 15
Estimated # of Rows Returned: 370
1) rdtest.stock: SEQUENTIAL SCAN
SE
1-552 Informi x Gui de to SQL: Syntax
SET EXPLAIN
SORT SCAN: rdtest.stock.description
2) rdtest.stock2: SEQUENTIAL SCAN
SORT SCAN: rdtest.stock2.description
MERGE JOIN
Merge Filters: rdtest.stock2.description = rdtest.stock.description
Other Join Filters: rdtest.stock.unit_price < rdtest.stock2.unit_price
The following example shows the SET EXPLAIN output for a simple query
and a complex query from the customer table:
QUERY:
-----------
SELECT fname, lname, company FROM customer
Estimated Cost: 3
Estimated # of Rows Returned: 28
1) joe.customer: SEQUENTIAL SCAN
QUERY:
------
SELECT fname, lname, company FROM customer
WHERE company MATCHES 'Sport*' AND customer_num BETWEEN 110 AND 115
ORDER BY lname;
Estimated Cost: 4
Estimated # of Rows Returned: 1
Temporary Files Required For: Order By
1) joe.customer: INDEX PATH
Filters: joe.customer.company MATCHES 'Sport*'
(1) Index Keys: customer_num
Lower Index Filter: joe.customer.customer_num >= 110
Upper Index Filter: joe.customer.customer_num <= 115
The following example shows the SET EXPLAIN output for a multiple-table
query:
QUERY:
-----------
SELECT * FROM customer, orders, items
WHERE customer.customer_num = orders.customer_num
AND orders.order_num = items.order_num
Estimated Cost: 20
Estimated # of Rows Returned: 69
1) joe.orders: SEQUENTIAL SCAN
2) joe.customer: INDEX PATH
(1) Index Keys: customer_num
SQL Statements 1-553
SET EXPLAIN
Lower Index Filter: joe.customer.customer_num = joe.orders.customer_num
3) joe.items: INDEX PATH
(1) Index Keys: order_num
Lower Index Filter: joe.items.order_num = joe.orders.order_num
SET EXPLAIN Output with Fragmentation and PDQ
When the table is fragmented, the output shows which table or index is
scanned. Fragments are identied with a fragment number. The fragment
numbers are the same as those contained in the dbspace column in the
sysfragments system catalog table. If the optimizer must scan all fragments
(that is, if it is unable to eliminate any fragment from consideration), the
optimizer indicates this with ALL. In addition, if the optimizer eliminates all
the fragments from consideration, that is, none of the fragments contain the
queried information, the optimizer indicates this with NONE. For infor-
mation on howOnLine eliminates a fragment from consideration, see the
INFORMIX-OnLine Dynamic Server Administrators Guide.
When PDQ is turned on, the output shows whether the optimizer used
parallel scans. If the optimizer used parallel scans, the output shows
PARALLEL; if PDQ is turned off, the output shows SERIAL. If PDQ is turned
on, the optimizer indicates the maximum number of threads that are required
to answer the query. The output shows # of Secondary Threads. This eld
indicates the number of threads that are required in addition to your user
session thread. The total number of threads necessary is the number of
secondary threads plus 1.
The output indicates when a hash join is used. The query is marked with
DYNAMIC HASH JOIN, and the table on which the hash is built is marked with
Build Outer.
The following example shows the SET EXPLAIN output for a table with
fragmentation and PDQ priority set to low:
select * from t1 where c1 > 20
Estimated Cost: 2
Estimated # of Rows Returned: 2
1) informix.t1: SEQUENTIAL SCAN (Parallel, fragments: 2)
Filters: informix.t1.c1 > 20
# of Secondary Threads = 1
1-554 Informi x Gui de to SQL: Syntax
SET EXPLAIN
The following example of SET EXPLAIN output shows a table with
fragmentation but without PDQ:
select * from t1 where c1 > 12
Estimated Cost: 3
Estimated # of Rows Returned: 2
1) informix.t1: SEQUENTIAL SCAN (Serial, fragments: 1, 2)
Filters: informix.t1.c1 > 12
The following example of SET EXPLAIN output shows a table with hash join
(fragmentation, and PDQ priority set to ON). The hash join is created when
you create an equality join between two tables that are not indexed.
QUERY:
------
select h1.c1, h2.c1 from h1, h2 where h1.c1=h2.c1
Estimated Cost: 2
Estimated # of Rows Returned: 5
1) informix.h1: SEQUENTIAL SCAN (Parallel, fragments: ALL)
2) informix.h2: SEQUENTIAL SCAN (Parallel, fragments: ALL)
DYNAMIC HASH JOIN (Build Outer)
Dynamic Hash Filters: informix.h1.c1 = informix.h2.c1
# of Secondary Threads = 6
The following example of SET EXPLAIN output shows a table with
fragmentation, with PDQ priority set to LOW, and an index that was selected
as the search method:
QUERY:
------
select * from t1 where c1 < 13
Estimated Cost: 2
Estimated # of Rows Returned: 1
1) informix.t1: INDEX PATH
(1) Index Keys: c1 (Parallel, fragments: ALL)
Upper Index Filter: informix.t1.c1 < 13
# of Secondary Threads = 3
SQL Statements 1-555
SET EXPLAIN
Using SET EXPLAIN With SET OPTIMIZATION
If you SET OPTIMIZATION to low, the output of SET EXPLAIN displays the
following uppercase string:
QUERY:{LOW}
If you SET OPTIMIZATION to high, the output of SET EXPLAIN displays the
following uppercase string:
QUERY:
Reference
In the INFORMIX-OnLine Dynamic Server Performance Guide, see the
discussion of SET EXPLAIN and the optimizer discussion.
1-556 Informi x Gui de to SQL: Syntax
SET ISOLATION
SET ISOLATION
Use the SET ISOLATION statement with the INFORMIX-OnLine Dynamic
Server database server to dene the degree of concurrency among processes
that attempt to access the same rows simultaneously.
The SET ISOLATION statement is an Informix extension to the ANSI SQL-92
standard. If you want to set isolation levels through an ANSI-compliant
statement, use the SET TRANSACTION statement instead. See the SET
TRANSACTION statement on page 1-575 for a comparison of these two
statements.
Syntax
Usage
The database isolation level affects read concurrency when rows are retrieved
from the database. INFORMIX-OnLine Dynamic Server uses shared locks to
support four levels of isolation among processes attempting to access data.
The update or delete process always acquires an exclusive lock on the row
that is being modied. The level of isolation does not interfere with rows that
you are updating or deleting. If another process attempts to update or delete
rows that you are reading with an isolation level of Repeatable Read, that
process will be denied access to those rows.
SET ISOLATION TO
DIRTY READ
COMMITTED READ
CURSOR STABILITY
REPEATABLE READ
OL
+
SQL Statements 1-557
SET ISOLATION
Cursors that are currently open when you execute the SET ISOLATION
statement might or might not use the new isolation level when rows are later
retrieved. The isolation level in effect could be any level that was set from the
time the cursor was opened until the time the application actually fetches a
row. The database server might have read rows into internal buffers and
internal temporary tables using the isolation level that was in effect at that
time. To ensure consistency and reproducible results, close open cursors
before you execute the SET ISOLATION statement.
Informix Isolation Levels
The following denitions explain the critical characteristics of each isolation
level, from the lowest level of isolation to the highest.
Isolation Level Characteristics
Dirty Read Provides zero isolation. Dirty Read is appropriate for static
tables that are used for queries. With a Dirty Read isolation
level, a query might return a phantomrow, which is an uncom-
mitted row that was inserted or modied within a transaction
that has subsequently rolled back. No other isolation level
allows access to a phantom row. Dirty Read is the only
isolation level available to databases that do not have
transactions.
Committed Read Guarantees that every retrieved row is committed in the table
at the time that the row is retrieved. Even so, no locks are
acquired. After one process retrieves a row because no lock is
held on the row, another process can acquire an exclusive lock
on the same row and modify or delete data in the row.
Committed Read is the default level of isolation in a database
with logging that is not ANSI compliant.
(1 of 2)
ESQL
1-558 Informi x Gui de to SQL: Syntax
SET ISOLATION
Default Isolation Levels
The default isolation level for a particular database is established when you
create the database according to database type. The following list describes
the default isolation level for each database type.
Cursor Stability Acquires a shared lock on the selected row. Another process
can also acquire a shared lock on the same row, but no process
can acquire an exclusive lock to modify data in the row. When
you fetch another row or close the cursor, INFORMIX-OnLine
Dynamic Server releases the shared lock.
If you set the isolation level to Cursor Stability, but you are not
using a transaction, the Cursor Stability isolation level acts
like the Committed Read isolation level. Locks are acquired
when the isolation level is set to Cursor Stability outside a
transaction, but they are released immediately at the end of
the statement that reads the row.
Repeatable Read Acquires a shared lock on every row that is selected during the
transaction. Another process can also acquire a shared lock on
a selected row, but no other process can modify any selected
row during your transaction. If you repeat the query during
the transaction, you reread the same information. The shared
locks are released only when the transaction commits or rolls
back. Repeatable Read is the default isolation level in an ANSI-
compliant database.
Isolation Level Database Type
Dirty Read Default level of isolation in a database without logging
Committed Read Default level of isolation in a database with logging that is not
ANSI compliant
Repeatable Read Default level of isolation in an ANSI-compliant database
Isolation Level Characteristics
(2 of 2)
SQL Statements 1-559
SET ISOLATION
The default level remains in effect until you issue a SET ISOLATIONstatement.
After a SET ISOLATION statement executes, the new isolation level remains in
effect until one of the following events occurs:
I You enter another SET ISOLATION statement.
I You open another database that has a default isolation level different
from the isolation level that your last SET ISOLATION statement
specied.
I The program ends.
Effects of Isolation Levels
You cannot set the database isolation level in a database that does not have
logging. Every retrieval in such a database occurs as a Dirty Read.
You can issue a SET ISOLATION statement from a client computer only after a
database has been opened.
The data obtained during blob retrieval can vary, depending on the database
isolation level. Under Dirty Read or Committed Read levels of isolation, a
process is permitted to read a blob that is either deleted (if the delete is not
yet committed) or in the process of being deleted. Under these isolation
levels, an application can read a deleted blob when certain conditions exist.
See the INFORMIX-OnLine Dynamic Server Administrators Guide for infor-
mation about these conditions.
When you use DB-Access, you see more lock conicts with higher levels of
isolation. For example, if you use Cursor Stability, you see more lock conicts
than if you use Committed Read.
If you use a scroll cursor in a transaction, you can force consistency between
your temporary table and the database table either by setting the isolation
level to Repeatable Read or by locking the entire table during the transaction.
If you use a scroll cursor with hold in a transaction, you cannot force consis-
tency between your temporary table and the database table. A table-level
lock or locks that are set by Repeatable Read are released when the
transaction is completed, but the scroll cursor with hold remains open
beyond the end of the transaction. You can modify released rows as soon as
the transaction ends, but the retrieved data in the temporary table might be
inconsistent with the actual data.
DB
ESQL
1-560 Informi x Gui de to SQL: Syntax
SET ISOLATION
References
See the CREATE DATABASE, SET LOCK MODE, and SET TRANSACTION
statements in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of isolation levels in
Chapter 7.
SQL Statements 1-561
SET LOCK MODE
SET LOCK MODE
Use the SET LOCK MODE statement to dene how the database server
handles a process that tries to access a locked row or table.
Syntax
Element Purpose Restrictions Syntax
seconds The maximum number of
seconds that a process waits for a
lock to be released. If the lock is
still held at the end of the
waiting period, the database
server ends the operation and
returns an error code to the
process.
In a networked environment, the
DBA establishes a default value
for the waiting period by using
the ONCONFIG parameter
DEADLOCK_TIMEOUT. See
WAIT Keyword on page 1-562
for an explanation of when the
seconds parameter overrides the
DEADLOCK_TIMEOUT
parameter.
Literal Number,
p. 1-752
SET LOCK MODE TO WAIT
seconds
+
OL
NOT WAIT
1-562 Informi x Gui de to SQL: Syntax
SET LOCK MODE
Usage
You can direct the response of the database server in the following ways
when a process tries to access a locked row or table.
INFORMIX-SE does not support the seconds parameter. If you decide that a
process should wait for a lock to release, you cannot limit the waiting period.
The SET LOCK MODE statement is available on computers that use kernel
locking. To determine whether your computer uses kernel locking, check the
directory that holds the database les. If the directory contains les with the
extension .lok, your system does not use kernel locking, and the SET LOCK
MODE statement is unavailable.
WAIT Keyword
The database server protects against the possibility of a deadlock when you
request the WAIT option. Before the database server suspends a process, it
checks whether suspending the process could create a deadlock. If the
database server discovers that a deadlock could occur, it ends the operation
(overruling your instruction to wait) and returns an error code. In the case of
either a suspected or actual deadlock, the database server returns an error.
Cautiously use the unlimited waiting period that was created when you
specify the WAIT option without seconds. If you do not specify an upper limit,
and the process that placed the lock somehow fails to release it, suspended
processes could wait indenitely. Because a true deadlock situation does not
exist, the database server does not take corrective action.
Lock Mode Effect
NOT WAIT Ends the operation immediately and returns an error code.
This condition is the default.
WAIT Suspends the process until the lock releases
WAIT seconds Suspends the process until the lock releases or until the end of
a waiting period, which is specied in seconds. If the lock
remains after the waiting period, it ends the operation and
returns an error code.
SE
SQL Statements 1-563
SET LOCK MODE
In a networked environment, the DBA uses the ONCONFIG parameter
DEADLOCK_TIMEOUT to establish a default value for seconds. If you use a SET
LOCK MODE statement to set an upper limit, your value applies only when
your waiting period is shorter than the system default. The number of
seconds that the process waits applies only if you acquire locks within the
current database server and a remote database server within the same
transaction.
References
See the LOCK TABLE, UNLOCK TABLE, SET ISOLATION, and SET
TRANSACTION statements in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of SET LOCK MODE
in Chapter 7.
1-564 Informi x Gui de to SQL: Syntax
SET LOG
SET LOG
Use the SET LOG statement to change your INFORMIX-OnLine Dynamic
Server database logging mode from buffered transaction logging to
unbuffered transaction logging or vice versa.
Syntax
Usage
You activate transaction logging when you create a database or add logging
to an existing database. These transaction logs can be buffered or unbuffered.
The default condition for transaction logs is unbuffered logging. As soon as
a transaction ends, the OnLine database server writes the transaction to the
disk. If a system failure occurs when you are using unbuffered logging, you
recover all completed transactions.
You gain a marginal increase in efciency with buffered logging, but you
incur some risk. In the event of a system failure, the OnLine database server
cannot recover the completed transactions that were buffered in memory.
The SET LOG statement changes the transaction-logging mode to unbuffered
logging; the SET BUFFERED LOG statement changes the mode to buffered
logging.
The SET LOG statement redenes the mode for the current session only. The
default mode, which the OnLine administrator sets using ON-Monitor,
remains unchanged.
SET
LOG
BUFFERED
OL
+
SQL Statements 1-565
SET LOG
The buffering option does not affect retrievals from external tables. For
distributed queries, a database with logging can retrieve only from databases
with logging, but it makes no difference whether the databases use buffered
or unbuffered logging.
An ANSI-compliant database cannot use buffered logs.
References
See the CREATE DATABASE and START DATABASE statements in this manual.
ANSI
1-566 Informi x Gui de to SQL: Syntax
SET OPTIMIZATION
SET OPTIMIZATION
Use the SET OPTIMIZATION statement to specify a high or low level of
database-server optimization.
Syntax
Usage
You can execute a SET OPTIMIZATION statement at any time. The
optimization level carries across databases but applies only within the
current database server.
After a SET OPTIMIZATION statement executes, the new optimization level
remains in effect until you enter another SET OPTIMIZATION statement or
until the program ends.
The default database server optimization level, HIGH, remains in effect until
you issue another SET OPTIMIZATION statement. The LOW option invokes a
less sophisticated, but faster, optimization algorithm.
The algorithm that a SET OPTIMIZATION HIGH statement invokes is a
sophisticated, cost-based strategy that examines all reasonable choices and
selects the best overall alternative. For large joins, this algorithm can incur
more overhead than desired. In extreme cases, you can run out of memory.
The alternative algorithm that a SET OPTIMIZATION LOW statement invokes
eliminates unlikely join strategies during the early stages, which reduces the
time and resources spent during optimization. However, when you specify a
low level of optimization, the optimal strategy might not be selected because
it was eliminated from consideration during early stages of the algorithm.
SET OPTIMIZATION
LOW
+
HIGH
SQL Statements 1-567
SET OPTIMIZATION
The following example shows optimization across a network. The central
database (on computer 1) is to have LOW optimization; the western database
(on computer 2) is to have HIGH optimization. If the western database were
on the same computer as central, it would have LOW optimization.
CONNECT TO 'central';
SET OPTIMIZATION low;
SELECT catalog.*, description, unit_price, unit,
unit_descr, manu_name, lead_time
FROM catalog, stock, manufact
WHERE catalog.stock_num = stock.stock_num
AND stock.manu_code = manufact.manu_code
AND catalog_num = 10025
CLOSE DATABASE;
CONNECT TO 'western@rockie';
SET OPTIMIZATION low;
SELECT catalog.*, description, unit_price, unit,
unit_descr, manu_name, lead_time
FROM catalog, stock, manufact
WHERE catalog.stock_num = stock.stock_num
AND stock.manu_code = manufact.manu_code
AND catalog_num = 10025
Optimizing Stored Procedures
For stored procedures that remain unchanged or change only slightly, you
might want to set the SET OPTIMIZATION statement to HIGH when you create
the procedure. This stores the best query plans for the procedure. Then SET
OPTIMIZATION to LOW before you execute the procedure. The procedure
then uses the optimal query plans and runs at the more cost-effective rate.
References
In the INFORMIX-OnLine Dynamic Server Performance Guide, see the
discussion of optimizing queries.
1-568 Informi x Gui de to SQL: Syntax
SET PDQPRIORITY
SET PDQPRIORITY
The SET PDQPRIORITY statement allows an application to set the query
priority level dynamically within an application.
Syntax
Usage
Priority set with the SET PDQPRIORITY statement overrides the environment
variable PDQPRIORITY. However, no matter what priority value you set with
the SET PDQPRIORITY statement, the ONCONFIG conguration parameter
MAX_PDQPRIORITY determines the actual priority value that the
INFORMIX-OnLine Dynamic Server uses for your queries.
For example, assume that the DBA has set the MAX_PDQPRIORITY parameter
to 50. A user enters the following SET PDQPRIORITY statement to set the
query priority level to 80.
SET PDQPRIORITY 80
Element Purpose Restrictions Syntax
percent-of-
resources
An integer value that species
the query priority level and the
amount of resources the
database server uses in order to
process the query
You must specify a value in the
following range: -1, 0, 1 to 100.
The values -1, 0, and 1 have
special meanings. See Meaning
of SET PDQPRIORITY Param-
eters on page 1-569 for an
explanation of these values.
Literal Number,
p. 1-752
SET PDQPRIORITY DEFAULT
OFF
HIGH
percent-of-resources
OL
+
LOW
SQL Statements 1-569
SET PDQPRIORITY
When it processes the users query, OnLine uses the value of the
MAX_PDQPRIORITY parameter to factor the query priority level set by the
user. OnLine silently processes the query with a priority level of 40. This
priority level represents 50 percent of the 80 percent of resources specied by
the user.
Meaning of SET PDQPRIORITY Parameters
The parameters that the SET PDQPRIORITY statement can use are shown in
the following table.
Parameter Meaning
DEFAULT Uses the value that is specied in the PDQPRIORITY environment
variable, if any. DEFAULT is the symbolic equivalent of -1.
LOW Signies that data is fetched from fragmented tables in parallel.
OnLine uses no other forms of parallelism. LOW is the symbolic
equivalent of 1.
OFF Indicates that PDQ is turned off. OnLine uses no parallelism. OFF is
the symbolic equivalent of 0. OFF is the default setting if you do not
specify the PDQPRIORITY environment variable or the SET
PDQPRIORITY statement.
HIGH Signies that the database server determines an appropriate value
to use for PDQPRIORITY. This decision is based on several things,
including the number of available processors, the fragmentation of
the tables being queried, the complexity of the query, and so on.
Informix reserves the right to change the performance behavior of
queries when HIGH is specied in future releases.
percent-of-
resources
Indicates a query priority level and indicates the percent of
resources a database server uses in order to answer the query.
Resources include the amount of memory and the number of
processors. The higher the number, the more resources the
database server uses. Although usually the more resources a
database server uses indicates better performance for a given
query, using too many resources can cause contention among the
resources and remove resources from other queries, which results
in degraded performance. Range = -1, 0, 1 to 100.
1-570 Informi x Gui de to SQL: Syntax
SET PDQPRIORITY
References
For information about the PDQPRIORITY environment variable, see the
Informix Guide to SQL: Reference. See the INFORMIX-OnLine Dynamic Server
Administrators Guide for information about the ONCONFIG parameter
MAX_PDQPRIORITY.
SQL Statements 1-571
SET ROLE
SET ROLE
Use the SET ROLE statement to enable the privileges of a role.
Syntax
Usage
Any user who is granted a role can enable the role using the SET ROLE
statement. A user can only enable one role at a time. If a user executes the SET
ROLE statement after a role is already set, the new role replaces the old role.
All users are, by default, assigned the role NULL or NONE (NULL and NONE
are synonymous). The roles NULL and NONE have no privileges. When you
set the role to NULL or NONE, you disable the current role.
When a user sets a role, the user gains the privileges of the role, in addition
to the privileges of PUBLIC and the users own privileges. If a role is granted
to another role, the user gains the privileges of both roles, in addition to those
of PUBLICand the users own privileges. After a SET ROLE statement executes
successfully, the role remains effective until the current database is closed or
the user executes another SET ROLE statement. Additionally, the user, not the
role, retains ownership of all the objects, such as tables, that were created
during a session.
A user cannot execute the SET ROLE statement while in a transaction. If the
SET ROLE statement is executed while a transaction is active, an error occurs.
Element Purpose Restrictions Syntax
role name Name of the role that you want
to enable
The role must have been created
with the CREATE ROLE
statement.
Identier, p. 1-723
SET ROLE role name
NULL
NONE
+
OL
1-572 Informi x Gui de to SQL: Syntax
SET ROLE
If the SET ROLE statement is executed as a part of a trigger or stored
procedure, and the owner of the trigger or stored procedure was granted the
role with the WITH GRANT OPTION, the role is enabled even if the user is not
granted the role.
The following example sets the role engineer:
SET ROLE engineer
The following example sets a role and then relinquishes the role after it
performs a SELECT operation:
EXEC SQL set role engineer;
EXEC SQL select fname, lname, project
into :efname, :elname, :eproject
where project_num > 100 and lname = 'Larkin';
printf ("%s is working on %s\n", efname, eproject);
EXEC SQL set role null;
References
See the CREATE ROLE, DROP ROLE, GRANT, and REVOKE statements in this
manual.
SQL Statements 1-573
SET SESSION AUTHORIZATION
SET SESSION AUTHORIZATION
The SET SESSION AUTHORIZATION statement lets you change the user name
under which database operations are performed in the current OnLine
session. This statement is enabled by the DBA privilege, which you must
obtain from the DBAbefore the start of your current session. The new identity
remains in effect in the current database until you execute another SET
SESSION AUTHORIZATION statement or until you close the current database.
Syntax
Usage
The SET SESSION AUTHORIZATION statement allows a user with the DBA
privilege to bypass the privileges that protect database objects. You can use
this statement to gain access to a table and adopt the identity of a table owner
to grant access privileges. You must obtain the DBAprivilege before you start
a session in which you use this statement. Otherwise, this statement returns
an error.
When you use this statement, the user name to which the authorization is set
must have the Connect privilege on the current database. Additionally, the
DBA cannot set the authorization to PUBLIC or to any dened role in the
current database.
Element Purpose Restrictions Syntax
' user ' The user name under which
database operations are to be
performed in the current session
You must specify a valid user
name. You must put quotation
marks around the user name.
Identier, p. 1-723
SET SESSION AUTHORIZATION TO ' user'
ESQL
OL
1-574 Informi x Gui de to SQL: Syntax
SET SESSION AUTHORIZATION
Setting a session to another user causes a change in a user name in the current
active database server. In other words, these users are, as far as this database
server process is concerned, completely dispossessed of any privileges that
they might have while accessing the database server through some adminis-
trative utility. Additionally, the new session user is not able to initiate an
administrative operation (execute a utility, for example) by virtue of the
acquired identity.
After the SET SESSION AUTHORIZATION statement successfully executes, the
user must use the SET ROLE statement to assume a role granted to the current
user. Any role enabled by a previous user is relinquished.
Using SET SESSION AUTHORIZATION to Obtain Privileges
You can use the SET SESSION AUTHORIZATION statement either to obtain
access to the data directly or to grant the database-level or table-level
privileges needed for the database operation to proceed. The following
example shows how to use the SET SESSION AUTHORIZATION statement to
obtain table-level privileges:
SET SESSION AUTHORIZATION TO 'cathl';
GRANT ALL ON spec TO mary;
SET SESSION AUTHORIZATION TO 'mary';
UPDATE case
SET col1 = SELECT state FROM zip
WHERE zip_code = 94433;
References
See the CONNECT, DATABASE, GRANT, and SET ROLE statements in this
manual.
SQL Statements 1-575
SET TRANSACTION
SET TRANSACTION
Use the SET TRANSACTIONstatement to dene isolation levels and to dene
the access mode of a transaction (read-only or read-write).
Syntax
Usage
You can use SET TRANSACTION only in databases with logging.
You can issue a SET TRANSACTION statement from a client computer only
after a database has been opened.
1
,
SET TRANSACTION READ WRITE
READ ONLY
READ COMMITTED ISOLATION LEVEL
REPEATABLE READ
,
READ UNCOMMITTED ISOLATION LEVEL
READ ONLY
1
1
1
SERIALIZABLE
OL
OL
1-576 Informi x Gui de to SQL: Syntax
SET TRANSACTION
The database isolation level affects concurrency among processes that
attempt to access the same rows simultaneously from the database.
INFORMIX-OnLine Dynamic Server uses shared locks to support four levels
of isolation among processes that are attempting to read data as the following
list shows:
I Read Uncommitted
I Read Committed
I (ANSI) Repeatable Read
I Serializable
The update or delete process always acquires an exclusive lock on the row
that is being modied. The level of isolation does not interfere with rows that
you are updating or deleting; however, the access mode does affect whether
you can update or delete rows. If another process attempts to update or
delete rows that you are reading with an isolation level of Serializable or
(ANSI) Repeatable Read, that process will be denied access to those rows.
Comparing SET TRANSACTION with SET ISOLATION
The SET TRANSACTION statement complies with ANSI SQL-92. This statement
is similar to the Informix SET ISOLATION statement; however, the SET
ISOLATION statement is not ANSI compliant and does not provide access
modes. In fact, the isolation levels that you can set with the SET
TRANSACTION statement are almost parallel to the isolation levels that you
can set with the SET ISOLATION statement, as the following table shows.
SET TRANSACTION Correlates to SET ISOLATION
Read Uncommitted Dirty Read
Read Committed Committed Read
Not supported Cursor Stability
(ANSI) Repeatable Read (Informix) Repeatable Read
Serializable (Informix) Repeatable Read
SQL Statements 1-577
SET TRANSACTION
Another difference between the SET TRANSACTION and SET ISOLATION
statements is the behavior of the isolation levels within transactions. The SET
TRANSACTION statement can be issued only once for a transaction. Any
cursors that are opened during that transaction are guaranteed to get that
isolation level (or access mode if you are dening an access mode). With the
SET ISOLATION statement, after a transaction is started, you can change the
isolation level more than once within the transaction. The following
examples show the SET ISOLATION and SET TRANSACTION statements,
respectively:
SET ISOLATION
EXEC SQL BEGIN WORK;
EXEC SQL SET ISOLATION TO DIRTY READ;
EXEC SQL SELECT ... ;
EXEC SQL SET ISOLATION TO REPEATABLE READ;
EXEC SQL INSERT ... ;
EXEC SQL COMMIT WORK;
-- Executes without error
SET TRANSACTION
EXEC SQL BEGIN WORK;
EXEC SQL SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
EXEC SQL SELECT ... ;
EXEC SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Error 876: Cannot issue SET TRANSACTION in an active
transaction.
1-578 Informi x Gui de to SQL: Syntax
SET TRANSACTION
Isolation Levels
The following denitions explain the critical characteristics of each isolation
level, from the lowest level of isolation to the highest.
Isolation Level Characteristics
Read Uncommitted Provides zero isolation. Read Uncommitted is appropriate
for static tables that are used for queries. With a Read
Uncommitted isolation level, a query might return a
phantom row, which is an uncommitted row that was
inserted or modied within a transaction that has subse-
quently rolled back. Read Uncommitted is the only
isolation level that is available to databases that do not
have transactions.
Read Committed Guarantees that every retrieved row is committed in the
table at the time that the row is retrieved. Even so, no locks
are acquired. After one process retrieves a row because no
lock is held on the row, another process can acquire an
exclusive lock on the same row and modify or delete data
in the row. Read Committed is the default isolation level in
a database with logging that is not ANSI compliant.
(ANSI) Repeatable
Read
The Informix implementation of ANSI Repeatable Read.
Informix uses the same approach to implement Repeatable
Read that it uses for Serializable. Thus Repeatable Read
meets the SQL-92 requirements.
Serializable Acquires a shared lock on every row that is selected during
the transaction. Another process can also acquire a shared
lock on a selected row, but no other process can modify any
selected row during your transaction. If you repeat the
query during the transaction, you reread the same infor-
mation. The shared locks are released only when the
transaction commits or rolls back. Serializable is the
default isolation level in an ANSI-compliant database.
SQL Statements 1-579
SET TRANSACTION
Default Isolation Levels
The default isolation level for a particular database is established according
to database type when you create the database. The default isolation level for
each database type is described in the following table.
The default isolation level remains in effect until you issue a SET
TRANSACTION statement within a transaction. After a COMMIT WORK
statement completes the transaction or a ROLLBACK WORK statement cancels
the transaction, the isolation level is reset to the default.
Access Modes
Both INFORMIX-OnLine Dynamic Server and INFORMIX-SE support access
modes. Access modes affect read and write concurrency for rows within
transactions. Use access modes to control data modication.
You can specify that a transaction is read-only or read-write through the SET
TRANSACTION statement. By default, transactions are read-write. When you
specify that a transaction is read-only, certain limitations apply. Read-only
transactions cannot perform the following actions:
I Insert, delete, or update table rows
I Create, alter, or drop any database object such as schemas, tables,
temporary tables, indexes, or stored procedures
I Grant or revoke privileges
I Update statistics
I Rename columns or tables
Informix ANSI Description
Dirty Read Read Uncommitted Default level of isolation in a
database without logging
Committed Read Read Committed Default level of isolation in a
database with logging that is not
ANSI compliant
Repeatable Read Serializable Default level of isolation in an ANSI-
compliant database
1-580 Informi x Gui de to SQL: Syntax
SET TRANSACTION
You can execute stored procedures in a read-only transaction as long as the
procedure does not try to perform any restricted statement.
Effects of Isolation Levels
You cannot set the database isolation level in a database that does not have
logging. Every retrieval in such a database occurs as a Read Uncommitted.
The data that is obtained during blob retrieval can vary, depending on the
database isolation levels. Under Read Uncommitted or Read Committed
isolation levels, a process is permitted to read a blob that is either deleted (if
the delete is not yet committed) or in the process of being deleted. Under
these isolation levels, an application can read a deleted blob when certain
conditions exist. See the INFORMIX-OnLine Dynamic Server Administrators
Guide for information about these conditions.
If you use a scroll cursor in a transaction, you can force consistency between
your temporary table and the database table either by setting the isolation
level to Serializable or by locking the entire table during the transaction.
If you use a scroll cursor with hold in a transaction, you cannot force
consistency between your temporary table and the database table. A table-
level lock or locks set by Serializable are released when the transaction is
completed, but the scroll cursor with hold remains open beyond the end of
the transaction. You can modify released rows as soon as the transaction
ends, so the retrieved data in the temporary table might be inconsistent with
the actual data.
References
See the CREATE DATABASE, SET ISOLATION, and SET LOCK MODE statements
in this manual.
In the Informix Guide to SQL: Tutorial, see the discussion of isolation levels and
concurrency issues in Chapter 7.
ESQL
SQL Statements 1-581
START DATABASE
START DATABASE
Use the START DATABASE statement with an INFORMIX-SE database server to
start recording transactions, to make a database ANSI compliant, to change
the name of an existing transaction-log le, or to remove logging on a
database.
Syntax
Usage
To use the START DATABASE statement, all the following conditions must be
true:
I You have the DBA privilege.
I No current database exists.
I The directory that is specied in pathname exists.
Element Purpose Restrictions Syntax
pathname The pathname and lename of
the transaction log le. The
default directory is the current
directory.
You cannot specify an existing
le in pathname. You must
specify an existing directory in
pathname. For maximum
protection, you should specify a
location for the transaction-log
le that is not on the same
storage device as the database.
The pathname and
lename must
conform to the
conventions of your
operating system.
START DATABASE
SE
Database
Name
p. 1-660
WITH LOG IN 'pathname'
WITH NO LOG
MODE ANSI
+
1-582 Informi x Gui de to SQL: Syntax
START DATABASE
Issue a CLOSE DATABASE statement before you create and start a transaction
log. The START DATABASE statement locks the database exclusively to
prevent access by other processes. If another process is using the database
(even if the database is only being read), the START DATABASE statement
fails.
The database remains locked after the START DATABASE statement executes.
When you are satised that the database is ready to use, execute the CLOSE
DATABASE statement to remove the exclusive lock. Reopen the database with
the DATABASE statement.
MODE ANSI Keyword
Use the MODE ANSI keyword to make a database ANSI compliant. An
ANSI-compliant database conforms to different transaction-processing and
object-naming conventions than does a database that is not ANSI compliant.
The following example starts an ANSI-compliant database that is named
stores7:
START DATABASE stores7
WITH LOG IN '/u/myname/stores7.log' MODE ANSI
If you are using a nondefault locale that contains a multibyte code set, you
must make sure that an SE database name meets the 10-byte size restriction.
For more information, see the discussion on naming databases in Chapter 5
of the Guide to GLS Functionality.
References
See the CREATE DATABASE and RENAME DATABASE statements in this
manual for information on naming databases.
ESQL
SE
ESQL
SE
SE
GLS
1-664 Informi x Gui de to SQL: Syntax
Data Type
Data Type
The Data Type segment species the data type of a column or value. Use the
Data Type segment whenever you see a reference to a data type in a syntax
diagram.
SQL Statements 1-665
Data Type
Syntax
INTERVAL Field Qualier p. 1-743
DATETIME Field Qualier p. 1-669
16
SERIAL
(1)
start
, 2
, scale
NCHAR
SMALLINT
CHAR
DATE
DATETIME
INTERVAL
SMALLFLOAT
DECIMAL
size
oat
precision
, scale
precision
CHARACTER
DEC
NUMERIC
FLOAT
INTEGER
INT
MONEY
REAL
( )
) (
( )
(1)
( )
16
precision
) (
INFORMIX-OnLine Dynamic Server-Specic Data Types p. 1-666
GLS
+
+
+
+
+
+
+
OL
DOUBLE PRECISION
1-666 Informi x Gui de to SQL: Syntax
Data Type
INFORMIX-OnLine Dynamic Server-Specic Data Types
Element Purpose Restrictions Syntax
blobspace Name of an existing blobspace The blobspace must exist. Identier, p. 1-723
family name Quoted string constant that
species a family name or
variable name in the optical
family
The family name or variable
name must exist.
Quoted String, p. 1-757
For additional information
about optical families, see
INFORMIX-OnLine/Opti
cal User Manual.
oat precision The oat precision is ignored. You must specify a positive
integer.
Literal Number, p. 1-752
max Maximum size of a
CHARACTER VARYING or
VARCHAR or NVARCHAR
column in bytes
You must specify an integer
value between 1 and 255
bytes inclusive. If you place
an index on the column, the
largest value you can
specify for max is 254 bytes.
Literal Number, p. 1-752
(1 of 2)
max
IN TABLE
NVARCHAR
TEXT
INFORMIX-OnLine Dynamic
Server-Specic
Data Types
family name
)
VARCHAR
reserve
blobspace
BYTE
+
+
+
+
GLS
,0
OP
,
(
max
( CHARACTER VARYING )
,
reserve
SQL Statements 1-667
Data Type
For more information, see the discussion of all data types in Chapter 3 of the
Informix Guide to SQL: Reference.
Fixed and Varying Length Data Types
The data type CHAR is for xed-length character data. Use the ANSI-
compliant CHARACTER VARYING data type to specify varying length
character data. You can also specify varying length data with the Informix
VARCHAR data type.
NCHAR and NVARCHAR Data Types
See Chapter 3 of the Guide to GLS Functionality for a discussion of the NCHAR
and NVARCHAR data types.
precision Total number of signicant
digits in a decimal or money
data type
You must specify an integer
between 1 and 32, inclusive.
Literal Number, p. 1-752
reserve Amount of space in bytes
reserved for a CHARACTER
VARYING or VARCHAR or
NVARCHAR column even if the
actual number of bytes stored
in the column is less than
reserve
You must specify an integer
value between 0 and 255
bytes. However, the value
you specify for reserve must
be less than the value you
specify for max.
Literal Number, p. 1-752
scale Number of digits to the right of
the decimal point
You must specify an integer
between 1 and precision.
Literal Number, p. 1-752
size Number of bytes in the CHAR
or NCHAR column.
For OnLine, you must
specify an integer value
between 1 and 32,767 bytes
inclusive.
For SE, you must specify an
integer value between1 and
32,511 bytes inclusive.
Literal Number, p. 1-752
start Starting number for values in a
SERIAL column
You must specify an integer
greater than 0 and less than
2,147,483,647.
Literal Number, p. 1-752
Element Purpose Restrictions Syntax
(2 of 2)
GLS
1-668 Informi x Gui de to SQL: Syntax
Data Type
References
In the Informix Guide to SQL: Reference, see the discussions of individual data
types in Chapter 3.
In the Informix Guide to SQL: Tutorial, see the discussion of data types in
Chapter 9.
In the Guide to GLS Functionality, see the discussion of the NCHAR and
NVARCHAR data types and the GLS aspects of other character data types.
SQL Statements 1-669
DATETIME Fi el d Qual i er
DATETIME Field Qualier
ADATETIME eld qualier species the largest and smallest unit of time in a
DATETIME column or value. Use the DATETIME Field Qualier segment
whenever you see a reference to a DATETIME eld qualier in a syntax
diagram.
Syntax
Element Purpose Restrictions Syntax
digit A single integer that species the
precision of a decimal fraction of
a second. The default precision is
3 digits (a thousandth of a
second).
You must specify an integer
between 1 and 5, inclusive.
Literal Number,
p. 1-752
(3)
YEAR
TO MONTH
TO DAY
TO HOUR
TO MINUTE
TO SECOND
TO FRACTION
FRACTION
SECOND
MINUTE
HOUR
DAY
MONTH TO YEAR
(digit)
1-670 Informi x Gui de to SQL: Syntax
DATETIME Fi el d Qual i er
Usage
Specify the largest unit for the rst DATETIME value; after the word TO,
specify the smallest unit for the value. The keywords imply that the
following values are used in the DATETIME object.
The following examples showDATETIME qualiers:
DAY TO MINUTE
YEAR TO MINUTE
DAY TO FRACTION(4)
MONTH TO MONTH
References
In the Informix Guide to SQL: Reference, see the DATETIME data type in
Chapter 3 for an explanation of the DATETIME eld qualier.
Unit of Time Meaning
YEAR Species a year, numbered fromA.D. 1 to 9999
MONTH Species a month, numbered from 1 to 12
DAY Species a day, numbered from 1 to 31, as appropriate to the
month in question
HOUR Species an hour, numbered from 0 (midnight) to 23
MINUTE Species a minute, numbered from 0 to 59
SECOND Species a second, numbered from 0 to 59
FRACTION Species a fraction of a second, with up to ve decimal places.
The default scale is three digits (thousandth of a second).
SQL Statements 1-671
Expressi on
Expression
An expression is one or more pieces of data that is contained in or derived
from the database or database server. Use the Expression segment whenever
you see a reference to an expression in a syntax diagram.
Syntax
Column
Expressions
p. 1-673
Constant
Expressions
p. 1-676
Function
Expressions
p. 1-683
Aggregate
Expressions
p. 1-709
Expression
-
+
*
/
| |
-
+
variable name
) (
Procedure Call
Expressions
p. 1-722
procedure variable name
SPL
1-672 Informi x Gui de to SQL: Syntax
Expressi on
Usage
To combine expressions, connect them with arithmetic operators for
addition, subtraction, multiplication, and division.
You cannot use an aggregate expression in a condition that is part of a WHERE
clause unless the aggregate expression is used within a subquery.
Concatenation Operator
You can use the concatenation operator (||) to concatenate two expressions.
For example, the following examples are some possible concatenated-
expressioncombinations. The rst example concatenates the zipcode column
to the rst three letters of the lname column. The second example
concatenates the sufx .dbg to the contents of a host variable called
le_variable. The third example concatenates the value returned by the
TODAY function to the string Date.
lname[1,3] || zipcode
:file_variable || '.dbg'
'Date:' || TODAY
Element Purpose Restrictions Syntax
procedure
variable name
The name of a variable that is
dened in a stored procedure.
The value stored in the variable
is one of the expression types
that is shown in the syntax
diagram.
The expression that is stored in
procedure variable name must
conform to the rules for expres-
sions of that type.
Identier, p. 1-723
variable name The name of a program variable
or host variable. The value
stored in the variable is one of
the expression types shown in
the syntax diagram.
The expression that is stored in
variable name must conform to
the rules for expressions of that
type.
The name of the
variable must
conform to
language-specic
rules for variable
names.
SQL Statements 1-673
Expressi on
You cannot use the concatenation operator in an embedded-language-only
statement. The SQL API-only statements appear in the following list.
Column Expressions
The possible syntax for column expressions is shown in the following
diagram.
ESQL
ALLOCATE DESCRIPTOR FETCH
CLOSE FLUSH
CONNECT TO FREE
DEALLOCATE DESCRIPTOR GET DESCRIPTOR
DECLARE OPEN
DESCRIBE PREPARE
DISCONNECT PUT
EXECUTE SET CONNECTION
EXECUTE IMMEDIATE SET DESCRIPTOR
[rst, last ]
Table
Name
p. 1-768
View
Name
p. 1-772
+
Synonym
Name
p. 1-766
.
.
.
alias ROWID
column
name
.
+
1-674 Informi x Gui de to SQL: Syntax
Expressi on
The following examples show column expressions:
company
items.price
cat_advert [1,15]
Use a table or alias name whenever it is necessary to distinguish between
columns that have the same name but are in different tables. The SELECT
statements that the following example shows use customer_num from the
customer and orders tables. The rst example precedes the column names
with table names. The second example precedes the column names with table
aliases.
SELECT * FROM customer, orders
WHERE customer.customer_num = orders.customer_num
SELECT * FROM customer c, orders o
WHERE c.customer_num = o.customer_num
Element Purpose Restrictions Syntax
alias A temporary alternative name
for a table or view within the
scope of a SELECT statement.
This alternative name is estab-
lished in the FROM clause of the
SELECT statement.
The restrictions depend on the
clause of the SELECT statement
in which alias occurs.
Identier, p. 1-723
column name The name of the column that you
are specifying
The restrictions depend on the
statement in which column name
occurs.
Identier, p. 1-723
rst The position of the rst character
in the portion of the column that
you are selecting
The column must be one of the
following types: BYTE, CHAR,
NCHAR, NVARCHAR, TEXT, or
VARCHAR.
Literal Number,
p. 1-752
last The position of the last character
in the portion of the column that
you are selecting
The column must be one of the
following types: BYTE, CHAR,
NCHAR, NVARCHAR, TEXT, or
VARCHAR.
Literal Number,
p. 1-752
SQL Statements 1-675
Expressi on
Using Subscripts on Character Columns
You can use subscripts on CHAR, VARCHAR, NCHAR, NVARCHAR, BYTE,
and TEXT columns. The subscripts indicate the starting and ending character
positions that are contained in the expression. Together the column
subscripts dene a column substring. The column substring is the portion of
the column that is contained in the expression.
For example, if a value in the lname column of the customer table is
Greenburg, the following expression evaluates to burg:
lname[6,9]
For information on the GLS aspects of column subscripts and substrings, see
the Guide to GLS Functionality, Chapter 3.
Using Rowids
You can use the rowid column that is associated with a table row as a
property of the row. The rowid column is essentially a hidden column in
nonfragmented tables and in fragmented tables that were created with the
WITH ROWIDS clause. The rowid column is unique for each row, but it is not
necessarily sequential. Informix recommends, however, that you utilize
primary keys as an access method rather than exploiting the rowid column.
The rowid column is sequential and starts at 1 for each table.
The following examples show possible uses of the ROWID keyword in a
SELECT statement:
SELECT *, ROWID FROM customer
SELECT fname, ROWID FROM customer
ORDER BY ROWID
SELECT HEX(rowid) FROM customer
WHERE customer_num = 106
In INFORMIX-OnLine Dynamic Server only, the last SELECT statement
example shows how to get the page number (the rst six digits after 0x) and
the slot number (the last two digits) of the location of your row.
You cannot use ROWID keyword in the select list of a query that contains an
aggregate function.
GLS
SE
1-676 Informi x Gui de to SQL: Syntax
Expressi on
Constant Expressions
The following diagram shows the possible syntax for constant expressions.
Quoted
String
p. 1-757
Literal
Number
p. 1-752
+
OL
+
SITENAME
DBSERVERNAME
TODAY
CURRENT
Literal
DATETIME
p. 1-746
Literal
INTERVAL
p. 1-749
USER
UNITS
datetime
unit
n
DATETIME
Field Qualier
p. 1-669
SQL Statements 1-677
Expressi on
The following examples show constant expressions:
DBSERVERNAME
TODAY
'His first name is'
CURRENT YEAR TO DAY
INTERVAL (4 10:05) DAY TO MINUTE
DATETIME (4 10:05) DAY TO MINUTE
5 UNITS YEAR
The following list provides references for further information:
I For quoted strings as expressions, see Quoted String as an Expres-
sion on page 1-678.
I For the USER function in an expression, see USER Function on
page 1-678.
I For the SITENAME and DBSERVERNAME functions in an expression,
refer to SITENAME and DBSERVERNAME Functions on
page 1-679.
I For literal numbers as expressions, see Literal Number as an
Expression on page 1-680.
I For the TODAY function in an expression, see TODAY Function on
page 1-680.
Element Purpose Restrictions Syntax
datetime unit One of the units that is used to
specify an interval precision;
that is, YEAR, MONTH, DAY,
HOUR, MINUTE, SECOND, or
FRACTION. If the unit is YEAR,
the expression is a year-month
interval; otherwise, the
expression is a day-time interval.
The datetime unit must be one of
the keywords that is listed in the
Purpose column. You can enter
the keyword in uppercase or
lowercase letters. You cannot put
quotation marks around the
keyword.
See the Restrictions
column.
n A literal number that you use to
specify the number of datetime
units. See UNITS Keyword on
page 1-682 for more information
on this parameter.
If n is not an integer, it is
rounded down to the nearest
whole number when it is used.
The value that you specify for n
must be appropriate for the
datetime unit that you choose.
Literal Number,
p. 1-752
1-678 Informi x Gui de to SQL: Syntax
Expressi on
I For the CURRENT function in an expression, see CURRENT
Function on page 1-680.
I For literal DATETIME as an expression, see Literal DATETIME as an
Expression on page 1-681.
I For literal INTERVAL as an expression, see Literal INTERVAL as an
Expression on page 1-682.
I For the UNITS keyword in an expression, see UNITS Keyword on
page 1-682.
Quoted String as an Expression
The following examples show quoted strings as expressions:
SELECT 'The first name is ', fname FROM customer
INSERT INTO manufact VALUES ('SPS', 'SuperSport')
UPDATE cust_calls SET res_dtime = '1993-1-1 10:45'
WHERE customer_num = 120 AND call_code = 'B'
USER Function
The USER function returns a string that contains the login name of the current
user (that is, the person running the process).
The following statements show how you might use the USER function:
INSERT INTO cust_calls VALUES
(221,CURRENT,USER,'B','Decimal point off', NULL, NULL)
SELECT * FROM cust_calls WHERE user_id = USER
UPDATE cust_calls SET user_id = USER WHERE customer_num = 220
The USER function does not change the case of a user ID. If you use USER in
an expression and the present user is Robertm, the USER function returns
Robertm, not robertm. If you specify user as the default value for a column,
the column must be CHAR, VARCHAR, NCHAR, or NVARCHAR data type, and
it must be at least eight characters long.
SQL Statements 1-679
Expressi on
In an ANSI-compliant database, if you do not use quotes around the owner
name, the name of the table owner is stored as uppercase letters. If you use
the USER keyword as part of a condition, you must be sure that the way the
user name is stored agrees with the values that the USER function returns,
with respect to case.
SITENAME and DBSERVERNAME Functions
The SITENAME and DBSERVERNAME functions return the database server
name, as dened in the ONCONFIG le for the INFORMIX-OnLine Dynamic
Server installation where the current database resides or as specied in the
INFORMIXSERVER environment variable. The two function names,
SITENAME and DBSERVERNAME, are synonymous. You can use the
DBSERVERNAME function to determine the location of a table, to put infor-
mation into a table, or to extract information from a table. You can insert
DBSERVERNAME into a simple character eld or use it as a default value for
a column. If you specify DBSERVERNAME as a default value for a column, the
column must be CHAR, VARCHAR, NCHAR, or NVARCHAR data type and
must be at least 18 characters long.
In the following example, the rst statement returns the name of the database
server where the customer table resides. Because the query is not restricted
with a WHERE clause, it returns DBSERVERNAME for every row in the table.
If you add the DISTINCT keyword to the SELECT clause, the query returns
DBSERVERNAME once. The second statement adds a row that contains the
current site name to a table. The third statement returns all the rows that have
the site name of the current system in site_col. The last statement changes the
company name in the customer table to the current system name.
SELECT DBSERVERNAME FROM customer
INSERT INTO host_tab VALUES ('1', DBSERVERNAME)
SELECT * FROM host_tab WHERE site_col = DBSERVERNAME
UPDATE customer SET company = DBSERVERNAME
WHERE customer_num = 120
ANSI
1-680 Informi x Gui de to SQL: Syntax
Expressi on
Literal Number as an Expression
The following examples show literal numbers as expressions:
INSERT INTO items VALUES (4, 35, 52, 'HRO', 12, 4.00)
INSERT INTO acreage VALUES (4, 5.2e4)
SELECT unit_price + 5 FROM stock
SELECT -1 * balance FROM accounts
TODAY Function
Use the TODAY function to return the system date as a DATE data type. If you
specify TODAY as a default value for a column, it must be a DATE column.
The following examples show how you might use the TODAY function in an
INSERT, UPDATE, or SELECT statement:
UPDATE orders (order_date) SET order_date = TODAY
WHERE order_num = 1005
INSERT INTO orders VALUES
(0, TODAY, 120, NULL, N, '1AUE217', NULL, NULL, NULL, NULL)
SELECT * FROM orders WHERE ship_date = TODAY
CURRENT Function
The CURRENT function returns a DATETIME value with the date and time of
day, showing the current instant.
If you do not specify a datetime qualier, the default qualiers are YEAR TO
FRACTION(3). You can use the CURRENT function in any context in which you
can use a literal DATETIME (see page 1-746). If you specify CURRENT as the
default value for a column, it must be a DATETIME column and the qualier
of CURRENT must match the column qualier, as the following example
shows:
CREATE TABLE new_acct (col1 int, col2 DATETIME YEAR TO DAY
DEFAULT CURRENT YEAR TO DAY)
If you use the CURRENT keyword in more than one place in a single
statement, identical values can be returned at each point of the call. You
cannot rely on the CURRENT function to provide distinct values each time it
executes.
SQL Statements 1-681
Expressi on
The returned value comes from the system clock and is xed when any SQL
statement starts. For example, any calls to CURRENT from an EXECUTE
PROCEDURE statement return the value when the stored procedure starts.
The CURRENT function is always evaluated in the database server where the
current database is located. If the current database is in a remote database
server, the returned value is from the remote host.
The CURRENT function might not execute in the physical order in which it
appears in a statement. You should not use the CURRENT function to mark
the start, end, or a specic point in the execution of a statement.
If your platform does not provide a system call that returns the current time
with subsecond precision, the CURRENT function returns a zero for the
FRACTION eld.
In the following example, the rst statement uses the CURRENT function in a
WHERE condition. The second statement uses the CURRENT function as the
input for the DAY function. The last query selects rows whose call_dtime
value is within a range from the beginning of 1993 to the current instant.
DELETE FROM cust_calls WHERE
res_dtime < CURRENT YEAR TO MINUTE
SELECT * FROM orders WHERE DAY(ord_date) < DAY(CURRENT)
SELECT * FROM cust_calls WHERE call_dtime
BETWEEN '1993-1-1 00:00:00' AND CURRENT
Literal DATETIME as an Expression
The following examples show literal DATETIME as an expression:
SELECT DATETIME (1993-12-6) YEAR TO DAY FROM customer
UPDATE cust_calls SET res_dtime = DATETIME (1992-07-07 10:40)
YEAR TO MINUTE
WHERE customer_num = 110
AND call_dtime = DATETIME (1992-07-07 10:24) YEAR TO MINUTE
SELECT * FROM cust_calls
WHERE call_dtime
= DATETIME (1995-12-25 00:00:00) YEAR TO SECOND
1-682 Informi x Gui de to SQL: Syntax
Expressi on
Literal INTERVAL as an Expression
The following examples show literal INTERVAL as an expression:
INSERT INTO manufact VALUES ('CAT', 'Catwalk Sports',
INTERVAL (16) DAY TO DAY)
SELECT lead_time + INTERVAL (5) DAY TO DAY FROM manufact
The second statement in the preceding example adds ve days to each value
of lead_time selected from the manufact table.
UNITS Keyword
The UNITS keyword enables you to display a simple interval or increase or
decrease a specic interval or datetime value.
If n is not an integer, it is rounded down to the nearest whole number when
it is used.
In the following example, the rst SELECT statement uses the UNITS keyword
to select all the manufacturer lead times, increased by ve days. The second
SELECT statement nds all the calls that were placed more than 30 days ago.
If the expression in the WHERE clause returns a value greater than 99
(maximum number of days), the query fails. The last statement increases the
lead time for the ANZA manufacturer by two days.
SELECT lead_time + 5 UNITS DAY FROM manufact
SELECT * FROM cust_calls
WHERE (TODAY - call_dtime) > 30 UNITS DAY
UPDATE manufact SET lead_time = 2 UNITS DAY + lead_time
WHERE manu_code = 'ANZ'
SQL Statements 1-683
Expressi on
Function Expressions
A function expression takes an argument, as the following diagram shows.
The following examples show function expressions:
EXTEND (call_dtime, YEAR TO SECOND)
MDY (12, 7, 1900 + cur_yr)
DATE (365/2)
LENGTH ('abc') + LENGTH (pvar)
HEX (customer_num)
HEX (LENGTH(123))
TAN (radians)
+
Algebraic
Functions
p. 1-684
DBINFO
Function
p. 1-690
TRIM Function
p. 1-707
Time Functions
p. 1-699
Length
Functions
p. 1-696
HEX Function
p. 1-696
Exponential and
Logarithmic
Functions
p. 1-694
Trigonometric
Functions
p. 1-704
1-684 Informi x Gui de to SQL: Syntax
Expressi on
ABS (-32)
EXP (4,3)
MOD (10,3)
Algebraic Functions
An algebraic function takes one or more arguments, as the following diagram
shows.
Expression
p. 1-671
ABS
base, exponent
sqrt_radicand
num_expression
Algebraic
Functions
ROUND
, rounding factor
dividend, divisor
POW
MOD
ROOT radicand
Expression
p. 1-671
TRUNC
, truncating factor
SQRT
, index
) (
)
)
(
(
( )
) (
( )
) (
, 2
, 0
, 0
SQL Statements 1-685
Expressi on
Element Purpose Restrictions Syntax
base A value to be raised to the power
that is specied in exponent. The
base value is the rst argument
that is supplied to the POW
function. See POW Function
on page 1-688 for further
information on base.
You can enter in base any real
number or any expression that
evaluates to a real number.
Expression, p. 1-671
dividend A value to be divided by the
value in divisor. The dividend
value is the rst argument
supplied to the MOD function.
See MOD Function on
page 1-687 for further
information on dividend.
You can enter individend any real
number or any expression that
evaluates to a real number.
Expression, p. 1-671
divisor The value by which the value in
dividend is to be divided. The
divisor value is the second
argument that is supplied to the
MOD function. See MOD
Function on page 1-687 for
further information on divisor
You can enter in divisor any real
number except zero or any
expression that evaluates to a
real number other than zero.
Expression, p. 1-671
exponent The power to which the value
that is specied in base is to be
raised. The exponent value is the
second argument that is
supplied to the POW function.
See POW Function on
page 1-688 for further
information on exponent.
You can enter in exponent any
real number or any expression
that evaluates to a real number.
Expression, p. 1-671
index The type of root to be returned,
where 2 represents square root, 3
represents cube root, and so on.
The index value is the second
argument that is supplied to the
ROOT function. The default
value of index is 2. See ROOT
Function on page 1-688 for
further information on index.
You can enter in index any real
number except zero or any
expression that evaluates to a
real number other than zero.
Expression, p. 1-671
(1 of 3)
1-686 Informi x Gui de to SQL: Syntax
Expressi on
num_expression A numeric expression for which
an absolute value is to be
returned. The expression serves
as the argument for the ABS
function. See ABS Function on
page 1-687 for further
information on num_expression.
The value of num_expression can
be any real number.
Expression, p. 1-671
radicand An expression whose root value
is to be returned. The radicand
value is the rst argument that is
supplied to the ROOT function.
See ROOT Function on
page 1-688 for further
information on radicand.
You can enter inradicand any real
number or any expression that
evaluates to a real number.
Expression, p. 1-671
rounding factor The number of digits to which a
numeric expression is to be
rounded. The rounding factor
value is the second argument
that is supplied to the ROUND
function. The default value of
rounding factor is zero. This
default means that the numeric
expression is rounded to zero
digits or the ones place. See
ROUND Function on
page 1-688 for further
information on rounding factor.
The value you specify in
rounding factor must be an
integer between +32 and -32,
inclusive. See ROUND
Function on page 1-688 for
further information on this
restriction.
Literal Number,
p. 1-752
sqrt_radicand An expression whose square
root value is to be returned. The
sqrt_radicand value is the
argument that is supplied to the
SQRT function. See SQRT
Function on page 1-689 for
further information on
sqrt_radicand.
You can enter in sqrt_radicand
any real number or any
expression that evaluates to a
real number.
Expression, p. 1-671
Element Purpose Restrictions Syntax
(2 of 3)
SQL Statements 1-687
Expressi on
ABS Function
The ABS function gives the absolute value for a given expression. The
function requires a single numeric argument. The value returned is the same
as the argument type. The following example shows all orders of more than
$20 paid in cash (+) or store credit (-). The stores7 database does not contain
any negative balances; however, you might have negative balances in your
application.
SELECT order_num, customer_num, ship_charge
FROM orders WHERE ABS(ship_charge) > 20
MOD Function
The MOD function returns the modulus or remainder value for two numeric
expressions. You provide integer expressions for the dividend and divisor.
The divisor cannot be 0. The value returned is INT. The following example
uses a 30-day billing cycle to determine how far into the billing cycle today is:
SELECT MOD(today - MDY(1,1,year(today)),30) FROM orders
truncating
factor
The position to which a numeric
expression is to be truncated.
The truncating factor value is the
second argument that is
supplied to the TRUNC
function.The default value of
truncating factor is zero. This
default means that the numeric
expression is truncated to zero
digits or the ones place. See
TRUNC Function on
page 1-690 for further
information on truncating factor.
The value you specify in
truncating factor must be an
integer between +32 and -32,
inclusive. See TRUNC
Function on page 1-690 for
further information on this
restriction.
Literal Number,
p. 1-752
Element Purpose Restrictions Syntax
(3 of 3)
1-688 Informi x Gui de to SQL: Syntax
Expressi on
POW Function
The POW function raises the base to the exponent. This function requires two
numeric arguments. The return type is FLOAT. The following example
returns all the information for circles whose areas ( r
2
) are less than
1,000 square units:
SELECT * FROM circles WHERE (3.1417 * POW(radius,2)) < 1000
ROOT Function
The ROOT function returns the root value of a numeric expression. This
function requires at least one numeric argument (the radicand argument) and
allows no more than two (the radicand and index arguments). If only the
radicand argument is supplied, the value 2 is used as a default value for the
index argument. The value 0 cannot be used as the value of index. The value
that the ROOT function returns is FLOAT. The rst SELECT statement in the
following example takes the square root of the expression. The second
SELECT statement takes the cube root of the expression.
SELECT ROOT(9) FROM angles -- square root of 9
SELECT ROOT(64,3) FROM angles -- cube root of 64
The SQRT function uses the formSQRT(x)=ROOT(x) if no index is given.
ROUND Function
The ROUND function returns the rounded value of an expression. The
expression must be numeric or must be converted to numeric.
If you omit the digit indication, the value is rounded to zero digits or to the
ones place. The digit limitation of 32 (+ and -) refers to the entire decimal
value.
SQL Statements 1-689
Expressi on
Positive-digit values indicate rounding to the right of the decimal point;
negative-digit values indicate rounding to the left of the decimal point, as
Figure 1-4 shows.
The following example shows how you can use the ROUND function with a
column expression in a SELECT statement. This statement displays the order
number and rounded total price (to zero places) of items whose rounded total
price (to zero places) is equal to 124.00.
SELECT order_num , ROUND(total_price) FROM items
WHERE ROUND(total_price) = 124.00
If you use a MONEY data type as the argument for the ROUND function and
you round to zero places, the value displays with .00. The SELECT statement
in the following example rounds an INTEGER value and a MONEY value. It
displays 125 and a rounded price in the form xxx.00 for each row in items.
SELECT ROUND(125.46), ROUND(total_price) FROM items
SQRT Function
The SQRT function returns the square root of a numeric expression.
The following example returns the square root of 9 for each row of the angles
table:
SELECT SQRT(9) FROM angles
Figure 1-4
ROUND Function
2
Expression:
ROUND (24,536.8746, -2) = 24,500.00
ROUND (24,536.8746, 0) = 24,537.00
ROUND (24,536.8746, 2) = 24,536.87
-2
2 4 5 3 6 . 8 7 4 6
0
1-690 Informi x Gui de to SQL: Syntax
Expressi on
TRUNC Function
The TRUNC function returns the truncated value of a numeric expression.
The expression must be numeric or a form that can be converted to a numeric
expression. If you omit the digit indication, the value is truncated to zero
digits or to the ones place. The digit limitation of 32 (+ and -) refers to the
entire decimal value.
Positive digit values indicate truncating to the right of the decimal point;
negative digit values indicate truncating to the left of the decimal point, as
Figure 1-5 shows.
If you use a MONEY data type as the argument for the TRUNC function and
you truncate to zero places, the .00 places are removed. For example, the
following SELECT statement truncates a MONEY value and an INTEGER
value. It displays 125 and a truncated price in integer format for each row in
items.
SELECT TRUNC(125.46), TRUNC(total_price) FROM items
DBINFO Function
Use the DBINFO function for any of the following purposes:
I To locate the name of a dbspace corresponding to a tblspace number
or expression
I To nd out the last serial value inserted in a table
I To nd out the number of rows processed by selects, inserts, deletes,
updates, and execute procedure statements
I To nd out the session ID of the current session
Figure 1-5
TRUNC Function
Expression:
TRUNC (24536.8746, -2) =24500
TRUNC (24536.8746, 0) = 24536
TRUNC (24536.8746, 2) = 24536.87
2 4 5 3 6 . 8 7 4 6
2 -2 0
SQL Statements 1-691
Expressi on
You can use the DBINFO function anywhere within SQL statements and
within stored procedures.
Using the 'DBSPACE' Option
The 'DBSPACE' option returns a character string that contains the name of the
dbspace corresponding to a tblspace number. You must supply an additional
parameter, either tblspace num or an expression that evaluates to tblspace num.
The following example uses the 'DBSPACE' option. First, it queries the
systables system catalog table to determine the tblspace num for the table
customer, then it executes the function to determine the dbspace name.
SELECT tabname, partnum FROM systables;
Element Purpose Restrictions Syntax
expression An expression that evaluates to
tblspace num
The expression can contain
procedure variables, host
variables, column names, or
subqueries, but it must evaluate
to a numeric value.
Expression, p. 1-671
tblspace num The tblspace number (partition
number) of a table. The DBSPACE
option of the DBINFO function
returns the name of the dbspace
that corresponds to the specied
tblspace number.
The specied tblspace number
must exist. That is, it must occur
in the partnum column of the
systables table for the database.
Literal Number,
p. 1-752
DBINFO Function
DBINFO 'DBSPACE'
,
'sqlca.sqlerrd1'
'sqlca.sqlerrd2'
OL
tblspace num ( )
expression
'sessionid'
OL
+
1-692 Informi x Gui de to SQL: Syntax
Expressi on
If the statement returns a partition number of 16777289, you insert that value
into the second argument to nd which dbspace contains the customer table,
as shown in the following example:
SELECT DBINFO ('DBSPACE', 16777289) FROM systables;
Using the 'sqlca.sqlerrd1' Option
The 'sqlca.sqlerrd1' option returns a single integer that provides the last serial
value that is inserted into a table. To ensure valid results, use this option
immediately following an INSERT statement that inserts a serial value. The
following example uses the 'sqlca.sqlerrd1' option:
.
.
EXEC SQL create table fst_tab (ordernum serial, partnum int);
EXEC SQL create table sec_tab (ordernum serial);
EXEC SQL insert into fst_tab VALUES (0,1);
EXEC SQL insert into fst_tab VALUES (0,4);
EXEC SQL insert into fst_tab VALUES (0,6);
EXEC SQL insert into sec_tab
select dbinfo('sqlca.sqlerrd1')
from sec_tab where partnum = 6;
.
.
This example inserts a row that contains a primary-key serial value into the
fst_tab table, and then uses the DBINFO() function to insert the same serial
value into the sec_tab table. The value that the DBINFO() function returns is
the serial value of the last row that is inserted into fst_tab. The subquery in
the last line contains a WHERE clause so that a single value is returned.
Using the 'sqlca.sqlerrd2' Option
The 'sqlca.sqlerrd2' option returns a single integer that provides the number
of rows that SELECT, INSERT, DELETE, UPDATE, and EXECUTE PROCEDURE
statements processed. To ensure valid results, use this option after SELECT
and EXECUTE PROCEDURE statements have completed executing. In
addition, if you use this option within cursors, make sure that all rows are
fetched before the cursors are closed to ensure valid results.
SQL Statements 1-693
Expressi on
The following example shows a stored procedure that uses the
'sqlca.sqlerrd2' option to determine the number of rows that are deleted from
a table:
CREATE PROCEDURE del_rows (pnumb int)
RETURNING int;
DEFINE nrows int;
DELETE FROM sec_tab WHERE partnum=pnumb;
LET nrows = DBINFO('sqlca.sqlerrd2');
RETURN nrows;
END PROCEDURE
Using the 'sessionid' Option
The 'sessionid' option of the DBINFO function returns the session ID of your
current session.
When a client application makes a connection to INFORMIX-OnLine Dynamic
Server, the database server starts a session with the client and assigns a
session ID for the client. The session ID serves as a unique identier for a
given connection between a client and a database server. The database server
stores the value of the session ID in a data structure in shared memory that is
called the session control block. The session control block for a given session
also includes the user ID, the process ID of the client, the name of the host
computer, and a variety of status ags.
When you specify the 'sessionid' option, the database server retrieves the
session ID of your current session from the session control block and returns
this value to you as an integer. Some of the System-Monitoring Interface
(SMI) tables in the sysmaster database include a column for session IDs, so
you can use the session ID that the DBINFO function obtained to extract infor-
mation about your own session from these SMI tables. For further infor-
mation on the session control block, the sysmaster database, and the SMI
tables, see the INFORMIX-OnLine Dynamic Server Administrators Guide.
1-694 Informi x Gui de to SQL: Syntax
Expressi on
In the following example, the user species the DBINFO function in a SELECT
statement to obtain the value of the current session ID. The user poses this
query against the systables system catalog table and uses a WHERE clause to
limit the query result to a single row.
SELECT DBINFO('sessionid') AS my_sessionid
FROM systables
WHERE tabname = 'systables'
The following table shows the result of this query.
In the preceding example, the SELECT statement queries against the systables
system catalog table. However, you can obtain the session ID of the current
session by querying against any system catalog table or user table in the
database. For example, you can enter the following query to obtain the
session ID of your current session:
SELECT DBINFO('sessionid') AS user_sessionid
FROM customer
where customer_num = 101
The following table shows the result of this query.
You can use the DBINFO function not only in SQL statements but also in
stored procedures. The following example shows a stored procedure that
returns the value of the current session ID to the calling program or
procedure:
CREATE PROCEDURE get_sess()
RETURNING INT;
RETURN DBINFO('sessionid');
END PROCEDURE;
my_sessionid
14
user_sessionid
14
SQL Statements 1-695
Expressi on
Exponential and Logarithmic Functions
Exponential and logarithmic functions take at least one argument. The return
type is FLOAT. The following example shows exponential and logarithmic
functions.
EXP Function
The EXP function returns the exponential value of two numeric expressions.
You provide a constant and oat expression in the forme(n)=en. The
following example returns the exponent of 3 for each row of the angles table:
SELECT EXP(3) FROM angles
LOGN Function
The LOGN function returns the natural log of a numeric expression. The
logarithmic value is the inverse of the exponential value. The following
SELECT statement returns the natural log of population for each row of the
history table:
SELECT LOGN(population) FROM history WHERE country='US'
ORDER BY date
Element Purpose Restrictions Syntax
oat expression An expression that serves as an
argument to the EXP, LOGN, or
LOG10 functions. For infor-
mation on the meaning of oat
expression in these functions, see
the individual heading for each
function on the following pages.
The domain of the expression is
the set of real numbers, and the
range of the expression is the set
of positive real numbers.
Expression, p. 1-671
LOG10
oat expression LOGN
Exponential and Logarithmic Functions
EXP oat expression
oat expression
)
)
)
(
(
(
1-696 Informi x Gui de to SQL: Syntax
Expressi on
LOG10 Function
The LOG10 function returns the log of a value to the base 10. The following
example returns the log base 10 of distance for each row of the travel table:
SELECT LOG10(distance) + 1 digits FROM travel
HEX Function
The HEX function returns the hexadecimal encoding of an integer expression.
The following example displays the data type and column length of the
columns of the orders table in hexadecimal format. For MONEY and
DECIMAL columns, you can then determine the precision and scale from the
lowest and next-to-the-lowest bytes. For VARCHAR and NVARCHAR
columns, you can determine the minimum space and maximum space from
the lowest and next to the lowest bytes. (See Chapter 2 of the Informix Guide
to SQL: Reference for more information about encoded information.)
SELECT colname, coltype, HEX(collength)
FROM syscolumns C, systables T
WHERE C.tabid = T.tabid AND T.tabname = 'orders'
The following example lists the names of all the tables in the current database
and their corresponding tblspace number in hexadecimal format. This
example is particularly useful because the two most signicant bytes in the
hexadecimal number constitute the dbspace number. They are used to
identify the table in oncheck output.
SELECT tabname, HEX(partnum) FROM systables
Element Purpose Restrictions Syntax
integer
expression
A numeric expression for which
you want to know the
hexadecimal equivalent
You must specify an integer or
an expression that evaluates to
an integer.
Expression, p. 1-671
HEX Function
HEX
(
integer
expression
)
SQL Statements 1-697
Expressi on
The HEX function can operate on an expression, as the following example
shows:
SELECT HEX(order_num + 1) FROM orders
Length Functions
You can use length functions to determine the length of a column, string, or
variable. The length functions are LENGTH, OCTET_LENGTH, and
CHAR_LENGTH. Each of these functions has a distinct purpose.
Element Purpose Restrictions Syntax
column name The name of a column in the
specied table.
The column must have a
character data type.
Identier, p. 1-723
variable name A host variable or procedure
variable that contains a character
string.
The host variable or procedure
variable must have a character
data type.
The name of the host
variable must
conform to
language-specic
rules for variable
names. For the
syntax of procedure
variables, see
Procedure Call
Expressions on
page 1-722.
LENGTH
Functions
variable
name
column
name
SPL
ESQL
+
Quoted
String
p. 1-757
LENGTH
) (
CHAR_LENGTH
CHARACTER_LENGTH
OCTET_LENGTH
Table
Name
p. 1-768
.
1-698 Informi x Gui de to SQL: Syntax
Expressi on
The LENGTH Function
The LENGTH function returns the number of bytes in a character column, not
including any trailing spaces. With TEXT or BYTE columns, the LENGTH
function returns the full number of bytes in the column, including trailing
spaces.
The following example illustrates the use of the LENGTH function:
SELECT customer_num, LENGTH(fname) + LENGTH(lname),
LENGTH('How many bytes is this?')
FROM customer WHERE LENGTH(company) > 10
You can use the LENGTH function to return the length of a character
variable.
For information on GLS aspects of the LENGTH function, see Chapter 3 of the
Guide to GLS Functionality.
The OCTET_LENGTH Function
The OCTET_LENGTH function returns the number of bytes in a character
column, including any trailing spaces. See the Guide to GLS Functionality for
a discussion of the OCTET_LENGTH function.
The CHAR_LENGTH Function
The CHAR_LENGTH function returns the number of characters (not bytes) in
a character column. See the Guide to GLS Functionality for a discussion of the
CHAR_LENGTH function.
ESQL
GLS
SQL Statements 1-699
Expressi on
Time Functions
Element Purpose Restrictions Syntax
date/datetime
expression
An expression that serves as an
argument in the following
functions: DAY, MONTH,
WEEKDAY, YEAR, and EXTEND
The expression must evaluate to
a DATE or DATETIME value.
Expression, p. 1-671
day integer
expression
An expression that represents
the number of the day of the
month
The expression must evaluate to
an integer not greater than the
number of days in the specied
month.
Expression, p. 1-671
rst A qualier that species the rst
eld in the result. If you do not
specify rst and last qualiers,
the default value of rst is YEAR.
The qualier can be any
DATETIME qualier, as long as it
is larger than last.
DATETIME Field
Qualier, p. 1-669
last A qualier that species the last
eld in the result. If you do not
specify rst and last qualiers,
the default value of last is
FRACTION(3).
The qualier can be any
DATETIME qualier, as long as it
is smaller than rst.
DATETIME Field
Qualier, p. 1-669
(1 of 2)
+
Time Functions
DATE
DAY
date/datetime
expression
MONTH
WEEKDAY
YEAR
EXTEND
MDY
non-date
expression
date/datetime
expression
rst TO last ,
, ,
month
integer
expression
day
integer
expression
year
integer
expression
) (
) (
( )
) (
1-700 Informi x Gui de to SQL: Syntax
Expressi on
DATE Function
The DATE function returns a DATE type value that corresponds to the
non-date expression with which you call it. The argument can be any
expression that can be converted to a DATE value, usually a CHAR,
DATETIME, or INTEGER value. The following WHERE clause species a CHAR
value for the non-date expression:
WHERE order_date < DATE('12/31/93')
When the DATE function interprets a CHAR non-date expression, it expects
this expressionto conform to any DATE format that the DBDATE environment
species. For example, suppose DBDATE is set to Y2MD/ when you execute
the following query:
SELECT DISTINCT DATE('02/01/1995') FROM ship_info
This SELECT statement generates an error because the DATE function cannot
convert this non-date expression. The DATE function interprets the rst part
of the date string (02) as the year and the second part (01) as the month. For
the third part (1995), the DATE function encounters four digits when it
expects a two-digit day (valid day values must be between 01 and 31). It
therefore cannot convert the value. For the SELECT statement to execute
successfully with the Y2MD/ value for DBDATE, the non-date expression
would need to be '95/02/01'. For information on the format of DBDATE, see
Chapter 4 of the Informix Guide to SQL: Reference.
month integer
expression
An expression that represents
the number of the month
The expression must evaluate to
an integer between 1 and 12,
inclusive.
Expression, p. 1-671
non-date
expression
An expression whose value is to
be converted to a DATE data type
You can specify any expression
that can be converted to a DATE
data type. Usually you specify
an expression that evaluates to a
CHAR, DATETIME, or INTEGER
value.
Expression, p. 1-671
year integer
expression
An expression that represents
the year
The expression must evaluate to
a four-digit integer. You cannot
use a two-digit abbreviation.
Expression, p. 1-671
Element Purpose Restrictions Syntax
(2 of 2)
SQL Statements 1-701
Expressi on
When you specify a positive INTEGER value for the non-date expression, the
DATE function interprets the value as the number of days after the default
date of December 31, 1899. If the integer value is negative, the DATE function
interprets the value as the number of days before December 31, 1899. The
following WHERE clause species an INTEGER value for the non-date
expression:
WHERE order_date < DATE(365)
The database server searches for rows with an order_date value less than
December 31, 1900 (12/31/1899 plus 365 days).
DAY Function
The DAY function returns an integer that represents the day of the month.
The following example uses the DAY function with the CURRENT function to
compare column values to the current day of the month:
WHERE DAY(order_date) > DAY(CURRENT)
MONTH Function
The MONTH function returns an integer that corresponds to the month
portion of its type DATE or DATETIME argument. The following example
returns a number from1 through 12 to indicate the month when the order
was placed:
SELECT order_num, MONTH(order_date) FROM orders
WEEKDAY Function
The WEEKDAY function returns an integer that represents the day of the
week; zero represents Sunday, one represents Monday, and so on. The
following lists all the orders that were paid on the same day of the week,
which is the current day:
SELECT * FROM orders
WHERE WEEKDAY(paid_date) = WEEKDAY(CURRENT)
1-702 Informi x Gui de to SQL: Syntax
Expressi on
YEAR Function
The YEAR function returns a four-digit integer that represents the year. The
following example lists orders in which the ship_date is earlier than the
beginning of the current year:
SELECT order_num, customer_num FROM orders
WHERE year(ship_date) < YEAR(TODAY)
Similarly, because a DATE value is a simple calendar date, you cannot add or
subtract a DATE value with an INTERVAL value whose last qualier is smaller
than DAY. In this case, convert the DATE value to a DATETIME value.
EXTEND Function
The EXTEND function adjusts the precision of a DATETIME or DATE value.
The expression cannot be a quoted string representation of a DATE value.
If you do not specify rst and last qualiers, the default qualiers are YEAR
TO FRACTION(3).
If the expression contains elds that are not specied by the qualiers, the
unwanted elds are discarded.
If the rst qualier species a larger (that is, more signicant) eld than what
exists in the expression, the new elds are lled in with values returned by
the CURRENT function. If the last qualier species a smaller eld (that is, less
signicant) than what exists in the expression, the new elds are lled in with
constant values. A missing MONTH or DAY eld is lled in with 1, and the
missing HOUR to FRACTION elds are lled in with 0.
SQL Statements 1-703
Expressi on
In the following example, the rst EXTEND call evaluates to the call_dtime
column value of YEAR TO SECOND. The second statement expands a literal
DATETIME so that an interval can be subtracted from it. You must use the
EXTEND function with a DATETIME value if you want to add it to or subtract
it from an INTERVAL value that does not have all the same qualiers. The
third example updates only a portion of the datetime value, the hour
position. The EXTEND function yields just the hh:mm part of the datetime.
Subtracting 11:00 from the hours/minutes of the datetime yields an
INTERVAL value of the difference, plus or minus, and subtracting that from
the original value forces the value to 11:00.
EXTEND (call_dtime, YEAR TO SECOND)
EXTEND (DATETIME (1989-8-1) YEAR TO DAY, YEAR TO MINUTE)
- INTERVAL (720) MINUTE (3) TO MINUTE
UPDATE cust_calls SET call_dtime = call_dtime -
(EXTEND(call_dtime, HOUR TO MINUTE) - DATETIME (11:00) HOUR
TO MINUTE) WHERE customer_num = 106
MDY Function
The MDY function returns a type DATE value with three expressions that
evaluate to integers representing the month, day, and year. The rst
expression must evaluate to an integer representing the number of the month
(1 to 12).
The second expression must evaluate to an integer that represents the
number of the day of the month (1 to 28, 29, 30, or 31, as appropriate for the
month.)
The third expression must evaluate to a four-digit integer that represents the
year. You cannot use a two-digit abbreviation for the third expression. The
following example sets the paid_date associated with the order number 8052
equal to the rst day of the present month:
UPDATE orders SET paid_date = MDY(MONTH(TODAY), 1, YEAR(TODAY))
WHERE po_num = '8052'
1-704 Informi x Gui de to SQL: Syntax
Expressi on
Trigonometric Functions
A trigonometric function takes an argument, as the following diagram
shows.
Element Purpose Restrictions Syntax
numeric
expression
A numeric expression that
serves as an argument to the
ASIN, ACOS, or ATAN functions
The expression must evaluate to
a value between -1 and 1,
inclusive.
Expression, p. 1-671
radian
expression
An expression that evaluates to
the number of radians. See
Formulas for Radian Expres-
sions on page 1-705 for further
information on radian expression.
The expression must evaluate to
a numeric value.
Expression, p. 1-671
x An expression that represents
the x coordinate of the rectan-
gular coordinate pair (x, y)
The expression must evaluate to
a numeric value.
Expression, p. 1-671
y An expression that represents
the y coordinate of the rectan-
gular coordinate pair (x, y)
The expression must evaluate to
a numeric value.
Expression, p. 1-671
TAN
SIN
Trigonometric
Functions
COS
ATAN2 y, x
numeric
expression
radian
expression
) (
)
)
(
(
ACOS
ASIN
ATAN
SQL Statements 1-705
Expressi on
Formulas for Radian Expressions
The COS, SIN, and TAN functions take the number of radians (radian
expression) as an argument.
If you are using degrees and want to convert degrees to radians, use the
following formula:
# degrees * p/180= # radians
If you are using radians and want to convert radians to degrees, use the
following formula:
# radians * 180/p = # degrees
COS Function
The COS function returns the cosine of a radian expression. The following
example returns the cosine of the values of the degrees column in the
anglestbl table. The expression passed to the COS function in this example
converts degrees to radians.
SELECT COS(degrees*180/3.1417) FROM anglestbl
SIN Function
The SIN function returns the sine of a radian expression. The following
example returns the sine of the values in the radians column of the anglestbl
table:
SELECT SIN(radians) FROM anglestbl
TAN Function
The TAN function returns the tangent of a radian expression. The following
example returns the tangent of the values in the radians column of the
anglestbl table:
SELECT TAN(radians) FROM anglestbl
1-706 Informi x Gui de to SQL: Syntax
Expressi on
ACOS Function
The ACOS function returns the arc cosine of a numeric expression. The
following example returns the arc cosine of the value (-0.73) in radians:
SELECT ACOS(-0.73) FROM anglestbl
ASIN Function
The ASINfunction returns the arc sine of a numeric expression. The following
example returns the arc sine of the value (-0.73) in radians:
SELECT ASIN(-0.73) FROM anglestbl
ATAN Function
The ATAN function returns the arc tangent of a numeric expression. The
following example returns the arc tangent of the value (-0.73) in radians:
SELECT ATAN(-0.73) FROM anglestbl
ATAN2 Function
The ATAN2 function computes the angular component of the polar
coordinates (r, ) associated with (x, y). The following example compares
angles to for the rectangular coordinates (4, 5):
WHERE angles > ATAN2(4,5) --determines for (4,5) and
compares to angles
You can determine the length of the radial coordinate r using the expression
shown in the following example:
SQRT(POW(x,2) + POW(y,2)) --determines r for (x,y)
You can determine the length of the radial coordinate r for the rectangular
coordinates (4,5) using the expression shown in the following example:
SQRT(POW(4,2) + POW(5,2)) --determines r for (4,5)
SQL Statements 1-707
Expressi on
TRIM Function
Use the TRIM function to remove leading or trailing (or both) pad characters
from a string. The TRIM function returns a VARCHAR string that is identical
to the character string passed to it, except that any leading or trailing pad
characters, if specied, are removed. If no trim specication (LEADING,
TRAILING, or BOTH) is specied, then BOTH is assumed. If no trim character
value expression is used, a single space is assumed. If either the trim character
value expression or the source character value expression evaluates to null, the
result of the trim function is null. The maximum length of the resultant string
must be 255 or less, because the VARCHAR data type supports only
255 characters.
Element Purpose Restrictions Syntax
trim character
value expression
An expression that evaluates to a
single character or null
This expression must be a
character expression.
Quoted String,
p. 1-757
source
character value
expression
An arbitrary character string
expression, including a column
or another TRIM function
This expression cannot be a host
variable.
Quoted String,
p. 1-757
TRIM
Function
TRIM ) (
source
character
value
expression
LEADING
TRAILING
BOTH
FROM
trim
character
value
expression
FROM
trim
character
value
expression
1-708 Informi x Gui de to SQL: Syntax
Expressi on
Some generic uses for the TRIM function are shown in the following example:
SELECT TRIM (c1) FROM tab;
SELECT TRIM (TRAILING '#' FROM c1) FROM tab;
SELECT TRIM (LEADING FROM c1) FROM tab;
UPDATE c1='xyz' FROM tab WHERE LENGTH(TRIM(c1))=5;
SELECT c1, TRIM(LEADING '#' FROM TRIM(TRAILING '%' FROM
'###abc%%%')) FROM tab;
When you use the DESCRIBE statement with a SELECT statement that uses the
TRIM function in the select list, the described character type of the trimmed
column depends on the database server you are using and the data type of
the source character value expression. See Chapter 7 of the Guide to GLS
Functionality for further information on the GLS aspects of the TRIM function
in ESQL/C.
Fixed Character Columns
The TRIM function can be specied on xed-length character columns. If the
length of the string is not completely lled, the unused characters are padded
with blank space. Figure 1-6 shows this concept for the column entry
'##A2T##', where the column is dened as CHAR(10).
If you want to trim the trim character value expression '#' from the column, you
need to consider the blank padded spaces as well as the actual characters. For
example, if you specify the trim specication BOTH, the result from the trim
operation is A2T##, because the TRIM function does not match the blank
padded space that follows the string. In this case, the only '#' trimmed are
those that precede the other characters. The SELECT statement is shown,
followed by Figure 1-7, which presents the result.
SELECT TRIM(BOTH '#' FROM col1) FROM taba
GLS
Figure 1-6
Column Entry in a
Fixed-Length
Character Column
2 T # A # # #
Blank padded
Characters
2 1 3 4 5 6 7 8 9 10
SQL Statements 1-709
Expressi on
The following SELECT statement removes all occurrences of '#':
SELECT TRIM(LEADING '#' FROM TRIM(TRAILING ' ' FROM col1)) FROM taba
Aggregate Expressions
An aggregate expression uses an aggregate function to summarize selected
database data.
The following diagram shows the syntax of aggregate function expressions.
Figure 1-7
Result of TRIM
Operation
# # T 2 A
Blank padded
Characters
2 1 3 4 5 6 7 8 9 10
Table
Name
p. 1-768
( )
column
name
AVG
MAX
MIN
SUM
COUNT
DISTINCT
AVG
MAX
MIN
SUM
(
ALL
Expression
(Subset)
p. 1-711
)
.
COUNT (*)
Synonym
Name
p. 1-766
.
View
Name
p. 1-772
.
(
UNIQUE
DISTINCT
UNIQUE
STDEV
VARIANCE
RANGE
COUNT (
ALL
+
1-710 Informi x Gui de to SQL: Syntax
Expressi on
An aggregate function returns one value for a set of queried rows. The
following examples show aggregate functions in SELECT statements:
SELECT SUM(total_price) FROM items WHERE order_num = 1013
SELECT COUNT(*) FROM orders WHERE order_num = 1001
SELECT MAX(LENGTH(fname) + LENGTH(lname)) FROM customer
If you use an aggregate function and one or more columns in the select list,
you must put all the column names that are not used as part of an aggregate
or time expression in the GROUP BY clause.
Element Purpose Restrictions Syntax
column name The name of the column to
which the specied aggregate
function is applied
If you specify an aggregate
expression and one or more
columns in the SELECT clause of
a SELECT statement, you must
put all the column names that
are not used within the
aggregate expression or a time
expression in the GROUP BY
clause. You cannot apply an
aggregate function to a BYTE or
TEXT column. See Subset of
Expressions Allowed in an
Aggregate Expression on
page 1-711 for other general
restrictions. For restrictions that
depend on the keywords that
precede column name, see the
headings for individual
keywords on the following
pages.
Identier, p. 1-723
SQL Statements 1-711
Expressi on
Subset of Expressions Allowed in an Aggregate Expression
The argument of an aggregate function cannot itself contain an aggregate
function. You cannot use the aggregate functions found in the following list:
I MAX(AVG(order_num))
I An aggregate function in a WHERE clause unless it is contained in a
subquery or if the aggregate is on a correlated column originating
from a parent query and the WHERE clause is within a subquery that
is within a HAVING clause
I An aggregate function on a BYTE or TEXT column
For the full syntax of expressions, see page 1-671.
Including or Excluding Duplicates in the Row Set
The DISTINCT keyword causes the function to be applied to only unique
values from the named column. The UNIQUE keyword is a synonym for the
DISTINCT keyword.
The ALL keyword is the opposite of the DISTINCT keyword. If you specify the
ALL keyword, all the values that are selected from the named column or
expression, including any duplicate values, are used in the calculation.
COUNT(* ) Keyword
The COUNT (*) keyword returns the number of rows that satisfy the WHERE
clause of a SELECT statement. The following example nds how many rows
in the stock table have the value HRO in the manu_code column:
SELECT COUNT(*) FROM stock WHERE manu_code = 'HRO'
If the SELECT statement does not have a WHERE clause, the COUNT (*)
keyword returns the total number of rows in the table. The following
example nds how many rows are in the stock table:
SELECT COUNT(*) FROM stock
1-712 Informi x Gui de to SQL: Syntax
Expressi on
If the SELECT statement contains a GROUP BY clause, the COUNT(*) keyword
reects the number of values in each group. The following example is
grouped by the rst name; the rows are selected if the database server nds
more than one occurrence of the same name:
SELECT fname, COUNT(*) FROM customer
GROUP BY fname
HAVING COUNT(*) > 1
If the value of one or more rows is null, the COUNT(*) keyword includes the
null columns in the count unless the WHERE clause explicitly omits them.
AVG Keyword
The AVG keyword returns the average of all values in the specied column or
expression. You can apply the AVG keyword only to number columns. If you
use the DISTINCT keyword, the average (mean) is greater than only the
distinct values in the specied column or expression. The query in the
following example nds the average price of a helmet:
SELECT AVG(unit_price) FROM stock WHERE stock_num = 110
Nulls are ignored unless every value in the specied column is null. If every
column value is null, the AVG keyword returns a null for that column.
MAX Keyword
The MAX keyword returns the largest value in the specied column or
expression. Using the DISTINCT keyword does not change the results. The
query in the following example nds the most expensive item that is in stock
but has not been ordered:
SELECT MAX(unit_price) FROM stock
WHERE NOT EXISTS (SELECT * FROM items
WHERE stock.stock_num = items.stock_num AND
stock.manu_code = items.manu_code)
Nulls are ignored unless every value in the specied column is null. If every
column value is null, the MAX keyword returns a null for that column.
SQL Statements 1-713
Expressi on
MIN Keyword
The MIN keyword returns the lowest value in the column or expression.
Using the DISTINCT keyword does not change the results. The following
example nds the least expensive item in the stock table:
SELECT MIN(unit_price) FROM stock
Nulls are ignored unless every value in the specied column is null. If every
column value is null, the MIN keyword returns a null for that column.
SUM Keyword
The SUM keyword returns the sum of all the values in the specied column
or expression, as shown in the following example. If you use the DISTINCT
keyword, the sum is for only distinct values in the column or expression.
SELECT SUM(total_price) FROM items WHERE order_num = 1013
Nulls are ignored unless every value in the specied column is null. If every
column value is null, the SUM keyword returns a null for that column.
You cannot use the SUM keyword with a character column.
COUNT DISTINCT and UNIQUE Keywords
The COUNT DISTINCT keywords return the number of unique values in the
column or expression, as the following example shows. If the COUNT
function encounters nulls, it ignores them.
SELECT COUNT (DISTINCT item_num) FROM items
Nulls are ignored unless every value in the specied column is null. If every
column value is null, the COUNT keyword returns a zero for that column.
The UNIQUE keyword has exactly the same meaning as the DISTINCT
keyword when the UNIQUE keyword is used within the COUNT function.
The UNIQUE keyword returns the number of unique non-null values in the
column or expression.
The following example uses the UNIQUE keyword, but it is equivalent to the
preceding example that uses the DISTINCT keyword:
SELECT COUNT (UNIQUE item_num) FROM items
1-714 Informi x Gui de to SQL: Syntax
Expressi on
COUNT column name Option
The COUNT column name option returns the total number of non-null values
in the column or expression, as the following example shows:
SELECT COUNT (item_num) FROM items
You can include the ALL keyword before the specied column name for
clarity, but the query result is the same whether you include the ALL keyword
or omit it.
The following example shows how to include the ALL keyword in the
COUNT column name option:
SELECT COUNT (ALL item_num) FROM items
Comparison of the Different Forms of the COUNT Function
You can use the different forms of the COUNT function to retrieve different
types of information about a table. The following table summarizes the
meaning of each form of the COUNT function.
Some examples can help to show the differences among the different forms
of the COUNT function. The following examples pose queries against the
orders table in the demonstration database. Most of the examples query
against the ship_instruct column in this table. For information on the
structure of the orders table and the data in the ship_instruct column, see the
description of the demonstration database in the Informix Guide to SQL:
Reference.
COUNT Option Description
COUNT (*) This option returns the number of rows that
satisfy the query. If you do not specify a WHERE
clause, this option returns the total number of
rows in the table.
COUNT DISTINCT or
COUNT UNIQUE
This option returns the number of unique
non-null values in the specied column.
COUNT (column name) or
COUNT (ALL column name)
This option returns the total number of non-null
values in the specied column.
SQL Statements 1-715
Expressi on
Examples of the Count(*) Option
In the following example, the user wants to know the total number of rows
in the orders table. So the user uses the COUNT(*) function in a SELECT
statement without a WHERE clause.
SELECT COUNT(*) AS total_rows FROM orders
The following table shows the result of this query.
In the following example, the user wants to know how many rows in the
orders table have a null value in the ship_instruct column. So the user uses
the COUNT(*) function in a SELECT statement with a WHERE clause, and
species the IS NULL condition in the WHERE clause.
SELECT COUNT (*) AS no_ship_instruct
FROM orders
WHERE ship_instruct IS NULL
The following table shows the result of this query.
In the following example, the user wants to know how many rows in the
orders table have the value express in the ship_instruct column. So the user
species the COUNT (*) function in the select list and the equals (=) relational
operator in the WHERE clause.
SELECT COUNT (*) AS ship_express
FROM ORDERS
WHERE ship_instruct = 'express'
total_rows
23
no_ship_instruct
2
1-716 Informi x Gui de to SQL: Syntax
Expressi on
The following table shows the result of this query.
Examples of the COUNT column name Option
In the following example the user wants to know how many non-null values
are in the ship_instruct column of the orders table. So the user enters the
COUNT column name function in the select list of the SELECT statement.
SELECT COUNT(ship_instruct) AS total_notnulls
FROM orders
The following table shows the result of this query.
The user can also nd out how many non-null values are in the ship_instruct
column by including the ALL keyword in the parentheses that follow the
COUNT keyword.
SELECT COUNT (ALL ship_instruct) AS all_notnulls
FROM orders
The following table shows that the query result is the same whether you
include or omit the ALL keyword.
ship_express
6
total_notnulls
21
all_notnulls
21
SQL Statements 1-717
Expressi on
Examples of the COUNT DISTINCT Option
In the following example, the user wants to know how many unique non-null
values are in the ship_instruct column of the orders table. So the user enters
the COUNT DISTINCT function in the select list of the SELECT statement.
SELECT COUNT(DISTINCT ship_instruct) AS unique_notnulls
FROM orders
The following table shows the result of this query.
RANGE Keyword
The RANGE keyword computes the range for a sample of a population. It
computes the difference between the maximum and the minimum values, as
follows:
range(expr) = max(expr) - min(expr)
You can apply the RANGE function only to numeric columns. The following
query nds the range of ages for a population:
SELECT RANGE(age) FROM u_pop
As with other aggregates, the RANGE function applies to the rows of a group
when the query includes a GROUP BY clause, as shown in the following
example:
SELECT RANGE(age) FROM u_pop
GROUP BY birth
Nulls are ignored unless every value in the specied column is null. If every
column value is null, the RANGE function returns a null for that column.
Important: All computations for the RANGE function are performed in 32-digit
precision, which should be suf cient for many sets of input data. The computation,
however, loses precision or returns incorrect results when all of the input data values
have 16 or more digits of precision.
unique_notnulls
16
1-718 Informi x Gui de to SQL: Syntax
Expressi on
STDEV Keyword
The STDEV keyword computes the standard deviation for a sample of a
population. It is the square root of the VARIANCE function.
You can apply the STDEV function only to numeric columns. The following
query nds the standard deviation on a population:
SELECT STDEV(age) FROM u_pop WHERE u_pop.age > 0
As with the other aggregates, the STDEV function applies to the rows of a
group when the query includes a GROUP BY clause, as shown in the following
example:
SELECT STDEV(age) FROM u_pop
GROUP BY birth
WHERE STDEV(age) > 0
Nulls are ignored unless every value in the specied column is null. If every
column value is null, the STDEV function returns a null for that column.
Important: All computations for the STDEV function are performed in 32-digit
precision, which should be suf cient for many sets of input data. The computation,
however, loses precision or returns incorrect results when all of the input data values
have 16 or more digits of precision.
VARIANCE Keyword
The VARIANCE keyword returns the variance for a sample of values as an
unbiased estimate of the variance of the population. It computes the
following value:
(SUM(Xi**2) - (SUM(Xi)**2)/N)/(N-1)
In this example, Xi is each value in the column and N is the total number of
values in the column. You can apply the VARIANCE function only to numeric
columns. The following query nds the variance on a population:
SELECT VARIANCE(age) FROM u_pop WHERE u_pop.age > 0
SQL Statements 1-719
Expressi on
As with the other aggregates, the VARIANCE function applies to the rows of
a group when the query includes a GROUP BY clause, as shown in the
following example:
SELECT VARIANCE(age) FROM u_pop
GROUP BY birth
WHERE VARIANCE(age) > 0
Nulls are ignored unless every value in the specied column is null. If every
column value is null, the VARIANCE function returns a null for that column.
Important: All computations for the VARIANCE function are performed in 32-digit
precision, which should be suf cient for many sets of input data. The computation,
however, loses precision or returns incorrect results when all of the input data values
have 16 or more digits of precision.
Summary of Aggregate Function Behavior
An example can help to summarize the behavior of the aggregate functions.
Assume that the testtable table has a single INTEGER column that is named
a_number. The contents of this table are as follows.
a_number
2
2
2
3
3
4
(null)
1-720 Informi x Gui de to SQL: Syntax
Expressi on
You can use aggregate functions to obtain different types of information
about the a_number column and the testtable table. In the following
example, the user species the AVG function to obtain the average of all the
non-null values in the a_number column:
SELECT AVG(a_number) AS average_number
FROM testtable
The following table shows the result of this query.
You can use the other aggregate functions in SELECT statements that are
similar to the one shown in the preceding example. If you enter a series of
SELECT statements that have different aggregate functions in the select list
and do not have a WHERE clause, you receive the results that the following
table shows.
average_number
2.66666666666667
Function Results
COUNT(*) 7
AVG 2.66666666666667
AVG (DISTINCT) 3.00000000000000
MAX 4
MAX(DISTINCT) 4
MIN 2
MIN(DISTINCT) 2
SUM 16
SUM(DISTINCT) 9
COUNT(DISTINCT) 3
COUNT(ALL) 6
(1 of 2)
SQL Statements 1-721
Expressi on
Error Checking with Aggregate Functions
Aggregate functions always return one row; if no rows are selected, the
function returns a null. You can use the COUNT (*) keyword to determine
whether any rows were selected, and you can use an indicator variable to
determine whether any selected rows were empty. Fetching a row with a
cursor associated with an aggregate function always returns one row; hence,
100 for end of data is never returned into the sqlcode variable for a rst fetch
attempt.
You can also use the GET DIAGNOSTICS statement for error checking. See the
GET DIAGNOSTICS statement in this manual.
Using Arithmetic Operators with Expressions
You can combine expressions with arithmetic operators to make complex
expressions. You cannot combine expressions that use aggregate functions
with column expressions. The following examples use arithmetic operators:
quantity * total_price
price * 2
COUNT(*) + 2
If any value that participates in an arithmetic expression is null, the value of
the entire expression is null, as shown in the following example:
SELECT order_num, ship_charge/ship_weight FROM orders
WHERE order_num = 1023
If either ship_charge or ship_weight is null, the value returned for the
expression ship_charge/ship_weight is also null. If the expression
ship_charge/ship_weight is used in a condition, its truth value is unknown.
RANGE 2
STDEV 0.81649658092773
VARIANCE 0.66666666666667
Function Results
(2 of 2)
ESQL
1-722 Informi x Gui de to SQL: Syntax
Expressi on
If you combine a DATETIME value with one or more INTERVAL values, all the
elds of the INTERVAL value must be present in the DATETIME value; no
implicit EXTEND function is performed. In addition, you cannot use YEAR to
MONTH intervals with DAY to SECOND intervals.
Procedure Call Expressions
The following diagram shows procedure call expressions.
Some typical procedure call expressions are shown in the following
examples. The rst example omits the called variable option, and the second
example uses the called variable option.
read_address('Miller')
read_address(lastname = 'Miller')
References
In the Informix Guide to SQL: Tutorial, see the discussion of expressions in the
SELECT statement in Chapter 2.
In the Guide to GLS Functionality, see the discussions of column expressions in
Chapter 3, the discussion of length functions in Chapter 3, and the discussion
of the TRIM function in Chapter 7.
Element Purpose Restrictions Syntax
called variable The name of a parameter for
which you supply an argument
to the procedure. The parameter
name is originally specied in an
CREATE PROCEDURE statement,
then used in an EXECUTE
PROCEDURE statement.
If you use the called variable
option for any argument in the
called procedure, you must use
it for all arguments in the
procedure. That is, you must use
the called variable = expression
syntax for all or none of the
arguments in the called
procedure.
DEFINE statement,
p. 2-8
Procedure
Name
p. 1-754
called
variable
=
Expression
p. 1-671
,
( )
SQL Statements 1-723
Identi er
Identier
An identier species the simple name of a database object, such as a column,
table, index, or view. Use the Identier segment whenever you see a reference
to an identier in a syntax diagram.
Syntax
Element Purpose Restrictions Syntax
digit An integer that forms part of the
identier
You must specify a number
between 0 and 9, inclusive.
Literal Number,
p. 1-752
letter A letter that forms part of the
identier
If you are using the default
locale, a letter must be an
uppercase or lowercase
character in the range a to z (in
the ASCII code set). If you are
using a nondefault locale, letter
must be an alphabetic character
that the locale supports. See
Support for Non-ASCII
Characters in Identiers on
page 1-726 for further infor-
mation.
Letters are literal
values that you enter
from the keyboard.
underscore An underscore character that
forms part of the identier
You cannot substitute a space
character, dash, hyphen, or any
other nonalphanumeric
character for the underscore
character.
The underscore
character (_) is a
literal value that you
enter from the
keyboard.
letter
underscore
letter
digit
underscore
Delimited
Identier
p. 1-726
1-724 Informi x Gui de to SQL: Syntax
Identi er
Usage
An identier can contain up to 18 bytes, inclusive.
Database names are limited to 10 bytes.
Use of Reserved Words as Identiers
Although you can use almost any word as an identier, syntactic ambiguities
can result from using reserved words as identiers in SQL statements. The
statement might fail or might not produce the expected results. See Potential
Ambiguities and Syntax Errors on page 1-729 for a discussion of the
syntactic ambiguities that can result from using reserved words as identiers
and an explanation of workarounds for these problems.
Delimited identiers provide the easiest and safest way to use a reserved
word as an identier without causing syntactic ambiguities. No
workarounds are necessary when you use a reserved word as a delimited
identier. See Delimited Identiers on page 1-726 for the syntax and usage
of delimited identiers.
Tip: If you receive an error message that seems unrelated to the statement that
caused the error, check to determine whether the statement uses a reserved word as
an undelimited identi er.
ANSI-Reserved Words
The following list species all the ANSI-reserved words (that is, reserved
words in the ANSI SQL standard).
ADA execute order
all exists pascal
and fetch pli
any oat precision
as for primary
asc fortran procedure
authorization found privileges
avg from public
begin go real
between goto rollback
(1 of 2)
SE
SQL Statements 1-725
Identi er
You can ag identiers as ANSI-reserved words by taking the following
steps:
I Set the DBANSIWARN environment variable or use the -ansi ag at
compile time to receive compile-time warnings.
I Set the DBANSIWARN environment variable at runtime to receive
warning ags set in the SQLWARN array of sqlca.
by group schema
char having section
character in select
check indicator set
close insert smallint
cobol int some
commit integer sql
continue into sqlcode
count is sqlerror
create language sum
current like table
cursor max to
dec min union
decimal module unique
declare not update
delete null user
desc numeric values
distinct of view
double on whenever
end open where
escape option with
exec or work
(2 of 2)
1-726 Informi x Gui de to SQL: Syntax
Identi er
Support for Non-ASCII Characters in Identiers
If you are using a nondefault locale, you can use any alphabetic character that
your locale recognizes as a letter in an SQL identier name. You can use a non-
ASCII character as a letter as long as your locale supports it. This feature
enables you to use non-ASCII characters in the names of database objects such
as indexes, tables, and views. For a list of SQL identiers that support non-
ASCII characters, see Chapter 3 of the Guide to GLS Functionality.
Delimited Identiers
GLS
Delimited
Identier
letter
digit
underscore
nonalphanumeric character
double quote double quote
SQL Statements 1-727
Identi er
Delimited identiers allow you to specify names for database objects that are
otherwise identical to SQL reserved keywords, such as TABLE, WHERE,
DECLARE, and so on. The only database object for which you cannot use
delimited identiers is database name.
Delimited identiers are case sensitive.
Delimited identiers are compliant with the ANSI standard.
Element Purpose Restrictions Syntax
digit An integer that forms part of the
delimited identier
You must specify a number
between 0 and 9, inclusive.
Literal Number,
p. 1-752
double quote The double-quote character that
marks a string as a delimited
identier
If theDELIMIDENT environment
variable is not set, values within
double quotes are treated as
quoted strings by the database
server.
The double quote
character (") is a
literal value that you
enter from the
keyboard.
letter A letter that forms part of the
delimited identier
Letters in delimited identiers
are case-sensitive. If you are
using the default locale, a letter
must be an uppercase or
lowercase character in the range
a-z (in the ASCII code set). If you
are using a nondefault locale,
letter must be an alphabetic
character that the locale
supports. See Support for Non-
ASCII Characters in Delimited
Identiers on page 1-728 for
further information.
Letters are literal
values that you enter
from the keyboard.
nonalpha-
numeric
character
A nonalphanumeric character,
such as # or $ or space, that
forms part of the delimited
identier
If you are using the ASCII code
set, you can specify any ASCII
nonalphanumeric character.
Nonalphanumeric
characters are literal
values that you enter
from the keyboard.
underscore An underscore (_) that forms
part of the delimited identier
You can use a dash, hyphen, or
any other appropriate character
in place of the underscore
character.
The underscore (_) is
a literal value that
you enter from the
keyboard.
1-728 Informi x Gui de to SQL: Syntax
Identi er
Support for Nonalphanumeric Characters
You can use delimited identiers to specify nonalphanumeric characters in
the names of database objects. However, you cannot use delimited identiers
to specify nonalpha characters in the names of storage objects such as
dbspaces and blobspaces.
Support for Non-ASCII Characters in Delimited Identiers
When you are using a nondefault locale whose code set supports non-ASCII
characters, you can specify non-ASCII characters in most delimited identi-
ers. The rule is that if you can specify non-ASCII characters in the
undelimited form of the identier, you can also specify non-ASCII characters
in the delimited form of the same identier. See Chapter 3 of the Guide to GLS
Functionality for a list of identiers that support non-ASCII characters and for
information on non-ASCII characters in delimited identiers.
Effect of DELIMIDENT Environment Variable
To use delimited identiers, you must set the DELIMIDENT environment
variable. When you set the DELIMIDENT environment variable, database
objects in double quotes (") are treated as identiers and database objects in
single quotes (') are treated as strings. If the DELIMIDENT environment
variable is not set, values within double quotes are also treated as strings.
If the DELIMIDENT variable is set, the SELECT statement in the following
example must be in single quotes in order to be treated as a quoted string:
PREPARE ... FROM 'SELECT * FROM customer'
Examples of Delimited Identiers
The following example shows how to create a table with a case-sensitive table
name:
CREATE TABLE "Power_Ranger" (...)
GLS
SQL Statements 1-729
Identi er
The following example shows how to create a table whose name includes a
space character. If the table name were not in double quotes ("), you could not
use a space character or any other nonalpha character except an underscore
(_) in the name.
CREATE TABLE "My Customers" (...)
The following example shows how to create a table that uses a keyword as
the table name:
CREATE TABLE "TABLE" (...)
Using Double Quotes Within a Delimited Identier
If you want to include a double-quote (") within a delimited identier, you
must precede the double-quote (") with another double-quote ("), as shown
in the following example:
CREATE TABLE "My""Good""Data" (...)
Potential Ambiguities and Syntax Errors
Although you can use almost any word as an SQL identier, syntactic
ambiguities can occur. An ambiguous statement might not produce the
desired results. The following sections outline some potential pitfalls and
workarounds.
Using Functions as Column Names
The following two examples show a workaround for using a function as a
column name in a SELECT statement. This workaround applies to the
aggregate functions (AVG, COUNT, MAX, MIN, SUM) as well as the function
expressions (algebraic, exponential and logarithmic, time, hex, length,
dbinfo, trigonometric, and trim functions).
Using avg as a column name causes the following example to fail because the
database server interprets avg as an aggregate function rather than as a
column name:
SELECT avg FROM mytab -- fails
1-730 Informi x Gui de to SQL: Syntax
Identi er
If the DELIMIDENT environment variable is set, you could use avg as a
column name as shown in the following example:
SELECT "avg" from mytab -- successful
The workaround in following example removes ambiguity by including a
table name with the column name:
SELECT mytab.avg FROM mytab
If you use the keyword TODAY, CURRENT, or USER as a column name,
ambiguity can occur, as shown in the following example:
CREATE TABLE mytab (user char(10),
CURRENT DATETIME HOUR TO SECOND,TODAY DATE)
INSERT INTO mytab VALUES('josh','11:30:30','1/22/89')
SELECT user,current,today FROM mytab
The database server interprets user, current, and today in the SELECT
statement as the SQL functions USER, CURRENT, and TODAY. Thus, instead of
returning josh, 11:30:30,1/22/89, the SELECT statement returns the current
user name, the current time, and the current date.
If you want to select the actual columns of the table, you must write the
SELECT statement in one of the following ways:
SELECT mytab.user, mytab.current, mytab.today FROM mytab;
EXEC SQL select * from mytab;
Using Keywords as Column Names
Specic workarounds exist for using a keyword as a column name in a
SELECT statement or other SQL statement. In some cases, there might be more
than one suitable workaround.
Using ALL, DISTINCT, or UNIQUE as a Column Name
If you want to use the ALL, DISTINCT, or UNIQUE keywords as column names
in a SELECT statement, you can take advantage of a workaround.
SQL Statements 1-731
Identi er
First, consider what happens when you try to use one of these keywords
without a workaround. In the following example, using all as a column name
causes the SELECT statement to fail because the database server interprets all
as a keyword rather than as a column name:
SELECT all FROM mytab -- fails
You need to use a workaround to make this SELECT statement execute
successfully. If the DELIMIDENT environment variable is set, you can use all
as a column name by enclosing all in double quotes. In the following
example, the SELECT statement executes successfully because the database
server interprets all as a column name:
SELECT "all" from mytab -- successful
The workaround in the following example uses the keyword ALL with the
column name all:
SELECT ALL all FROM mytab
The rest of the examples in this section show workarounds for using the
keywords UNIQUE or DISTINCT as a column name in a CREATE TABLE
statement.
Using unique as a column name causes the following example to fail because
the database server interprets unique as a keyword rather than as a column
name:
CREATE TABLE mytab (unique INTEGER) -- fails
The workaround shown in the following example uses two SQL statements.
The rst statement creates the column mycol; the second renames the column
mycol to unique.
CREATE TABLE mytab (mycol INTEGER)
RENAME COLUMN mytab.mycol TO unique
The workaround in the following example also uses two SQL statements. The
rst statement creates the column mycol; the second alters the table, adds the
column unique, and drops the column mycol.
CREATE TABLE mytab (mycol INTEGER)
ALTER TABLE mytab
ADD (unique integer)
DROP (mycol)
1-732 Informi x Gui de to SQL: Syntax
Identi er
Using INTERVAL or DATETIME as a Column Name
The examples in this section show workarounds for using the keyword
INTERVAL (or DATETIME) as a column name in a SELECT statement.
Using interval as a column name causes the following example to fail
because the database server interprets interval as a keyword and expects it
to be followed by an INTERVAL qualier:
SELECT interval FROM mytab -- fails
If the DELIMIDENT environment variable is set, you could use interval as a
column name, as shown in the following example:
SELECT "interval" from mytab -- successful
The workaround in the following example removes ambiguity by specifying
a table name with the column name:
SELECT mytab.interval FROM mytab;
The workaround in the following example includes an owner name with the
table name:
SELECT josh.mytab.interval FROM josh.mytab;
Using rowid as a Column Name
Every nonfragmented table has a virtual column named rowid. To avoid
ambiguity, you cannot use rowid as a column name. Performing the
following actions causes an error:
I Creating a table or view with a column named rowid
I Altering a table by adding a column named rowid
I Renaming a column to rowid
You can, however, use the term rowid as a table name.
CREATE TABLE rowid (column INTEGER,
date DATE, char CHAR(20))
Important: Informix recommends that you use primary keys as an access method
rather than exploiting the rowid column.
SQL Statements 1-733
Identi er
Using Keywords as Table Names
The examples in this section show workarounds that involve owner naming
when you use the keyword STATISTICS or OUTER as a table name. This
workaround also applies to the use of STATISTICS or OUTER as a view name
or synonym.
Using statistics as a table name causes the following example to fail because
the database server interprets it as part of the UPDATE STATISTICS syntax
rather than as a table name in an UPDATE statement:
UPDATE statistics SET mycol = 10
The workaround in the following example species an owner name with the
table name, to avoid ambiguity:
UPDATE josh.statistics SET mycol = 10
Using outer as a table name causes the following example to fail because the
database server interprets outer as a keyword for performing an outer join:
SELECT mycol FROM outer -- fails
The workaround in the following example uses owner naming to avoid
ambiguity:
SELECT mycol FROM josh.outer
Workarounds That Use the Keyword AS
In some cases, although a statement is not ambiguous and the syntax is
correct, the database server returns a syntax error. The preceding pages show
existing syntactic workarounds for several situations. You can use the AS
keyword to provide a workaround for the exceptions.
You can use the AS keyword in front of column labels or table aliases.
The following example uses the AS keyword with a column label:
SELECT column-name AS display-label FROM table-name
The following example uses the AS keyword with a table alias:
SELECT select-list FROM table-name AS table-alias
1-734 Informi x Gui de to SQL: Syntax
Identi er
Using AS with Column Labels
The examples in this section show workarounds that use the AS keyword
with a column label. The rst two examples show how you can use the
keyword UNITS (or YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, or
FRACTION) as a column label.
Using units as a column label causes the following example to fail because
the database server interprets it as a DATETIME qualier for the column
named mycol:
SELECT mycol units FROM mytab
The workaround in the following example includes the AS keyword:
SELECT mycol AS units FROM mytab;
The following examples show how the AS or FROM keyword can be used as
a column label.
Using as as a column label causes the following example to fail because the
database server interprets as as identifying from as a column label and thus
nds no required FROM clause:
SELECT mycol as from mytab -- fails
The following example repeats the AS keyword:
SELECT mycol AS as from mytab
Using from as a column label causes the following example to fail because
the database server expects a table name to follow the rst from:
SELECT mycol from FROM mytab -- fails
The following example uses the AS keyword to identify the rst from as a
column label:
SELECT mycol AS from FROM mytab
Using AS with Table Aliases
The examples in this section show workarounds that use the AS keyword
with a table alias. The rst pair shows how to use the ORDER, FOR, GROUP,
HAVING, INTO, UNION, WITH, CREATE, GRANT, or WHERE keyword as a
table alias.
SQL Statements 1-735
Identi er
Using order as a table alias causes the following example to fail because the
database server interprets order as part of an ORDER BY clause:
SELECT * FROM mytab order -- fails
The workaround in the following example uses the keyword AS to identify
order as a table alias:
SELECT * FROM mytab AS order;
The following two examples show how to use the keyword WITH as a table
alias.
Using with as a table alias causes the following example to fail because the
database server interprets the keyword as part of the WITH CHECK OPTION
syntax:
EXEC SQL select * from mytab with; -- fails
The workaround in the following example uses the keyword AS to identify
with as a table alias:
EXEC SQL select * from mytab as with;
The following two examples show how to use the keyword CREATE (or
GRANT) as a table alias.
Using create as a table alias causes the following example to fail because the
database server interprets the keyword as part of the syntax to create an
entity such as a table, synonym, or view:
EXEC SQL select * from mytab create; -- fails
The workaround in the following example uses the keyword AS to identify
create as a table alias:
EXEC SQL select * from mytab as create;
1-736 Informi x Gui de to SQL: Syntax
Identi er
Fetching Keywords as Cursor Names
In a few situations, no workaround exists for the syntactic ambiguity that
occurs when a keyword is used as an identier in an SQL program.
In the following example, the FETCH statement species a cursor named
next. The FETCH statement generates a syntax error because the preprocessor
interprets next as a keyword, signifying the next row in the active set and
expects a cursor name to follow next. This occurs whenever the keyword
NEXT, PREVIOUS, PRIOR, FIRST, LAST, CURRENT, RELATIVE, or ABSOLUTE is
used as a cursor name.
/* This code fragment fails */
EXEC SQL declare next cursor for
select customer_num, lname from customer;
EXEC SQL open next;
EXEC SQL fetch next into :cnum, :lname;
Using Keywords as Procedure Variable Names
If you use any of the following keywords as identiers for variables in a
procedure, you can create ambiguous syntax.
CURRENT OFF
DATETIME ON
GLOBAL PROCEDURE
INTERVAL SELECT
NULL
SQL Statements 1-737
Identi er
Using CURRENT, DATETIME, INTERVAL, and NULL in INSERT
You cannot use the CURRENT, DATETIME, INTERVAL, or NULL keyword as
the name of a procedure with the INSERT statement.
For example, if you dene a variable called null, when you try to insert the
value null into a column, you receive a syntax error, as shown in the
following example:
CREATE PROCEDURE problem()
.
.
.
DEFINE null INT;
LET null = 3;
INSERT INTO tab VALUES (null); -- error, inserts NULL, not 3
Using NULL and SELECT in a Condition
If you dene a variable with the name null or select, using it in a condition that
uses the IN keyword is ambiguous. The following example shows three
conditions that cause problems: in an IF statement, in a WHERE clause of a
SELECT statement, and in a WHILE condition:
CREATE PROCEDURE problem()
.
.
.
DEFINE x,y,select, null, INT;
DEFINE pfname CHAR[15];
LET x = 3; LET select = 300;
LET null = 1;
IF x IN (select, 10, 12) THEN LET y = 1; -- problem if
IF x IN (1, 2, 4) THEN
SELECT customer_num, fname INTO y, pfname FROM customer
WHERE customer IN (select , 301 , 302, 303); -- problem in
WHILE x IN (null, 2) -- problem while
.
.
.
END WHILE;
1-738 Informi x Gui de to SQL: Syntax
Identi er
You can use the variable select in an IN list if you ensure it is not the rst
element in the list. The workaround in the following example corrects the IF
statement shown in the preceding example:
IF x IN (10, select, 12) THEN LET y = 1; -- problem if
No workaround exists to using null as a variable name and attempting to use
it in an IN condition.
Using ON, OFF, or PROCEDURE with TRACE
If you dene a procedure variable called on, off, or procedure, and you attempt
to use it in a TRACE statement, the value of the variable does not trace.
Instead, the TRACE ON, TRACE OFF, or TRACE PROCEDURE statements
execute. You can trace the value of the variable by making the variable into a
more complex expression. The following example shows the ambiguous
syntax and the workaround:
DEFINE on, off, procedure INT;
TRACE on; --ambiguous
TRACE 0+ on; --ok
TRACE off; --ambiguous
TRACE ''||off; --ok
TRACE procedure;--ambiguous
TRACE 0+procedure;--ok
Using GLOBAL as a Variable Name
If you attempt to dene a variable with the name global, the dene operation
fails. The syntax shown in the following example conicts with the syntax for
dening global variables:
DEFINE global INT; -- fails;
If the DELIMIDENT environment variable is set, you could use global as a
variable name, as shown in the following example:
DEFINE "global" INT; -- successful
SQL Statements 1-739
Identi er
Using EXECUTE, SELECT, or WITH as Cursor Names
Do not use an EXECUTE, SELECT, or WITH keyword as the name of a cursor.
If you try to use one of these keywords as the name of a cursor in a FOREACH
statement, the cursor name is interpreted as a keyword in the FOREACH
statement. No workaround exists.
The following example does not work:
DEFINE execute INT;
FOREACH execute FOR SELECT col1 -- error, looks like
-- FOREACH EXECUTE PROCEDURE
INTO var1 FROM tab1; --
SELECT Statements in WHILE and FOR Statements
If you use a SELECT statement in a WHILE or FOR loop, and if you need to
enclose it in parentheses, enclose the entire SELECT statement in a
BEGIN...END block. The SELECT statement in the rst WHILE statement in the
following example is interpreted as a call to the procedure var1; the second
WHILE statement is interpreted correctly:
DEFINE var1, var2 INT;
WHILE var2 = var1
SELECT col1 INTO var3 FROM TAB -- error, seen as call var1()
UNION
SELECT co2 FROM tab2;
END WHILE
WHILE var2 = var1
BEGIN
SELECT col1 INTO var3 FROM TAB -- ok syntax
UNION
SELECT co2 FROM tab2;
END
END WHILE
The SET Keyword in the ON EXCEPTION Statement
If you use a statement that begins with the keyword SET inside the statement
ON EXCEPTION, you must enclose it in a BEGIN...END block. The following
list shows some of the SQL statements that begin with the keyword SET.
SET SET LOCK MODE
SET DEBUG FILE SET LOG
SET EXPLAIN SET OPTIMIZATION
SET ISOLATION SET PDQPRIORITY
1-740 Informi x Gui de to SQL: Syntax
Identi er
The following examples show incorrect and correct use of a SET LOCK MODE
statement inside an ON EXCEPTION statement.
The following ON EXCEPTION statement returns an error because the SET
LOCK MODE statement is not enclosed in a BEGIN...END block:
ON EXCEPTION IN (-107)
SET LOCK MODE TO WAIT; -- error, value expected, not 'lock'
END EXCEPTION
The following ON EXCEPTION statement executes successfully because the
SET LOCK MODE statement is enclosed in a BEGIN...END block:
ON EXCEPTION IN (-107)
BEGIN
SET LOCK MODE TO WAIT; -- ok
END
END EXCEPTION
References
In the INFORMIX-OnLine Dynamic Server Performance Guide, see the owner-
naming discussion.
In Chapter 3 of the Guide to GLS Functionality, see the discussion of identiers
that support non-ASCII characters and the discussion of non-ASCII characters
in delimited identiers.
SQL Statements 1-741
Index Name
Index Name
The Index Name segment species the name of an index. Use the Index
Name segment whenever you see a reference to an index name in a syntax
diagram.
Syntax
Element Purpose Restrictions Syntax
database The name of the database where
the index resides
The database must exist. Database Name,
p. 1-660
dbservername The name of the OnLine
database server that is home to
database. The @ symbol is a literal
character that introduces the
database server name.
The database server that is
specied in dbservername must
match the name of a database
server in the sqlhosts le.
Database Name,
p. 1-660
owner The user name of the owner of
the index
If you are using an ANSI-
compliant database, you must
specify the owner for an index
that you do not own. If you put
quotation marks around the
name that you enter in owner, the
name is stored exactly as typed.
If you do not put quotation
marks around the name you
enter inowner, the name is stored
as uppercase letters.
The user name must
conform to the
conventions of your
operating system.
@ dbservername
database
OL
Identier
p. 1-723
: 'owner'.
owner.
1-742 Informi x Gui de to SQL: Syntax
Index Name
Usage
The actual name of the index is an SQL identier.
If you are using a nondefault locale, you can use characters from the code set
of your locale in the names of indexes. For more information, see Chapter 3
of the Guide to GLS Functionality.
If you are creating an index, the name must be unique within a database.
The owner.name combination is case sensitive. In anANSI-compliant database,
if you do not use quotes around the owner name, the name of the table owner
is stored as uppercase letters. For more information, see the discussion of case
sensitivity in ANSI-compliant databases on page 1-770.
References
See the CREATE INDEX statement in this manual for information on dening
indexes.
GLS
ANSI
SQL Statements 1-743
INTERVAL Fi el d Qual i er
INTERVAL Field Qualier
The INTERVAL eld qualier species the units for an INTERVAL value. Use
the INTERVAL Field Qualier segment whenever you see a reference to an
INTERVAL eld qualier in a syntax diagram.
Syntax
YEAR
MONTH
DAY
MINUTE
SECOND
FRACTION
TO YEAR
TO MONTH
TO DAY
TO HOUR
TO MINUTE
TO SECOND
TO FRACTION
HOUR
(precision)
(precision)
(precision)
(precision)
(y-precision)
(precision)
(f-precision)
(2)
(4)
(2)
(2)
(2)
(2)
(3)
1-744 Informi x Gui de to SQL: Syntax
INTERVAL Fi el d Qual i er
Usage
The next two examples showINTERVAL data types of the YEAR TO MONTH
type. The rst example can hold an interval of up to 999 years and 11 months,
because it gives 3 as the precision of the year eld. The second example uses
the default precision on the year eld, so it can hold an interval of up to 9,999
years and 11 months.
YEAR (3) TO MONTH
YEAR TO MONTH
When you want a value to contain only one eld, the rst and last qualiers
are the same. For example, an interval of whole years is qualied as YEAR TO
YEAR or YEAR (5) TO YEAR, for an interval of up to 99,999 years.
The following examples show several forms of INTERVAL qualiers:
YEAR(5) TO MONTH
DAY (5) TO FRACTION(2)
DAY TO DAY
FRACTION TO FRACTION (4)
Element Purpose Restrictions Syntax
f-precision The maximum number of digits
used in the fraction eld. The
default value of f-precision is 3.
The maximum value that you
can specify in f-precision is 5.
Literal Number,
p. 1-752
precision The number of digits in the
largest number of months, days,
hours, or minutes that the
interval can hold. The default
value of precision is 2.
The maximum value that you
can specify in precision is 9.
Literal Number,
p. 1-752
y-precision The number of digits in the
largest number of years that the
interval can hold. The default
value of y-precision is 4.
The maximum value that you
can specify in y-precision is 9.
Literal Number,
p. 1-752
SQL Statements 1-745
INTERVAL Fi el d Qual i er
References
In the Informix Guide to SQL: Reference, see the INTERVAL data type in
Chapter 3 for information about specifying INTERVAL eld qualiers and
using INTERVAL data in arithmetic and relational operations.
1-746 Informi x Gui de to SQL: Syntax
Li teral DATETIME
Literal DATETIME
The literal DATETIME segment species a literal DATETIME value. Use the
literal DATETIME segment whenever you see a reference to a literal
DATETIME in a syntax diagram.
Syntax
DATETIME
yyyy
mo
dd
space
hh
mi
ss
f
Numeric Date
DATETIME
Field Qualier
p. 1-669
Numeric
Date
-
:
:
.
) (
-
SQL Statements 1-747
Li teral DATETIME
Usage
You must specify both a numeric date and a DATETIME eld qualier for this
date in the Literal DATETIME segment. The DATETIME eld qualier must
correspond to the numeric date you specify. For example, if you specify a
numeric date that includes a year as the largest unit and a minute as the
smallest unit, you must specify YEAR TO MINUTE as the DATETIME eld
qualier.
Element Purpose Restrictions Syntax
dd The day expressed in digits You can specify up to 2 digits. Literal Number,
p. 1-752
f The decimal fraction of a second
expressed in digits
You can specify up to 5 digits. Literal Number,
p. 1-752
hh The hour expressed in digits You can specify up to 2 digits. Literal Number,
p. 1-752
mi The minute expressed in digits You can specify up to 2 digits. Literal Number,
p. 1-752
mo The month expressed in digits You can specify up to 2 digits. Literal Number,
p. 1-752
space A space character You cannot specify more than 1
space character.
The space character
is a literal value that
you enter by
pressing the space
bar on the keyboard.
ss The second expressed in digits You can specify up to 2 digits. Literal Number,
p. 1-752
yyyy The year expressed in digits You can specify up to 4 digits. If
you specify 2 digits, the database
server uses the setting of the
DBCENTURY environment
variable to extend the year
value. If the DBCENTURY
environment variable is not set,
the database server uses the
current century to extend the
year value.
Literal Number,
p. 1-752
1-748 Informi x Gui de to SQL: Syntax
Li teral DATETIME
The following examples show literal DATETIME values:
DATETIME (93-3-6) YEAR TO DAY
DATETIME (09:55:30.825) HOUR TO FRACTION
DATETIME (93-5) YEAR TO MONTH
The following example shows a literal DATETIME value used with the
EXTEND function:
EXTEND (DATETIME (1993-8-1) YEAR TO DAY, YEAR TO MINUTE)
- INTERVAL (720) MINUTE (3) TO MINUTE
References
In the Informix Guide to SQL: Reference, see the DATETIME data type in
Chapter 3 and the DBCENTURY environment variable in Chapter 4.
In Chapter 1 of the Guide to GLS Functionality, see the discussion of custom-
izing DATETIME values for a locale.
SQL Statements 1-749
Li teral INTERVAL
Literal INTERVAL
The Literal INTERVAL segment species a literal INTERVAL value. Use the
Literal INTERVAL segment whenever you see a reference to a literal
INTERVAL in a syntax diagram.
Syntax
INTERVAL
yyyy
mo
dd
space
hh
mi
ss
f
INTERVAL
Field Qualier
p. 1-743
Numeric Date
Numeric Date
-
:
:
.
) (
1-750 Informi x Gui de to SQL: Syntax
Li teral INTERVAL
Element Purpose Restrictions Syntax
dd The number of days The maximum number of digits
allowed is 2, unless this is the
rst eld and the precision is
specied differently by the
INTERVAL eld qualier.
Literal Number,
p. 1-752
f The decimal fraction of a second You can specify up to 5 digits,
depending on the precision
given to the fractional portion in
the INTERVAL eld qualier.
Literal Number,
p. 1-752
hh The number of hours The maximum number of digits
allowed is 2, unless this is the
rst eld and the precision is
specied differently by the
INTERVAL eld qualier.
Literal Number,
p. 1-752
mi The number of minutes The maximum number of digits
allowed is 2, unless this is the
rst eld and the precision is
specied differently by the
INTERVAL eld qualier.
Literal Number,
p. 1-752
mo The number of months The maximum number of digits
allowed is 2, unless this is the
rst eld and the precision is
specied differently by the
INTERVAL eld qualier.
Literal Number,
p. 1-752
space A space character You cannot use any other
character in place of the space
character.
The space character
is a literal value that
you enter by
pressing the space
bar on the keyboard.
ss The number of seconds The maximum number of digits
allowed is 2, unless this is the
rst eld and the precision is
specied differently by the
INTERVAL eld qualier.
Literal Number,
p. 1-752
yyyy The number of years The maximum number of digits
allowed is 4, unless this is the
rst eld and the precision is
specied differently by the
INTERVAL eld qualier.
Literal Number,
p. 1-752
SQL Statements 1-751
Li teral INTERVAL
Usage
The following examples show literal INTERVAL values:
INTERVAL (3-6) YEAR TO MONTH
INTERVAL (09:55:30.825) HOUR TO FRACTION
INTERVAL (40 5) DAY TO HOUR
References
In the Informix Guide to SQL: Reference, see the INTERVAL data type in
Chapter 3 for information about using INTERVAL data in arithmetic and
relational operations.
1-752 Informi x Gui de to SQL: Syntax
Li teral Number
Literal Number
A literal number is an integer or noninteger (oating) constant. Use the
Literal Number segment whenever you see a reference to a literal number in
a syntax diagram.
Syntax
Usage
Literal numbers do not contain embedded commas; you cannot use a comma
to indicate a decimal point. You can precede literal numbers with a plus or a
minus sign.
Element Purpose Restrictions Syntax
digit A digit that forms part of the
literal number. See Floating and
Decimal Numbers on
page 1-753 for the signicance of
digits that follow the decimal
point or the E symbol.
You must specify a value
between 0 and 9, inclusive.
Digits are literal
values that you enter
from the keyboard.
digit
digit E
digit
digit
+
-
.
.
+
-
SQL Statements 1-753
Li teral Number
Integers
Integers do not contain decimal points. The following examples show some
integers:
10 -27 25567
Floating and Decimal Numbers
Floating and decimal numbers contain a decimal point and/or exponential
notation. The following examples show oating and decimal numbers:
123.456 1.23456E2 123456.0E-3
The digits to the right of the decimal point in these examples are the decimal
portions of the numbers.
The E that occurs in two of the examples is the symbol for exponential
notation. The digit that follows E is the value of the exponent. For example,
the number 3E5 (or 3E+5) means 3 multiplied by 10 to the fth power, and
the number 3E-5 means 3 multiplied by 10 to the minus fth power.
Literal Numbers and the MONEY Data Type
When you use a literal number as a MONEY value, do not precede it with a
money symbol or include commas.
References
See the discussions of numeric data types, such as DECIMAL, FLOAT,
INTEGER, and MONEY, in Chapter 3 of the Informix Guide to SQL: Reference.
1-754 Informi x Gui de to SQL: Syntax
Procedure Name
Procedure Name
The Procedure Name segment species the name of a stored procedure. Use
the Procedure Name segment whenever you see a reference to a procedure
name in a syntax diagram.
Syntax
Element Purpose Restrictions Syntax
database The name of the database where
the procedure resides
The database must exist. Database Name,
p. 1-660
dbservername The name of the OnLine
database server that is home to
database. The @ symbol is a literal
character that introduces the
database server name.
The database server that is
specied in dbservername must
match the name of a database
server in the sqlhosts le.
Database Name,
p. 1-660
owner The user name of the owner of
the procedure
If you are using an ANSI-
compliant database, you must
specify an owner for a procedure
you do not own. If you put
quotation marks around the
name you enter in owner, the
name is stored exactly as typed.
If you do not put quotation
marks around the name you
enter inowner, the name is stored
as uppercase letters.
The user name must
conform to the
conventions of your
operating system.
@ dbservername
owner.
database
+
Identier
p. 1-723
:
'owner'
OL
SQL Statements 1-755
Procedure Name
Usage
The actual name of the procedure is an SQL identier.
If you are using a nondefault locale, you can use characters from the code set
of your locale in the names of procedures. For more information, see
Chapter 3 of the Guide to GLS Functionality.
If you are creating the procedure, the name of the procedure must be unique
within a database.
If you are creating the procedure, the combination owner.name must be
unique within a database.
The owner name is case sensitive. In an ANSI-compliant database, if you do
not use quotes around the owner name, the name of the table owner is stored
as uppercase letters. For more information, see the discussion of case sensi-
tivity in ANSI-compliant databases on page 1-770.
Procedures and SQL Functions with the Same Names
If you create a procedure with the same name as an SQL function and then
explicitly dene that name as a procedure, any calls by that name are to the
procedure instead of the SQL function. That is, you cannot use the system
function within the statement block in which the procedure is dened.
The following example uses two length functions. The rst time the
procedure calls the length function, it is the SQL function named LENGTH.
The second time the procedure calls the length function is within a
BEGIN...END block in which length has been dened as a procedure. The
second call to length actually uses the user-created procedure called length.
CREATE PROCEDURE test_len()
RETURNING INT, INT;
DEFINE c INT;
DEFINE d INT;
LET c = (SELECT length(fname) FROM customer
WHERE customer_num = 101);
BEGIN
DEFINE length PROCEDURE;
GLS
ANSI
1-756 Informi x Gui de to SQL: Syntax
Procedure Name
LET d = length(5);
END
RETURN c, d;
END PROCEDURE;
References
See the CREATE PROCEDURE statement in this manual for information on
creating procedures.
In the Informix Guide to SQL: Tutorial, see the discussion of creating and using
stored procedures in Chapter 12.
SQL Statements 1-757
Quoted Stri ng
Quoted String
A quoted string is a string constant that is surrounded by quotation marks.
Use the Quoted String segment whenever you see a reference to a quoted
string in a syntax diagram.
Syntax
Element Purpose Restrictions Syntax
character A character that forms part of
the quoted string
The character or characters in
the quoted string cannot be
surrounded by double quotes if
the DELIMIDENT environment
variable is set. For additional
restrictions see Restrictions on
Specifying Characters in Quoted
Strings on page 1-758.
Characters are literal
values that you enter
from the keyboard.
character
character
' '
"
' '
" "
"
+
1-758 Informi x Gui de to SQL: Syntax
Quoted Stri ng
Restrictions on Specifying Characters in Quoted Strings
You must observe the following restrictions when you specify character in
quoted strings:
I If you are using the ASCII code set, you can specify any printable
ASCII character, including a single quote or double quote. For restric-
tions that apply to using quotes within quoted strings, see Using
Quotes in Strings on page 1-759.
I If you are using a nondefault locale, you can specify non-ASCII
characters, including multibyte characters, that the code set of your
locale supports. See the discussion of quoted strings in Chapter 3 of
the Guide to GLS Functionality for further information.
I When you set the DELIMIDENT environment variable, you cannot
use double quotes to delimit a quoted string. When DELIMIDENT is
set, a string enclosed in double quotes is an identier, not a quoted
string. When DELIMIDENT is not set, a string enclosed in double
quotes is a quoted string, not an identier. See Using Quotes in
Strings on page 1-759 for further information.
I You can enter DATETIME and INTERVAL data as quoted strings. See
DATETIME and INTERVAL Values as Strings on page 1-759 for
the restrictions that apply to entering DATETIME and INTERVAL data
in quoted-string format.
I Quoted strings that are used with the LIKE or MATCHES keyword in
a search condition can include wildcard characters that have a
special meaning in the search condition. See LIKE and MATCHES
in a Condition on page 1-759 for further information.
I When you insert a value that is a quoted string, you must observe a
number of restrictions. See Inserting Values as Quoted Strings on
page 1-760 for further information.
Usage
The string constant must be written on a single line; that is, you cannot use
embedded new lines.
GLS
SQL Statements 1-759
Quoted Stri ng
Using Quotes in Strings
The single quote has no special signicance in string constants delimited by
double quotes. Likewise, the double quote has no special signicance in
strings delimited by single quotes. For example, the following strings are
valid:
"Nancy's puppy jumped the fence"
'Billy told his kitten, "no!" '
If your string is delimited by double quotes, you can include a double quote
in the string by preceding the double quote with another double quote, as
shown in the following string:
"Enter ""y"" to select this row"
When the DELIMIDENT environment variable is set, double quotes delimit
identiers, not strings. See Delimited Identiers on page 1-726 for further
information on delimited identiers.
DATETIME and INTERVAL Values as Strings
You can enter DATETIME and INTERVAL data in the literal forms described in
the Literal DATETIME and Literal INTERVAL segments beginning on
pages 1-746 and 1-749, respectively, or you can enter them as quoted strings.
Valid literals that are entered as character strings are converted automatically
into DATETIME or INTERVAL values. The following INSERT statements use
quoted strings to enter INTERVAL and DATETIME data:
INSERT INTO cust_calls(call_dtime) VALUES ('1993-5-4 10:12:11')
INSERT INTO manufact(lead_time) VALUES ('14')
The format of the value in the quoted string must exactly match the format
specied by the qualiers of the column. For the rst case in the preceding
example, call_dtime must be dened with the qualiers YEAR TO MINUTE
for the INSERT statement to be valid.
LIKE and MATCHES in a Condition
Quoted strings with the LIKE or MATCHES keyword in a condition can
include wildcard characters. See the Condition segment beginning on
page 1-643 for a complete description of how to use wildcard characters.
1-760 Informi x Gui de to SQL: Syntax
Quoted Stri ng
Inserting Values as Quoted Strings
If you are inserting a value that is a quoted string, you must adhere to the
following conventions:
I Enclose CHAR, VARCHAR, NCHAR, NVARCHAR, DATE, DATETIME,
and INTERVAL values in quotation marks.
I Set DATE values in the mm/dd/yyy format.
I You cannot insert strings longer than 256 bytes.
I Numbers with decimal values must contain a decimal point. You
cannot use a comma as a decimal indicator.
I You cannot precede MONEY data with a dollar sign ($) or include
commas.
I You can include NULL as a placeholder only if the column accepts
null values.
References
In the Informix Guide to SQL: Reference, see the discussion of the DELIMIDENT
environment variable in Chapter 4.
In Chapter 3 of the Guide to GLS Functionality, see the discussion of quoted
strings.
SQL Statements 1-761
Rel ati onal Operator
Relational Operator
A relational operator compares two expressions quantitatively. Use the
Relational Operator segment whenever you see a reference to a relational
operator in a syntax diagram.
Syntax
Each operator shown in the syntax diagram has a particular meaning.
+
<
<=
>
<>
=
>=
!=
Relational Operator Meaning
< Less than
<= Less than or equal to
> Greater than
= Equal to
>= Greater than or equal to
<> Not equal to
!= Not equal to
1-762 Informi x Gui de to SQL: Syntax
Rel ati onal Operator
Usage
For DATE and DATETIME expressions, greater than means later in time.
For INTERVAL expressions, greater than means a longer span of time.
For CHAR and VARCHAR expressions, greater than means after in code-set
order.
Locale-based collation order is used for NCHAR andNVARCHAR expressions.
So for NCHAR and NVARCHAR expressions, greater than means after in the
locale-based collation order. See Chapter 3 of the Guide to GLS Functionality
for further information on locale-based collation order and the NCHAR and
NVARCHAR data types.
Collating Order for English Data
If you are using the default locale (U.S. English), the database server uses the
code-set order of the default code set when it compares the character expres-
sions that precede and follow the relational operator. On UNIX platforms, the
default code set is the ISO8859-1 code set, which consists of the following sets
of characters:
I The ASCII characters have code points in the range of 0 to 127.
This range contains control characters, punctuation symbols,
English-language characters, and numerals.
I The 8-bit characters have code points in the range 128 to 255.
This range includes many non-English-language characters (such as
, , , and ) and symbols (such as , , and ).
GLS
SQL Statements 1-763
Rel ati onal Operator
The following table shows the ASCII code set. The Numcolumn shows the
ASCII code numbers, and the Char column shows the ASCII character corre-
sponding to each ASCII code number. ASCII characters are sorted according
to their ASCII code number. Thus lowercase letters follow uppercase letters,
and both follow numerals. In this table, the caret symbol (^) stands for the
CTRL key. For example, ^X means CTRL-X.
Num Char Num Char Num Char
0 ^@ 43 + 86 V
1 ^A 44 , 87 W
2 ^B 45 - 88 X
3 ^C 46 . 89 Y
4 ^D 47 / 90 Z
5 ^E 48 0 92 [
6 ^F 49 1 93 \
7 ^G 50 2 94 ]
8 ^H 51 3 94 ^
9 ^I 52 4 95 _
10 ^J 53 5 96 `
11 ^K 54 6 97 a
12 ^L 55 7 98 b
13 ^M 56 8 99 c
14 ^N 57 9 100 d
15 ^O 58 : 101 e
16 ^P 59 ; 102 f
17 ^Q 60 < 103 g
18 ^R 61 = 104 h
19 ^S 62 > 105 i
(1 of 2)
1-764 Informi x Gui de to SQL: Syntax
Rel ati onal Operator
20 ^T 63 ? 106 j
21 ^U 64 @ 107 k
22 ^V 65 A 108 l
23 ^W 66 B 109 m
24 ^X 67 C 110 n
25 ^Y 68 D 111 o
26 ^Z 69 E 112 p
27 esc 70 F 113 q
28 ^\ 71 G 114 r
29 ^] 72 H 115 s
30 ^^ 73 I 116 t
31 ^_ 74 J 117 u
32 75 K 118 v
33 ! 76 L 119 w
34 " 77 M 120 x
35 # 78 N 121 y
36 $ 79 O 122 z
37 % 80 P 123 {
38 & 81 Q 124 |
39 ' 82 R 125 }
40 ( 83 S 126 ~
41 ) 84 T 127 del
42 * 85 U
Num Char Num Char Num Char
(2 of 2)
SQL Statements 1-765
Rel ati onal Operator
Support for ASCII Characters in Nondefault Code Sets
Most code sets in nondefault locales (called nondefault code sets) support the
ASCII characters. If you are using a nondefault locale, the database server
uses ASCII code-set order for any ASCII data in CHAR and VARCHAR expres-
sions, as long as the nondefault code set supports these ASCII characters.
References
In the Informix Guide to SQL: Tutorial, see the discussion of relational
operators in the SELECT statement in Chapter 2.
In Chapter 3 of the Guide to GLS Functionality, see the discussion of relational
operator conditions in the SELECT statement.
GLS
1-766 Informi x Gui de to SQL: Syntax
Synonym Name
Synonym Name
The Synonym Name segment species the name of a synonym. Use the
Synonym Name segment whenever you see a reference to a synonym name
in a syntax diagram.
Syntax
Element Purpose Restrictions Syntax
database The name of the database where
the synonym resides
The database must exist. Database Name,
p. 1-660
dbservername The name of the OnLine
database server that is home to
database. The @ symbol is a literal
character that introduces the
database server name.
The database server specied in
dbservername must match the
name of a database server in the
sqlhosts le.
Database Name,
p. 1-660
owner The user name of the owner of
the synonym
If you are using an ANSI-
compliant database, you must
specify the owner for a synonym
that you do not own. If you put
quotation marks around the
name that you enter in owner, the
name is stored exactly as typed.
If you do not put quotation
marks around the name that you
enter inowner, the name is stored
as uppercase letters.
The user name must
conform to the
conventions of your
operating system.
@ dbservername
owner.
database
OL
:
+
'owner'.
Identier
p. 1-723
SQL Statements 1-767
Synonym Name
Usage
The actual name of the synonym is an SQL identier.
If you are using a nondefault locale, you can use characters from the code set
of your locale in the names of synonyms. For more information, see
Chapter 3 of the Guide to GLS Functionality.
If you are creating the synonym, the name of the synonym must be unique
within a database. The name cannot be the same as table names, temporary
table names, or view names. It is possible to have a public and private
synonym with the same name.
If you are creating the synonym, the combination owner.name must be unique
within a database.
The owner name is case sensitive. In an ANSI-compliant database, if you do
not use quotes around the owner name, the name of the table owner is stored
in uppercase letters. For more information, see the discussion of case
sensitivity in ANSI-compliant databases on page 1-770.
References
See the CREATE SYNONYM statement in this manual for information on
creating synonyms.
In the Informix Guide to SQL: Tutorial, see the discussion of synonyms in
Chapter 11.
GLS
ANSI
1-768 Informi x Gui de to SQL: Syntax
Tabl e Name
Table Name
The Table Name segment species the name of a table. Use the Table Name
segment whenever you see a reference to a table name in a syntax diagram.
Syntax
@ dbservername
owner.
database :
+
Identier
p. 1-723
OL
'owner'.
SQL Statements 1-769
Tabl e Name
Element Purpose Restrictions Syntax
database The name of the database where
the table resides
The database must exist. Database Name,
p. 1-660
dbservername The name of the OnLine
database server that is home to
database. The @ symbol is a literal
character that introduces the
database server name.
The database server that is
specied in dbservername must
match the name of a database
server in the sqlhosts le.
Database Name,
p. 1-660
owner The user name of the owner of
the table
If you are using an ANSI-
compliant database, you must
specify the owner for a table that
you do not own. If you put
quotation marks around the
name that you enter in owner, the
name is stored exactly as typed.
If you do not put quotation
marks around the name that you
enter inowner, the name is stored
as uppercase letters. In SELECT
statements and other statements
that access tables in an ANSI-
compliant database, the table
owner that you specify must
exactly match the actual owner
of the table. See Case Sensi-
tivity in ANSI-Compliant
Databases on page 1-770 for
further information on this
restriction.
The user name must
conform to the
conventions of your
operating system.
1-770 Informi x Gui de to SQL: Syntax
Tabl e Name
Usage
The name of a table is an SQL identier. The following example shows a table
specication:
empinfo@personnel:emp_names
If you are using a nondefault locale, you can use characters from the code set
of your locale in the names of tables. For more information, see Chapter 3 of
the Guide to GLS Functionality.
If you are creating or renaming a table, the name of the table must be unique
among all the tables, synonyms, temporary tables, and views that already
exist in the database.
If you are creating or renaming a table, you must make sure that the
combination of owner and name is unique within a database.
In an ANSI-compliant database, the table name must include owner. unless
you are the owner. For system catalog tables, the owner is informix.
Case Sensitivity in ANSI-Compliant Databases
The database server shifts the owner name to uppercase letters before the
statement executes, unless the owner name is enclosed in quotes. Put quotes
around the owner portion of a name if you want the owner to be read exactly
as written. In the following example, the name cathl in the rst statement is
upshifted to CATHL before it is used; the name nancy in the second statement
is not upshifted:
SELECT * FROM cathl.customer
SELECT * FROM 'nancy'.customer
No problem exists if you create a table with an implicit owner in uppercase
letters and the owners real login name is also in uppercase letters. For
example, suppose that you are the user BROWN, and you create a view with
the following statement:
CREATE VIEW newcust AS
SELECT fname, lname FROM customer WHERE state = 'NJ'
GLS
ANSI
ANSI
SQL Statements 1-771
Tabl e Name
You, BROWN, can run the following SELECT statements on the view:
SELECT * FROM brown.newcust
SELECT * FROM newcust
SELECT * FROM systables WHERE tabname = newcust
AND owner = USER
In the rst query in the preceding example, the database server automatically
upshifts brown before the SELECT statement executes. In the second query,
the database server returns the owner name BROWN already upshifted. In
the third query, USER returns the login name as it is storedin this case, in
uppercase letters. If you are the user nancy, and you use the following
statement, the resulting view has the name NANCY.njcust:
CREATE VIEW nancy.njcust AS
SELECT fname, lname FROM customer WHERE state = 'NJ'
If you are nancy, and you use the following statement, the resulting view has
the name nancy.njcust:
CREATE VIEW 'nancy'.njcust AS
SELECT fname, lname FROM customer WHERE state = 'NJ'
The following SELECT statement fails because it tries to match the name
NANCY.njcust to the actual owner and table name of nancy.njcust:
SELECT * FROM nancy.njcust
References
See the CREATE TABLE statement in this manual for information on creating
tables.
In the Informix Guide to SQL: Tutorial, see the discussion of tables in Chapter 1.
1-772 Informi x Gui de to SQL: Syntax
Vi ew Name
View Name
The View Name segment species the name of a view. Use the View Name
segment whenever you see a reference to a view name in a syntax diagram.
Syntax
Element Purpose Restrictions Syntax
database The name of the database where
the view resides
The database must exist. Database Name,
p. 1-660
dbservername The name of the OnLine
database server that is home to
database. The @ symbol is a literal
character that introduces the
database server name.
The database server that is
specied in dbservername must
match the name of a database
server in the sqlhosts le.
Database Name,
p. 1-660
owner The user name of the owner of
the view
If you are using an ANSI-
compliant database, you must
specify the owner for a view that
you do not own. If you put
quotation marks around the
name you enter in owner, the
name is stored exactly as typed.
If you do not put quotation
marks around the name that you
enter inowner, the name is stored
as uppercase letters.
The user name must
conform to the
conventions of your
operating system.
@ dbservername
database
OL
+
Identier
p. 1-723
'owner'.
:
owner.
SQL Statements 1-773
Vi ew Name
Usage
The name of a view is an SQL identier.
If you are using a nondefault locale, you can use characters from the code set
of your locale in the names of views. For more information, see Chapter 3 of
the Guide to GLS Functionality.
The use of the prex owner. is optional; however, if you use it, the database
server does check owner for accuracy. If you are creating a view, the name of
the view must be unique among all the tables, synonyms, temporary tables,
and views that already exist in the database.
If you are creating a view, the owner.view-name must be unique among all the
tables, synonyms, and views that already exist in the database.
The owner name is case sensitive. In an ANSI-compliant database, if you do
not use quotes around the owner name, the name of the table owner is stored
as uppercase letters. For more information, see the discussion of case sensi-
tivity in ANSI-compliant databases on page 1-770.
References
See the CREATE VIEW statement in this manual for information on creating
views.
In the Informix Guide to SQL: Tutorial, see the discussions of views in
Chapter 10.
GLS
ANSI
2
Chapter
SPL Statements
CALL . . . . . . . . . . . . . . . . . . . . . . 2-4
CONTINUE . . . . . . . . . . . . . . . . . . . . 2-7
DEFINE . . . . . . . . . . . . . . . . . . . . . 2-8
EXIT . . . . . . . . . . . . . . . . . . . . . . 2-16
FOR. . . . . . . . . . . . . . . . . . . . . . . 2-18
FOREACH . . . . . . . . . . . . . . . . . . . . 2-23
IF . . . . . . . . . . . . . . . . . . . . . . . 2-27
LET . . . . . . . . . . . . . . . . . . . . . . . 2-31
ON EXCEPTION . . . . . . . . . . . . . . . . . . 2-34
RAISE EXCEPTION . . . . . . . . . . . . . . . . . 2-39
RETURN . . . . . . . . . . . . . . . . . . . . . 2-41
SYSTEM . . . . . . . . . . . . . . . . . . . . . 2-43
TRACE . . . . . . . . . . . . . . . . . . . . . 2-46
WHILE . . . . . . . . . . . . . . . . . . . . . 2-49
2-2 Informi x Gui de to SQL: Syntax
SPL Statements 2-3
You can use SQL statements and Stored Procedure Language (SPL)
statements to write procedures, and you can store these procedures in the
database. These stored procedures are effective tools for controlling SQL
activity.
This chapter contains descriptions of the SPL statements. The description of
each statement includes the following information:
I A brief introduction that explains the purpose of the statement
I A syntax diagram that shows how to enter the statement correctly
I A syntax table that explains each input parameter in the syntax
diagram
I Rules of usage, including examples that illustrate these rules
If a statement is composed of multiple clauses, the statement description
provides the same set of information for each clause.
For task-oriented information about using stored procedures, see Chapter 12
of the Informix Guide to SQL: Tutorial.
2-4 Informi x Gui de to SQL: Syntax
CALL
CALL
Use the CALL statement to execute a procedure from within a stored
procedure.
Syntax
Element Purpose Restrictions Syntax
parameter name The name of the parameter in the
called procedure, as dened by
its CREATE PROCEDURE
statement
Name or position, but not both,
binds procedure arguments to
procedure parameters. That is,
you can use the parameter name =
syntax for none or all the
arguments that are specied in
one CALL statement.
Identier, p. 1-723
procedure
variable
The name of a variable that
receives the value being
returned
The data type of procedure
variable must match that of the
value that is being returned.
Identier, p. 1-723
=
CALL
Procedure
Name
p. 1-754
; ( )
,
Expression
p. 1-671
SELECT
Statement
(Subset)
p. 2-6
parameter
name
Argument
Argument
RETURNING
procedure
variable
,
SPL Statements 2-5
CALL
Usage
The CALL statement invokes a procedure called procedure name. The CALL
statement is identical in behavior to the EXECUTE PROCEDURE statement, but
you can only use it from within a stored procedure.
Specifying Arguments
If CALL statement contains more arguments than the called procedure
expects, you receive an error.
If a CALL statement species fewer arguments than the called procedure
expects, the arguments are said to be missing. The database server initializes
missing arguments to their corresponding default values. (See CREATE
PROCEDURE on page 1-134.) This initialization occurs before the rst
executable statement in the body of the procedure.
If missing arguments do not have default values, the database server
initializes the arguments to the value of UNDEFINED. An attempt to use any
variable that has the value of UNDEFINED results in an error.
Either name or position, but not both, binds procedure arguments to
procedure parameters. That is, you can use the parameter name = syntax for all
or none of the arguments that are specied in one CALL statement.
Each procedure call in the following example is valid for a procedure that
expects character arguments t, n, and d, in that order:
CALL add_col (t='customer', n = 'newint', d ='integer');
CALL add_col('customer','newint','integer');
2-6 Informi x Gui de to SQL: Syntax
CALL
Subset of SELECT Allowed in a Procedure Argument
You can use any SELECT statement as the argument for a procedure if it
returns exactly one value of the proper data type and length. See the
discussion of SELECT statements on page 1-459 for more information.
Receiving Input from the Called Procedure
The RETURNING clause species the procedure variable that receives the
returned values from a procedure call. If you omit the RETURNING clause, the
called procedure does not return any values.
The following example shows two procedure calls, one that expects no
returned values (no_args) and one that expects three returned values
(yes_args). The creator of the procedure has dened three integer variables
to receive the returned values from yes_args.
CREATE PROCEDURE not_much()
DEFINE i, j, k INT;
CALL no_args (10,20);
CALL yes_args (5) RETURNING i, j, k;
END PROCEDURE
SPL Statements 2-7
CONTINUE
CONTINUE
Use the CONTINUE statement to start the next iteration of the innermost FOR,
WHILE, or FOREACH loop.
Syntax
Usage
When you encounter a CONTINUE statement, the procedure skips the rest of
the statements in the innermost loop of the indicated type. Execution
continues at the top of the loop with the next iteration. In the following
example, the procedure inserts values 3 through 15 into the table testtable.
The procedure also returns values 3 through 9 and 13 through 15 in the
process. The procedure does not return the value 11 because it encounters
the CONTINUE FOR statement. The CONTINUE FOR statement causes the
procedure to skip the RETURN i WITH RESUME statement.
CREATE PROCEDURE loop_skip()
RETURNING INT;
DEFINE i INT;
.
.
.
FOR i IN (3 TO 15 STEP 2)
INSERT INTO testtable values(i, null, null);
IF i = 11
CONTINUE FOR;
END IF;
RETURN i WITH RESUME;
END FOR;
END PROCEDURE;
The CONTINUE statement generates errors if it cannot nd the identied
loop.
CONTINUE
FOREACH
WHILE
FOR ;
2-8 Informi x Gui de to SQL: Syntax
DEFINE
DEFINE
Use the DEFINE statement to declare variables that the procedure uses and to
assign them data types.
Syntax
Element Purpose Restrictions Syntax
column name The name of a column in the
table
The column must already exist
in the table.
Identier, p. 1-723
variable name The name of the procedure
variable that is being dened
The name must be unique to the
statement block.
Identier, p. 1-723
DEFINE GLOBAL
SQL Data Type
(Subset)
p. 2-10
Default
Value
p. 2-9
DEFAULT
,
variable
name
DEFAULT
NULL
REFERENCES
REFERENCES
SQL Data Type
(Subset)
p. 2-10
BYTE
TEXT
PROCEDURE
Table Name
p. 1-768
column
name
. LIKE
BYTE
TEXT
;
,
variable
name
OL
OL
Synonym
Name
p. 1-766
View Name
p. 1-772
SPL Statements 2-9
DEFINE
Default Value Clause
Usage
The DEFINE statement is not an executable statement. The DEFINE statement
must appear after the procedure header and before any other statements. You
can use a variable anywhere within the statement block where it is dened;
that is, the scope of a dened variable is the statement block in which it was
dened.
Literal Number
p. 1-752
Quoted String
p. 1-757
Literal Interval
p. 1-749
Literal Datetime
p. 1-746
CURRENT
p. 1-680
Default
Value
TODAY
USER
DATETIME
Field Qualier
p. 1-669
SITENAME
NULL
DBSERVERNAME
OL
2-10 Informi x Gui de to SQL: Syntax
DEFINE
SQL Data Type Subset
The SQL data type subset includes all the SQL data types except SERIAL, TEXT,
and BYTE.
Dening TEXT and BYTE Variables
The REFERENCES keyword lets you use TEXT and BYTE variables. TEXT and
BYTE variables do not contain the actual data but are simply pointers to the
data. The REFERENCES keyword is a reminder that the procedure variable is
just a pointer. Use the procedure variables for TEXT and BYTE data types
exactly as you would any other variable.
Redeclaration or Redenition
If you dene the same variable twice within the same statement block, you
receive an error. You can redene a variable within a nested block, in which
case it temporarily hides the outer declaration. The following example
produces an error:
CREATE PROCEDURE example1()
DEFINE n INT; DEFINE j INT;
DEFINE n CHAR (1); -- redefinition produces an error
.
.
.
The database server allows the redeclaration in the following example.
Within the nested statement block, n is a character variable. Outside the
block, n is an integer variable.
CREATE PROCEDURE example2()
DEFINE n INT; DEFINE j INT;
.
.
.
BEGIN
DEFINE n CHAR (1); -- character n masks integer variable
-- locally
.
.
.
END
SPL Statements 2-11
DEFINE
Declaring GLOBAL Variables
The GLOBAL modier indicates that the list of variables that follows the
GLOBAL keyword are available to other procedures. The data types of these
variables must match the data types of variables in the global environment. The
global environment is the memory that is used by all the procedures that run
within a given session (a DB-Access session or an SQL API session). The values
of global variables are stored in memory.
Procedures that are running in the current session share global variables.
Because the database server does not save global variables in the database,
the global variables do not remain when the current session closes.
Databases do not share global variables. The database server and any appli-
cation development tools do not share global variables.
The rst declaration of a global variable establishes the variable in the global
environment; subsequent global declarations simply bind the variable to the
global environment and establish the value of the variable at that point. The
following example shows two procedures, proc1 and proc2; each has dened
the global variable gl_out:
CREATE PROCEDURE proc1()
.
.
.
DEFINE GLOBAL gl_out INT DEFAULT 13;
.
.
.
LET gl_out = gl_out + 1;
END PROCEDURE;
CREATE PROCEDURE proc2()
.
.
.
DEFINE GLOBAL gl_out INT DEFAULT 23;
DEFINE tmp INT;
.
.
.
LET tmp = gl_out
.
.
.
END PROCEDURE;
2-12 Informi x Gui de to SQL: Syntax
DEFINE
If proc1 is called rst, gl_out is set to 13 and then incremented to 14. If proc2
is then called, it sees that the value of gl_out is already dened, so the default
value of 23 is not applied. Then, proc2 assigns the existing value of 14 to tmp.
If proc2 had been called rst, gl_out would have been set to 23, and 23 would
have been assigned to tmp. Later calls to proc1 would not apply the default
of 13.
Providing Default Values
You can provide a literal value or a null value as the default for a global
variable. You can also use a call to an SQL function to provide the default
value. The following example uses the SITENAME function to provide a
default value. It also denes a global BYTE variable.
CREATE PROCEDURE gl_def()
DEFINE GLOBAL gl_site CHAR(18) DEFAULT SITENAME;
DEFINE GLOBAL gl_byte REFERENCES BYTE DEFAULT NULL;
.
.
.
END PROCEDURE
SITENAME or DBSERVERNAME
If you use the value returned by SITENAME or DBSERVERNAME as the
default, the variable must be a CHAR, VARCHAR, NCHAR, or NVARCHAR
value of at least 18 characters.
USER
If you use USER as the default, the variable must be a CHAR, VARCHAR,
NCHAR, or NVARCHAR value of at least 8 characters.
SPL Statements 2-13
DEFINE
CURRENT
If you use CURRENT as the default, the variable must be a DATETIME value.
If the YEAR TO FRACTION keyword has qualied your variable, you can use
CURRENT without qualiers. If your variable uses another set of qualiers,
you must provide the same qualiers when you use CURRENT as the default
value. The following example denes a DATETIME variable with qualiers
and uses CURRENT with matching qualiers:
DEFINE GLOBAL d_var DATETIME YEAR TO MONTH
DEFAULT CURRENT YEAR TO MONTH;
TODAY
If you use TODAY as the default, the variable must be a DATE value.
TEXT and BYTE
The only default value possible for a TEXT or BYTE variable is null. The
following example denes a TEXT global variable that is called l_blob:
CREATE PROCEDURE use_text()
DEFINE i INT;
DEFINE GLOBAL l_blob REFERENCES TEXT DEFAULT NULL;
END PROCEDURE
Declaring Local Variables
Nonglobal (local) variables do not allow defaults. The following example
shows typical denitions of local variables:
CREATE PROCEDURE def_ex()
DEFINE i INT;
DEFINE word CHAR(15);
DEFINE b_day DATE;
DEFINE c_name LIKE customer.fname;
DEFINE b_text REFERENCES TEXT ;
END PROCEDURE
2-14 Informi x Gui de to SQL: Syntax
DEFINE
Declaring Variables LIKE Columns
If you use the LIKE clause, the database server denes variable name as the
same data type as the column in table. The data types of variables that are
dened as database columns are resolved at runtime; therefore, column and
table do not need to exist at compile time.
Declaring Variables as the PROCEDURE Type
The PROCEDURE type indicates that in the current scope, variable name is a
user-dened procedure call and not an SQL function or a system function call.
For example, the following statement denes length as a stored procedure,
not as the SQL LENGTH function. This denition disables the SQL LENGTH
function within the scope of the statement block. You would use such a
denition if you had created a procedure with the name length before you
dened and used it in another procedure, as shown in the following example:
DEFINE length PROCEDURE;
.
.
.
LET x = length (a,b,c)
If you create a procedure with the same name as an aggregate function (SUM,
MAX, MIN, AVG, COUNT) or with the name extend, you must qualify the
procedure name with the owner name.
SPL Statements 2-15
DEFINE
Declaring Variables for BYTE and TEXT Data
The keyword REFERENCES indicates that variable name is not a BYTE or TEXT
value but a pointer to the BYTE or TEXT value. Use the variable as though it
holds the data.
The following example denes a local BYTE variable:
CREATE PROCEDURE use_blob()
DEFINE i INT;
DEFINE l_blob REFERENCES BYTE;
END PROCEDURE --use_blob
If you pass a variable of TEXT or BYTE data type to a procedure, the data is
passed to the database server and stored in the root dbspace or dbspaces that
the DBSPACETEMP environment variable species, if it is set. You do not
need to know the location or name of the le that holds the data. BYTE or
TEXT manipulation requires only the name of the BYTE or TEXT variable as it
is dened in the procedure.
2-16 Informi x Gui de to SQL: Syntax
EXIT
EXIT
Use the EXIT statement to stop the execution of a FOR, WHILE, or FOREACH
loop.
Syntax
Usage
The EXIT statement causes the innermost loop of the indicated type (FOR,
WHILE, or FOREACH) to terminate. Execution resumes at the rst statement
outside the loop.
If the EXIT statement cannot nd the identied loop, it fails.
If the EXIT statement is used outside all loops, it generates errors.
; EXIT
FOREACH
WHILE
FOR
SPL Statements 2-17
EXIT
The following example uses an EXIT FOR statement. In the FOR loop, when j
becomes 6, the IF condition i = 5 in the WHILE loop is true. The FOR loop
stops executing, and the procedure continues at the next statement outside
the FOR loop (in this case, the END PROCEDURE statement). In this example,
the procedure ends when j equals 6.
CREATE PROCEDURE ex_cont_ex()
DEFINE i,s,j, INT;
FOR j = 1 TO 20
IF j > 10 THEN
CONTINUE FOR;
END IF
LET i,s = j,0;
WHILE i > 0
LET i = i -1;
IF i = 5 THEN
EXIT FOR;
END IF
END WHILE
END FOR
END PROCEDURE
2-18 Informi x Gui de to SQL: Syntax
FOR
FOR
Use the FOR statement to initiate a controlled (denite) loop when you want
to guarantee termination of the loop. The FOR statement uses expressions or
range operators to establish a nite number of iterations for a loop.
Syntax
)
,
FOR
variable
name
left
expression
TO
right
expression
IN (
Statement
Block
p. 1-140
END
FOR
,
expression
;
increment
expression
left
expression
TO
right
expression
=
increment
expression
STEP
STEP
SPL Statements 2-19
FOR
Usage
The database server computes all expressions before the FOR statement
executes. If one or more of the expressions are variables, and their values
change during the loop, the change has no effect on the iterations of the loop.
The FOR loop terminates when variable name takes on the values of each
element in the expression list or range in succession or when it encounters an
EXIT FOR statement.
The database server generates an error if an assignment within the body of
the FOR statement attempts to modify the value of variable name.
Element Purpose Restrictions Syntax
expression A numeric or character value
against which variable name is
compared to determine if the
loop should be executed
The data type of expression must
match the data type of variable
name. You can use the output of a
SELECT statement as an
expression.
Expression, p. 1-671
increment
expression
A positive or negative value by
which variable name is
incremented. Defaults to +1 or
-1 depending on left expression
and right expression.
The increment expression
cannot evaluate to 0.
Expression, p. 1-671
left expression The starting expression of a
range
The value of left expression must
match the data type of variable
name. It must be either INT or
SMALLINT.
Expression, p. 1-671
right expression The ending expression in the
range. The size of right expression
relative to left expression
determines if the range is
stepped through positively or
negatively.
The value of right expression
must match the data type of
variable name. It must be either
INT or SMALLINT.
Expression, p. 1-671
variable name The value of this variable
determines how many times the
loop executes.
You must have already dened
this variable, and the variable
must be valid within this
statement block. If you are using
variable name with a range of
values and the TO keyword, you
must dene variable name
explicitly as either INT or
SMALLINT.
Identier, p. 1-723
2-20 Informi x Gui de to SQL: Syntax
FOR
Using the TO Keyword to Dene a Range
The TO keyword implies a range operator. The range is dened by left
expression and right expression, and the STEP increment expression option
implicitly sets the number of increments. If you use the TO keyword, variable
name must be an INT or SMALLINT data type. The following example shows
two equivalent FOR statements. Each uses the TO keyword to dene a range.
The rst statement uses the IN keyword, and the second statement uses an
equal sign (=). Each statement causes the loop to execute ve times.
FOR index_var IN (12 TO 21 STEP 2)
-- statement block
END FOR
FOR index_var = 12 TO 21 STEP 2
-- statement block
END FOR
If you omit the STEP option, the database server gives increment expression the
value of -1 if right expression is less than left expression, or +1 if right expression
is more than left expression. If increment expression is specied, it must be
negative if right expression is less than left expression, or positive if right
expression is more than left expression. The two statements in the following
example are equivalent. In the rst statement, the STEP increment is explicit.
In the second statement, the STEP increment is implicitly 1.
FOR index IN (12 TO 21 STEP 1)
-- statement block
END FOR
FOR index = 12 TO 21
-- statement block
END FOR
The database server initializes the value of variable name to the value of left
expression. In subsequent iterations, the server adds increment expression to the
value of variable name and checks increment expression to determine whether
the value of variable name is still between left expression and right expression. If
so, the next iteration occurs. Otherwise, an exit from the loop takes place. Or,
if you specify another range, the variable takes on the value of the rst
element in the next range.
SPL Statements 2-21
FOR
Specifying Two or More Ranges in a Single FOR Statement
The following example shows a statement that traverses a loop forward and
backward and uses different increment values for each direction:
FOR index_var IN (15 to 21 STEP 2, 21 to 15 STEP -3)
-- statement body
END FOR
Using an Expression List as the Range
The database server initializes the value of variable name to the value of the
rst expression specied. In subsequent iterations, variable name takes on the
value of the next expression. When the server has evaluated the last
expression in the list and used it, the loop stops.
The expressions in the IN list do not have to be numeric values, as long as you
do not use range operators in the IN list. The following example uses a
character expression list:
FOR c IN ('hello', (SELECT name FROM t), 'world', v1, v2)
INSERT INTO t VALUES (c);
END FOR
The following FOR statement shows the use of a numeric expression list:
FOR index IN (15,16,17,18,19,20,21)
-- statement block
END FOR
2-22 Informi x Gui de to SQL: Syntax
FOR
Mixing Range and Expression Lists in the Same FOR Statement
If variable name is an INT or SMALLINT value, you can mix ranges and
expression lists in the same FOR statement. The following example shows a
mixture that uses an integer variable. Values in the expression list include the
value that is returned from a SELECT statement, a sum of an integer variable
and a constant, the values that are returned from a procedure named
p_get_int, and integer constants.
CREATE PROCEDURE for_ex ()
DEFINE i, j INT;
LET j = 10;
FOR i IN (1 TO 20, (SELECT c1 FROM tab WHERE id = 1),
j+20 to j-20, p_get_int(99),98,90 to 80 step -2)
INSERT INTO tab VALUES (i);
END FOR
END PROCEDURE
SPL Statements 2-23
FOREACH
FOREACH
Use a FOREACH loop to select and manipulate more than one row.
Syntax
,
FOREACH
SELECT...INTO
Statement
p. 2-26
Statement
Block
p. 1-140
END
FOREACH
;
cursor
name
FOR
WITH HOLD
WITH HOLD
EXECUTE
PROCEDURE
Procedure
Name
p. 1-754
( )
variable
name
INTO
Expression
(Subset)
p. 2-26
,
parameter
name
=
2-24 Informi x Gui de to SQL: Syntax
FOREACH
Usage
A FOREACH loop is the procedural equivalent of using a cursor. When a
FOREACH statement executes, the database server takes the following
actions:
1. It declares and implicitly opens a cursor.
2. It obtains the rst row from the query that is contained within the
FOREACH loop, or it obtains the rst set of values from the called
procedure.
3. It assigns each variable in the variable list the value of the
corresponding value from the active set that the SELECT statement or
the called procedure creates.
4. It executes the statement block.
5. It fetches the next row from the SELECT statement or called
procedure on each iteration, and it repeats step 3.
6. It terminates the loop when it nds no more rows that satisfy the
SELECT statement or called procedure. It closes the implicit cursor
when the loop terminates.
Because the statement block can contain additional FOREACH statements,
cursors can be nested. No limit exists to the number of cursors that can be
nested.
Element Purpose Restrictions Syntax
cursor name An identier that you supply as
a name for the SELECT...INTO
statement
Each cursor name within a
procedure must be unique.
Identier, p. 1-723
parameter name The name of a parameter in the
procedure that is being executed
as dened in its CREATE
PROCEDURE statement
Name or position, but not both,
binds procedure arguments to
procedure parameters. You can
use parameter name = syntax for
all or none of the arguments that
are specied in one FOREACH
EXECUTE PROCEDURE
statement.
Identier, p. 1-723
variable name The name of a procedure
variable in the calling or
executing procedure
The data type of variable name
must be appropriate for the
value that is being returned.
Identier, p. 1-723
SPL Statements 2-25
FOREACH
A procedure that returns more than one row or set of values is called a cursory
procedure.
The following procedure illustrates the three types of FOREACH statements:
with a SELECT...INTO clause, with an explicitly named cursor, and with a
procedure call:
CREATE PROCEDURE foreach_ex()
DEFINE i, j INT;
FOREACH SELECT c1 INTO i FROM tab order by 1
INSERT INTO tab2 VALUES (i);
END FOREACH
FOREACH cur1 FOR SELECT c2, c3 INTO i, j FROM tab
IF j > 100 THEN
DELETE FROM tab WHERE CURRENT OF cur1;
CONTINUE FOREACH;
END IF
UPDATE tab SET c2 = c2 + 10 WHERE CURRENT OF cur1;
END FOREACH
FOREACH EXECUTE PROCEDURE bar(10,20) INTO i
INSERT INTO tab2 VALUES (i);
END FOREACH
END PROCEDURE -- foreach_ex
A select cursor is closed when any of the following situations occur:
I The cursor returns no further rows.
I The cursor is a select cursor without a HOLD specication, and a
transaction completes using COMMIT or ROLLBACK statements.
I An EXIT statement executes, which transfers control out of the
FOREACH statement.
I An exception occurs that is not trapped inside the body of the
FOREACH statement. (See the ON EXCEPTION statement on page
2-34.)
I A cursor in the calling procedure that is executing this cursory
procedure (within a FOREACH loop) closes for any reason.
2-26 Informi x Gui de to SQL: Syntax
FOREACH
Using a SELECT. . . INTO Statement
The SELECT statement in the FOREACH statement must include the INTO
clause. It can also include UNION and ORDER BY clauses, but it cannot use the
INTOTEMP clause. The syntax of a SELECT statement is shown on page 1-459.
The type and count of each variable in the variable list must match each value
that the SELECT...INTO statement returns.
Hold Cursors
The WITH HOLD keyword species that the cursor should remain open when
a transaction closes (is committed or rolled back).
Updating or Deleting Rows Identied by Cursor Name
Use the WHERE CURRENT OF cursor name clause to update or delete the
current row of cursor name.
Calling a Procedure in the FOREACH Loop
The called procedure can return zero or more rows.
The type and count of each variable in the variable list must match each value
that the called procedure returns.
Subset of Expressions Allowed in the Procedure Parameters
You can use any expression as a procedure parameter except an aggregate
expression. If you use a subquery or procedure call, the subquery or
procedure must return a single value of the appropriate data type and size.
For the full syntax of an expression, see page 1-671.
SPL Statements 2-27
IF
IF
Use an IF statement to create a branch within a procedure.
Syntax
Usage
The condition that the IF clause states is evaluated. If the result is true, the
statements that follow the THEN keyword execute. If the result is false, and
an ELIF clause exists, the statements that follow the ELIF clause execute. If no
ELIF clause exists, or if the condition in the ELIF clause is not true, the state-
ments that follow the ELIF keyword execute.
In the following example, the procedure uses an IF statement with both an
ELIF clause and an ELSE clause. The IF statement compares two strings and
displays a 1 to indicate that the rst string comes before the second string
alphabetically, or a -1 if the rst string comes after the second string
alphabetically. If the strings are the same, a 0 is returned.
CREATE PROCEDURE str_compare (str1 CHAR(20), str2 CHAR(20))
RETURNING INT;
DEFINE result INT;
IF str1 > str2 then
result =1;
ELIF str2 > str1 THEN
;
IF
Condition
p. 1-643
THEN
ELIF
Condition
p. 1-643
THEN
IF Statement
List
p. 2-29
IF Statement
List
p. 2-29
END IF
ELSE
IF Statement
List
p. 2-29
2-28 Informi x Gui de to SQL: Syntax
IF
result = -1;
ELSE
result = 0;
END IF
RETURN result;
END PROCEDURE -- str_compare
The ELIF Clause
Use the ELIF clause to specify one or more additional conditions to evaluate.
If you specify an ELIF clause, and the IF condition is false, the ELIF condition
is evaluated. If the ELIF condition is true, the statements that follow the ELIF
clause execute.
The ELSE Clause
The ELSE clause executes if no true previous condition exists in the IF clause
or any of the ELIF clauses.
Conditions in an IF Statement
Conditions in an IF statement are evaluated in the same way as conditions in
a WHILE statement.
If any expression that the condition contains evaluates to null, the condition
automatically becomes untrue. Consider the following points:
1. If the expression x evaluates to null, then x is not true by denition.
Furthermore, not(x) is also not true.
2. IS NULL is the sole operator that can yield true for x. That is, x IS
NULL is true, and x IS NOT NULL is not true.
An expression within the condition that has an UNKNOWN value (due to the
use of an uninitialized variable) causes an immediate error. The statement
terminates and raises an exception.
SPL Statements 2-29
IF
IF Statement List
Statement
Block
p. 1-140
BEGIN
END
CONTINUE
Statement
p. 2-7
IF
Statement
p. 2-27
EXIT
Statement
p. 2-16
FOR
Statement
p. 2-18
FOREACH
Statement
p. 2-23
LET
Statement
p. 2-31
RAISE EXCEPTION
Statement
p. 2-39
RETURN
Statement
p. 2-41
TRACE
Statement
p. 2-46
WHILE
Statement
p. 2-49
SYSTEM
Statement
p. 2-43
CALL
Statement
p. 2-4
SQL Statement
IF Statement
List
2-30 Informi x Gui de to SQL: Syntax
IF
Subset of SQL Statements Allowed in an IF Statement
You can use any SQL statement in the statement block except the ones in the
following list.
You can use a SELECT statement only if you use the INTO TEMP clause to put
the results of the SELECT statement into a temporary table.
ALLOCATE DESCRIPTOR GET DESCRIPTOR
CHECK TABLE GET DIAGNOSTICS
CLOSE DATABASE INFO
CONNECT LOAD
CREATE DATABASE OPEN
CREATE PROCEDURE OUTPUT
DATABASE PREPARE
DEALLOCATE DESCRIPTOR PUT
DECLARE REPAIR TABLE
DESCRIBE ROLLFORWARD DATABASE
DISCONNECT SET CONNECTION
EXECUTE SET DESCRIPTOR
EXECUTE IMMEDIATE START DATABASE
FETCH UNLOAD
FLUSH WHENEVER
FREE
SPL Statements 2-31
LET
LET
Use the LET statement to assign values to variables. You also can use the LET
statement to call a procedure within a procedure and assign the returned
values to variables.
Syntax
Element Purpose Restrictions Syntax
called variable A procedure variable of the
called procedure
Name or position, but not both,
binds procedure arguments to
procedure parameters. That is,
you can use called variable=
syntax for all or none of the
arguments that are specied in a
LET statement.
Identier, p. 1-723
variable name A procedure variable The procedure variable must be
dened in the procedure and
valid in the statement block.
Identier, p. 1-723
,
,
variable
name
LET
=
Procedure
Name
p. 1-754
,
(
Expression
p. 1-671
;
)
Expression
p. 1-671
called
variable
=
,
2-32 Informi x Gui de to SQL: Syntax
LET
Usage
If you assign a value to a single variable, it is called a simple assignment; if you
assign values to two or more variables, it is called a compound assignment.
At runtime, the value of the SPL expression is computed rst. The resulting
value is converted to variable name data type, if possible, and the assignment
occurs. If conversion is not possible, an error occurs, and the value of variable
name is undened.
A compound assignment assigns multiple expressions to multiple variables.
The count and data type of expressions in the expression list must match the
count and data type of the corresponding variables in the variable list.
The following example shows several LET statements that assign values to
procedure variables:
LET a = c + d ;
LET a,b = c,d ;
LET expire_dt = end_dt + 7 UNITS DAY;
LET name = 'Brunhilda';
LET sname = DBSERVERNAME;
LET this_day = TODAY;
You cannot use multiple values to operate on other values. For example, the
following statement is illegal:
LET a,b = (c,d) + (10,15); -- ILLEGAL EXPRESSION
Using a SELECT Statement in a LET Statement
Using a SELECT statement in a LET statement is equivalent to using a
SELECT...INTO procedure-variable statement in a procedure. The examples in
this section use a SELECT statement in a LET statement. You can use a SELECT
statement to assign values to one or more variables on the left side of the
= operator, as the following example shows:
LET a,b = (SELECT c1,c2 FROM t WHERE id = 1);
LET a,b,c = (SELECT c1,c2 FROM t WHERE id = 1), 15;
You cannot use a SELECT statement to make multiple values operate on other
values. The code in the following example is illegal:
LET a,b = (SELECT c1,c2 FROM t) + (10,15); -- ILLEGAL CODE
SPL Statements 2-33
LET
Because a LET statement is equivalent to a SELECT...INTO statement, the two
statements in the following example have the same results: a=c and b=d:
CREATE PROCEDURE proof()
DEFINE a, b, c, d INT;
LET a,b = (SELECT c1,c2 FROM t WHERE id = 1);
SELECT c1, c2 INTO c, d FROM t WHERE id = 1
END PROCEDURE
If the SELECT statement returns more than one row, you must enclose the
SELECT statement in a FOREACH loop.
Calling a Procedure in a LET Statement
You can call a procedure in a LET statement and assign the returned values to
variables. If the LET statement includes a procedure call, it invokes the named
procedure. You must specify all the necessary arguments to the procedure in
the LET statement unless the procedure has default values for its arguments.
If you use the called variable = syntax for one of the parameters in the called
procedure, you must use it for all the parameters.
The variable name receives the returned value from a procedure call. A
procedure can return more than one value into a list of variable names. You
must enclose a procedure that returns more than one row in a FOREACH loop.
The following example shows several LET statements. The rst two are valid
LET statements that contain procedure calls. The third LET statement is not
legal because it tries to add the output of two procedures and then assign the
sum to two variables, a and b.You can easily split this LET statement into two
legal LET statements.
LET a, b, c = proc1(name = 'grok', age = 17);
LET a, b, c = 7, proc ('orange', 'green');
LET a, b = proc1() + proc2(); -- ILLEGAL CODE
2-34 Informi x Gui de to SQL: Syntax
ON EXCEPTION
ON EXCEPTION
Use the ON EXCEPTION statement to specify the actions that are taken for a
particular error or a set of errors.
Syntax
Element Purpose Restrictions Syntax
error data
variable
A procedure variable that
contains a string returned by an
SQL error or a user-dened
exception
Must be a character data type to
receive the error information.
Must be valid in the current
statement block.
Identier, p. 1-723
error number AnSQL error number, or an error
number created by a RAISE
EXCEPTION statement, that is to
be trapped
Must be of integer data type.
Must be valid in the current
statement block.
Literal number,
p. 1-752
ISAM error
variable
A variable that receives the ISAM
error number of the exception
raised
Must be of integer data type.
Must be valid in the current
statement block.
Identier, p. 1-723
SQL error
variable
A variable that receives the SQL
error number of the exception
raised
Must be a character data type.
Must be valid in the current
statement block.
Identier, p. 1-723
,
ON EXCEPTION
Statement
Block
p. 1-140
END EXCEPTION
error
number
IN ) (
SET
SQL
error
variable
;
error
data
variable
WITH RESUME
,
ISAM
error
variable
,
SPL Statements 2-35
ON EXCEPTION
Usage
The ON EXCEPTION statement, together with the RAISE EXCEPTION
statement, provides an error-trapping and error-recovery mechanism for
SPL. The ON EXCEPTION statement denes a list of errors that are to be
trapped as the stored procedure executes and species the action (within the
statement block) to take when the trap is triggered. If the IN clause is omitted,
all errors are trapped.
You can use more than one ON EXCEPTION statement within a given
statement block.
The scope of an ON EXCEPTION statement is the statement block that follows
the ON EXCEPTION statement, all the statement blocks that are nested within
that following statement block, and all the statement blocks that follow the
ON EXCEPTION statement.
The exceptions that are trapped can be either system- or user-dened.
When an exception is trapped, the error status is cleared.
If you specify a variable to receive an ISAM error, but no accompanying ISAM
error exists, a zero returns to the variable. If you specify a variable to receive
the returned error text, but none exists, an empty string goes into the
variable.
Placement of the ON EXCEPTION Statement
ON EXCEPTION is a declarative statement, not an executable statement. For
this reason, you must use the ON EXCEPTION statement before any
executable statement and after any DEFINE statement in a procedure.
The following example shows the correct placement of an ON EXCEPTION
statement. Use an ON EXCEPTION statement after the DEFINE statement and
before the body of the procedure. The following procedure inserts a set of
values into a table. If the table does not exist, it is created, and the values are
inserted. The procedure also returns the total number of rows in the table
after the insert occurs.
2-36 Informi x Gui de to SQL: Syntax
ON EXCEPTION
CREATE PROCEDURE add_salesperson(last CHAR(15),
first CHAR(15))
RETURNING INT;
DEFINE x INT;
ON EXCEPTION IN (-206) -- If no table was found, create one
CREATE TABLE emp_list
(lname CHAR(15),fname CHAR(15), tele CHAR(12));
INSERT INTO emp_list VALUES -- and insert values
(last, first, '800-555-1234');
END EXCEPTION WITH RESUME
INSERT INTO emp_list VALUES (last, first, '800-555-1234')
LET x = SELECT count(*) FROM emp_list;
RETURN x;
END PROCEDURE
When an error occurs, the database server searches for the last declaration of
the ON EXCEPTION statement, which traps the particular error code. The ON
EXCEPTION statement can have the error number in the IN clause or have no
IN clause. If the database server nds no pertinent ON EXCEPTION statement,
the error code passes back to the caller (the procedure, application, or inter-
active user), and execution aborts.
The following example uses two ON EXCEPTION statements with the same
error number so that error code 691 can be trapped in two levels of nesting:
CREATE PROCEDURE delete_cust (cnum INT)
ON EXCEPTION IN (-691) -- children exist
BEGIN -- Begin-end is necessary so that other DELETEs
-- don't get caught in here.
ON EXCEPTION IN (-691)
DELETE FROM another_child WHERE num = cnum;
DELETE FROM orders WHERE customer_num = cnum;
END EXCEPTION -- for 691
DELETE FROM orders WHERE customer_num = cnum;
END
DELETE FROM cust_calls WHERE customer_num = cnum;
DELETE FROM customer WHERE customer_num = cnum;
END EXCEPTION
DELETE FROM customer WHERE customer_num = cnum;
END PROCEDURE
SPL Statements 2-37
ON EXCEPTION
Using the IN Clause to Trap Specic Exceptions
A trap is triggered if either the SQL error code or the ISAM error code matches
an exception code in the list of error numbers. The search through the list
begins from the left and stops with the rst match.
You can use a combination of an ON EXCEPTION statement without an IN
clause and one or more ON EXCEPTION statements with an IN clause to set
up default trapping. A summary of the sequence of statements in the
following example would be: Test for an error. If error -210, -211, or -212
occurs, take action A. If error -300 occurs, take action B. If any other error
occurs, take action C. When an error occurs, the database server searches for
the last declaration of the ON EXCEPTION statement that traps the particular
error code.
CREATE PROCEDURE ex_test ()
DEFINE error_num INT;
.
.
.
ON EXCEPTION
SET error_num
-- action C
END EXCEPTION
ON EXCEPTION IN (-300)
-- action B
END EXCEPTION
ON EXCEPTION IN (-210, -211, -212)
SET error_num
-- action A
END EXCEPTION
.
.
.
Receiving Error Information in the SET Clause
If you use the SET clause, when an exception occurs, the SQL error code and
(optionally) the ISAM error code are inserted into the variables that are
specied in the SET clause. If you provided an error data variable, any error text
that the database server returns is put into the error data variable. Error text
includes information such as the offending table or column name.
2-38 Informi x Gui de to SQL: Syntax
ON EXCEPTION
Forcing Continuation of the Procedure
The example on page 2-36 uses the WITH RESUME keyword to indicate that
after the statement block in the ON EXCEPTION statement executes, execution
is to continue at the LET x = SELECT COUNT(*) FROM emp_list statement,
which is the line following the line that raised the error. For this procedure,
the result is that the count of salespeople names occurs even if the error
occurred.
Continuing Execution After an Exception Occurs
If you do not include the WITH RESUME keyword in your ON EXCEPTION
statement, the next statement that executes after an exception occurs depends
on the placement of the ON EXCEPTION statement, as the following scenarios
describe:
I If the ON EXCEPTION statement is inside a statement block with a
BEGIN and an END keyword, execution resumes with the rst state-
ment (if any) after that BEGIN...END block. That is, it resumes after
the scope of the ON EXCEPTION statement.
I If the ON EXCEPTION statement is inside a loop (FOR, WHILE,
FOREACH), the rest of the loop is skipped, and execution resumes
with the next iteration of the loop.
I If no statement or block, but only the procedure, contains the ON
EXCEPTION statement, the procedure executes a RETURN statement
with no arguments to terminate. That is, the procedure returns a
successful status and no values.
Errors Within the ON EXCEPTION Statement Block
To prevent an innite loop, if an error occurs during execution of the
statement block of an error trap, the search for another trap does not include
the current trap.
SPL Statements 2-39
RAISE EXCEPTION
RAISE EXCEPTION
Use the RAISE EXCEPTION statement to simulate the generation of an error.
Syntax
Usage
Use the RAISE EXCEPTION statement to simulate an error. An ON EXCEPTION
statement can trap the generated error.
If you omit the ISAM error parameter, the database server sets the ISAM error
code to zero when the exception is raised. If you want to use the error text
variable parameter but not specify a value for ISAM error, you can specify 0 as
the value of ISAM error.
For example, the following statement raises the error number -9999 and
returns the stated text:
RAISE EXCEPTION -9999, 0, 'You broke the rules';
Element Purpose Restrictions Syntax
error text
variable
A procedure variable that
contains the error text
The procedure variable must be
a character data type and must
be valid in the statement block.
Identier, p. 1-723
ISAM error A variable or expression that
represents an ISAM error
number. The default value is 0.
The variable or expression must
evaluate to a SMALLINT value.
You can place a minus sign
before the error number.
Expression, p. 1-671
SQL error A variable or expression that
represents an SQL error number
The variable or expression must
evaluate to a SMALLINT value.
You can place a minus sign
before the error number.
Expression, p. 1-671
RAISE EXCEPTION ;
SQL
error
ISAM
error
,
error text
variable
,
2-40 Informi x Gui de to SQL: Syntax
RAISE EXCEPTION
The statement can raise either system-generated exceptions or user-
generated exceptions.
In the following example, a negative value for a raises exception 9999. The
code should contain an ON EXCEPTION statement that traps for an exception
of 9999.
FOREACH SELECT c1 INTO a FROM t
IF a < 0 THEN
RAISE EXCEPTION 9999-- emergency exit
END IF
END FOREACH
See the ON EXCEPTION statement for more information about the scope and
compatibility of exceptions.
SPL Statements 2-41
RETURN
RETURN
Use the RETURN statement to designate the values that the procedure returns
to the calling module.
Syntax
Usage
The RETURN statement returns zero or more values to the calling process.
All the RETURN statements in the procedure must be consistent with the
RETURNING clause of the CREATE PROCEDURE statement, which the
procedure denes. The number and data type of values in the RETURN
statement, if any, must match in number and data type the data types that are
listed in the RETURNING clause of the CREATE PROCEDURE statement. You
can choose to return no values even if you specify one or more values in the
RETURNING clause. If you use a RETURN statement without any expressions,
but the calling procedure or program expects one or more return values, it is
equivalent to returning the expected number of null values to the calling
program.
In the following example, the procedure includes two acceptable RETURN
statements. A program that calls this procedure should check if no values are
returned and act accordingly.
CREATE PROCEDURE two_returns (stockno INT)
RETURNING CHAR (15);
DEFINE des CHAR(15);
ON EXCEPTION (-272) -- if user doesnt have select privs...
RETURN; -- return no values.
END EXCEPTION;
SELECT DISTINCT descript INTO des FROM stock
WHERE stocknum = stockno;
RETURN des;
END PROCEDURE
,
RETURN
Expression
p. 1-671
WITH RESUME
;
2-42 Informi x Gui de to SQL: Syntax
RETURN
A RETURN statement without any expressions exits only if the procedure is
declared not to return values; otherwise it returns nulls.
The WITH RESUME Keyword
If you use the WITH RESUME keyword after the RETURN statement executes,
the next invocation of this procedure (upon the next FETCH or FOREACH
statement) starts from the statement that follows the RETURN statement. If a
procedure executes a RETURN WITH RESUME statement, a FOREACH loop in
the calling procedure or program must call the procedure.
If a procedure executes a RETURN WITH RESUME statement, a FETCH
statement in an application that is written in an SQL API can call it.
The following example shows a cursory procedure that another procedure
can call. After the RETURN i WITH RESUME statement returns each value to
the calling procedure, the next line of sequence executes the next time
sequence is called. If backwards equals 0, no value is returned to the calling
procedure, and execution of sequence stops.
CREATE PROCEDURE sequence (limit INT, backwards INT)
RETURNING INT;
DEFINE i INT;
FOR i IN (1 TO limit)
RETURN i WITH RESUME;
END FOR
IF backwards = 0 THEN
RETURN;
END IF
FOR i IN (limit TO 1)
RETURN i WITH RESUME;
END IF
END PROCEDURE -- sequence
ESQL
SPL Statements 2-43
SYSTEM
SYSTEM
Use the SYSTEM statement to make an operating-system command run from
within a procedure.
Syntax
Usage
If the supplied expression is not a character expression, expression is
converted to a character expression before the operating-system command is
made. The complete character expression passes to the operating system and
executes as an operating-system command.
The operating-system command that the SYSTEM statement species cannot
run in the background. The database server waits for the operating system to
complete execution of the command before it continues to the next procedure
statement.
Your procedure cannot use a value or values that the command returns.
If the operating-system command fails (that is, if the operating system
returns a nonzero status for the command), an exception is raised that
contains the returned operating-system status as the ISAM error code and an
appropriate SQL error code.
Element Purpose Restrictions Syntax
character
variable
A procedure variable that
contains a valid operating-
system command
The procedure variable must be
a character data type variable
that is valid in the statement
block.
Identier, p. 1-723
expression Any expression that is a user-
executable operating-system
command
You cannot specify that the
command run in the
background.
Operating-system
dependent
expression SYSTEM ;
character variable
2-44 Informi x Gui de to SQL: Syntax
SYSTEM
In DBA- and owner-privileged procedures that contain SYSTEM statements,
the operating-system command runs with the permissions of the user who is
executing the procedure.
Specifying Environment Variables in SYSTEM Statements
When the operating-system command that SYSTEM species is executed, no
guarantee exists that the environment variables that the user application set
are passed to the operating system. To ensure that the environment variables
that the application set are carried forward to the operating system, enter a
SYSTEM command that sets the environment variables before you enter the
SYSTEM command that causes the operating-system command to execute.
For information on the operating-system commands that set environment
variables, see Chapter 4 of the Informix Guide to SQL: Reference.
Examples of the SYSTEM Statement in Procedures
The following example shows the use of a SYSTEM statement within a stored
procedure. The SYSTEM statement in this example causes the operating
system to send a mail message to the system administrator.
CREATE PROCEDURE sensitive_update()
.
.
.
LET mailcall = 'mail headhoncho < alert'
-- code that evaluates if operator tries to execute a
-- certain command, then sends email to system
-- administrator
SYSTEM mailcall
.
.
.
END PROCEDURE; -- sensitive_update
SPL Statements 2-45
SYSTEM
You can use a double-pipe symbol (||) to concatenate expressions with a
SYSTEM statement, as the following example shows:
CREATE PROCEDURE sensitive_update2()
DEFINE user1 char(15);
DEFINE user2 char(15);
LET user1 = 'joe';
LET user2 = 'mary';
.
.
.
-- code that evaluates if operator tries to execute a
-- certain command, then sends email to system
-- administrator
SYSTEM 'mail -s violation' ||user1 || ' ' || user2
|| '< violation_file';
.
.
.
END PROCEDURE;
2-46 Informi x Gui de to SQL: Syntax
TRACE
TRACE
Use the TRACE statement to control the generation of debugging output.
Syntax
Usage
The TRACE statement generates output that is sent to the le that the SET
DEBUG FILE TO statement species.
Tracing prints the current values of the following items:
I Variables
I Procedure arguments
I Return values
I SQL error codes
I ISAM error codes
The output of each executed TRACE statement appears on a separate line.
If you use the TRACE statement before you specify a DEBUG le to contain the
output, an error is generated.
Called procedures inherit the trace state. That is, a called procedure assumes
the same trace state (ON, OFF, or PROCEDURE) as the calling procedure. The
called procedure can set its own trace state, but that state is not passed back
to the calling procedure.
TRACE
ON
OFF
PROCEDURE
Expression
p. 1-671
;
SPL Statements 2-47
TRACE
A procedure that is executed on a remote database server does not inherit the
trace state.
TRACE ON
If you specify the keyword ON, all statements are traced. The values of
variables (in expressions or otherwise) are printed before they are used. To
turn tracing ON implies tracing both procedure calls and statements in the
body of the procedure.
TRACE OFF
If you specify the keyword OFF, all tracing is turned off.
TRACE PROCEDURE
If you specify the keyword PROCEDURE, only the procedure calls and return
values, but not the body of the procedure, are traced.
Printing Expressions
You can use the TRACE statement with a quoted string or an expression to
display values or comments in the output le. If the expression is not a literal
expression, the expression is evaluated before it is written to the output le.
You can use the TRACE statement with an expression even if you used a
TRACE OFF statement earlier in a procedure. However, you must rst use the
SET DEBUG statement to establish a trace-output le.
The following example uses a TRACE statement with an expression after it
uses a TRACE OFF statement:
CREATE PROCEDURE tracing ()
DEFINE i INT;
BEGIN
ON EXCEPTION IN (1)
END EXCEPTION; -- do nothing
TRACE OFF;
SET DEBUG FILE TO '/tmp/foo.trace';
TRACE 'Forloop starts';
FOR i IN (1 TO 1000)
BEGIN
TRACE 'FOREACH starts';
2-48 Informi x Gui de to SQL: Syntax
TRACE
FOREACH SELECT...INTO a FROM t
IF <some condition> THEN
RAISE EXCEPTION 1 -- emergency exit
END IF
END FOREACH
-- return some value
END
END FOR
-- do something
END;
END PROCEDURE
The following example shows additional TRACE statements:
CREATE PROCEDURE testproc()
DEFINE i INT;
TRACE OFF;
SET DEBUG FILE TO '/tmp/test.trace';
TRACE 'Entering foo';
TRACE PROCEDURE;
LET i = testtoo();
TRACE ON;
LET i = i + 1;
TRACE OFF;
TRACE 'i+1 = ' || i+1;
TRACE 'Exiting testproc';
SET DEBUG FILE TO '/tmp/test2.trace';
END PROCEDURE;
Looking at the Traced Output
To see the traced output, use an editor or utility to display or read the
contents of the le.
SPL Statements 2-49
WHILE
WHILE
Use the WHILE statement to establish an indenite loop within a procedure.
Syntax
Usage
The condition is evaluated once at the beginning of the loop, and subse-
quently at the beginning of each iteration. The statement block is executed as
long as the condition remains true. The loop terminates when the condition
evaluates to not true.
If any expression within the condition evaluates to null, the condition
automatically becomes not true unless you are explicitly testing for the IS
NULL condition.
If an expression within the condition has an unknown value because it
references uninitialized procedure variables, an immediate error results. In
this case, the loop terminates, and an exception is raised.
CREATE PROCEDURE simp_while()
DEFINE i INT;
DEFINE pf_name CHAR(15);
WHILE EXISTS (SELECT fname INTO pf_name FROM customer
WHERE customer_num > 400)
DELETE FROM customer WHERE id_2 = 2;
END WHILE
LET i = 1;
WHILE i < 10
INSERT INTO tab_2 VALUES (i);
LET i = i +1;
END WHILE;
END PROCEDURE;
WHILE
Condition
p. 1-643
Statement
Block
p. 1-140
END WHILE
;
Index
A
ABS function
syntax in expression 1-684
use in expression 1-687
ABSOLUTE keyword
syntax in FETCH 1-296
use in FETCH 1-300
Access control. See Privilege.
ACCESS FOR keywords, in INFO
statement 1-368
ACOS function
syntax in expression 1-704
use in expression 1-706
Action clause
AFTER 1-200
definition of 1-199
FOR EACH ROW 1-200
subset, syntax 1-205
syntax 1-199
Action statements
in triggered action clause 1-207
list of 1-207
order of execution 1-207
Active set
constructing with OPEN 1-392,
1-393
retrieving data with
FETCH 1-296
ADD CONSTRAINT keywords,
syntax in ALTER TABLE 1-46
AFTER
action 1-200
keyword 1-200
Aggregate function
ALL keyword, syntax 1-709
AVG function, syntax 1-709
COUNT function, syntax 1-709
DISTINCT keyword,
syntax 1-709
in ESQL 1-721
in EXISTS subquery 1-654
in expressions 1-464
in SELECT 1-465
MAX function, syntax 1-709
MIN function, syntax 1-709
RANGE function 1-717
restrictions with GROUP
BY 1-484
STDEV function 1-718
SUM function, syntax 1-709
summary 1-719
VARIANCE function 1-718
Algebraic functions
ABS function 1-687
MOD function 1-687
POW function 1-688
ROOT function 1-688
ROUND function 1-688
SQRT function 1-689
syntax 1-684
TRUNC function 1-690
Algorithm
for adding columns to tables 1-49
in-place alter 1-49
Alias
for a table in SELECT 1-473
use with GROUP BY clause 1-483,
1-488
ALL keyword
beginning a subquery 1-479
DISCONNECT statement 1-264
syntax
in expression 1-709
Index
2 Informi x Gui de to SQL: Syntax
in GRANT 1-349
in REVOKE 1-442
in SELECT 1-461
with UNION operator 1-459
use
in Condition subquery 1-655
in expression 1-711
in GRANT 1-351, 1-352
in REVOKE 1-444
in SELECT 1-463
with UNION operator 1-499
ALLOCATE DESCRIPTOR
statement
syntax 1-19
with concatenation
operator 1-673
Allocating memory with the
ALLOCATE DESCRIPTOR
statement 1-19
ALS. See Asian Language Support.
ALTER FRAGMENT statement
ADD Clause 1-37
ATTACH clause 1-25
attaching with fragment
expression 1-28
attaching with round-robin 1-27
DETACH clause 1-29
DROP clause 1-39
effects on blob columns 1-29
effects on constraints 1-29
effects on indexes 1-29
effects on triggers 1-29
effects on triggers, constraints,
indexes 1-26
how executed 1-24
INIT clause 1-30
MODIFY clause 1-40
privileges needed to alter
fragments 1-23
syntax 1-22
use 1-23
ALTER INDEX statement
creating clustered index 1-43
dropping clustered index 1-45
syntax 1-43
ALTER keyword
syntax
in GRANT 1-340
in REVOKE 1-442
use
in GRANT 1-350, 1-351
in REVOKE 1-444
Alter privilege 1-350, 1-351
ALTER TABLE statement
ADD clause 1-48
ADD CONSTRAINT clause 1-70
adding
a column 1-48
a column constraint 1-69
a table-level constraint 1-70
rowids 1-75
algorithms for adding
columns 1-49
BEFORE option 1-64
cascading deletes 1-61
changing column data type 1-66
changing table lock mode 1-75
CHECK clause 1-63
DEFAULT clause 1-51
DROP clause 1-64
DROP CONSTRAINT clause 1-73
dropping
a column 1-64
a column constraint 1-73
rowids 1-76
LOCK MODE clause 1-75
MODIFY NEXT SIZE clause 1-74
ON DELETE CASCADE
keyword 1-57
PAGE keyword 1-75
privilege for 1-340
reclustering a table 1-44
REFERENCES clause 1-57
ROW keyword 1-75
rules for primary key
constraints 1-72
rules for unique constraints 1-72
setting columns NOT NULL 1-53
specifying object modes for
constraints 1-55
syntax 1-46
American National Standards
Institute. See ANSI.
AND keyword
syntax in Condition
segment 1-643
use
in Condition segment 1-656
with BETWEEN keyword 1-476
AND logical operator 1-656
ANSI compliance
-ansi flag Intro-21, 1-149, 1-155,
1-225
list of SQL statements 1-16
reserved words 1-724
table naming 1-432
ANSI-compliance
updating rows 1-614
ANSI-compliant database
constraint naming 1-658
create with START
DATABASE 1-581
description of 1-106
FOR UPDATE not required
in 1-238
procedure naming 1-754
synonym naming 1-766
table privileges 1-155
using with INFORMIX-SE 1-108
with BEGIN WORK 1-78
ANY keyword
beginning a subquery 1-479
use in Condition subquery 1-655
Application
comments in 1-10
single-threaded 1-529
thread-safe 1-263, 1-529, 1-532
Arbitrary rule 1-36, 1-126, 1-188
Arithmetic functions. See Algebraic
functions.
Arithmetic operator, in
expression 1-672
Array, moving rows into with
FETCH 1-303
AS keyword
in SELECT 1-461
syntax
in CREATE VIEW 1-224
in GRANT 1-340
use
in CREATE VIEW 1-226
in GRANT 1-354
with display labels 1-466
with table aliases
1-474
ASC keyword
syntax
Index 3
in CREATE INDEX 1-109
in SELECT 1-487
use
in CREATE INDEX 1-113
in SELECT 1-490
ASCII code set 1-763
ASIN function
syntax in expression 1-704
use in expression 1-706
Asterisk (*)
arithmetic operator 1-671
as wildcard character in a
condition 1-651
use in SELECT 1-461
ATAN function
syntax in expression 1-704
use in expression 1-706
ATAN2 function
syntax in expression 1-704
use in expression 1-706
Attached index 1-123
Audit trail
applying with RECOVER
TABLE 1-425
dropping with DROP
AUDIT 1-265
manipulating audit trail file 1-427
no clustered index 1-111
starting with CREATE
AUDIT 1-102
Automatic type conversion. See
Data type conversion.
AVG function
syntax in expression 1-709
use in expression 1-712
B
Backslash (\)
as escape character with
LIKE 1-650
as escape character with
MATCHES 1-651
Backup. See Archiving.
BEFORE keyword
in ALTER TABLE 1-64
in CREATE TRIGGER 1-199
BEGIN WORK statement
locking in a transaction 1-77
syntax 1-77
BETWEEN keyword
syntax in Condition
segment 1-644
use
in Condition segment 1-648
in SELECT 1-476
Binary Large Object (BLOB)
attaching tables 1-29
effect of isolation on
retrieval 1-559, 1-580
in a LOAD statement 1-384
in an UNLOAD statement 1-607
Boolean expression
in Condition segment 1-643
Btree cleaner list 1-626
BUFFERED keyword, syntax in SET
LOG 1-564
BUFFERED LOG keywords
syntax in CREATE
DATABASE 1-104
use in CREATE
DATABASE 1-107
Buffered logging 1-104
BYTE data type
considerations for UNLOAD
statement 1-607
requirements for LOAD
statement 1-384
syntax 1-665
with stored procedures 2-10, 2-15
C
Calculated expression, restrictions
with GROUP BY 1-484
CALL keyword, in the
WHENEVER statement 1-632,
1-638
CALL statement
syntax 2-4
Caret (^) wildcard in Condition
segment 1-651
Cascading deletes
defined 1-61, 1-170
locking associated with 1-62,
1-171
logging 1-62, 1-171
restriction 1-62, 1-172
syntax 1-57, 1-165
Cascading triggers
and triggering table 1-213, 1-217
description of 1-216
maximum number of 1-216
scope of correlation names 1-210
triggered actions 1-201
CHAR data type
in INSERT 1-760
syntax 1-665
using as default value 1-52, 1-160
CHARACTER VARYING data type
syntax 1-667
CHARACTER_LENGTH
function 1-698
CHAR_LENGTH function 1-698
Check constraint
adding with ALTER TABLE 1-63
definition of 1-172
specifying at column level 1-172
specifying at table level 1-172
CHECK keyword
use in ALTER TABLE 1-63
use in CREATE TABLE 1-172
CHECK TABLE statement, syntax
and use 1-79
Checking for corrupted tables 1-79
Client/server
environment 1-219
CLOSE DATABASE statement
prerequisites to close 1-85
syntax 1-85
CLOSE statement
closing a select cursor 1-82
closing an insert cursor 1-82
cursors affected by transaction
end 1-84
syntax 1-81
with concatenation
operator 1-673
CLUSTER keyword
syntax
in ALTER INDEX 1-43
in CREATE INDEX 1-109
use
in ALTER INDEX 1-44
in CREATE INDEX 1-111
4 Informi x Gui de to SQL: Syntax
Clustered index
with ALTER INDEX 1-43
with audit trails 1-111
Clustered index, creating with
CREATE INDEX 1-111
Collation
with relational operators 1-762
Column
defining as foreign key 1-176
defining as primary key 1-176
displaying information for 1-366
dropping 1-64
effect on constraints 1-65
effect on triggers 1-65
effect on views 1-65
inserting into 1-372
modifying with ALTER
TABLE 1-66
naming conventions 1-429
number allowed when defining
constraint 1-156
putting a constraint on 1-156
referenced and referencing 1-59,
1-168
renaming 1-428
specifying a subscript 1-489,
1-675
specifying check constraint
for 1-172
specifying with CREATE
TABLE 1-158
virtual 1-226
Column expression
in SELECT 1-464
syntax 1-673
Column name
using functions as names 1-729
using keywords as names 1-730
when qualified 1-209
Column number
effect on triggers 1-198
Column value
in triggered action 1-211
qualified vs. unqualified 1-211
when unqualified 1-211
Column-level privilege 1-351
COLUMNS FOR keywords, in
INFO statement 1-366
Command file
comment symbols in 1-10
defined 1-10
See also Command script.
Command script
See also Command file.
Comment symbol
curly brackets ({}) 1-9
double dash (--) 1-9
examples of 1-10
how to enter 1-9
in application programs 1-10
in command file 1-10
in prepared statements 1-405
in SQL APIs 1-10
in stored procedure 1-10
COMMIT WORK statement
syntax 1-87
use in ANSI-compliant
databases 1-88
use in non-ANSI databases 1-87
Committed Read isolation
level 1-557
COMMITTED READ keywords,
syntax in SET
ISOLATION 1-556
Comparison condition
syntax and use 1-644
Complex query
example of 1-552
Composite column list, multiple-
column restrictions 1-71, 1-72
Composite index
column limit 1-113
definition of 1-113
Compound assignment 2-32
Concatenation operator (||) 1-672
Concurrency
Committed Read isolation 1-557
Cursor Stability isolation 1-558
defining with SET
ISOLATION 1-556
defining with SET
TRANSACTION 1-579
Dirty Read isolation 1-557
Read Committed isolation 1-578
Read Uncommitted
isolation 1-578
Repeatable Read isolation 1-558,
1-578
Serializable isolation level 1-578
Condition segment
ALL, ANY, SOME
subquery 1-655
boolean expressions 1-644
comparison condition 1-644
description of 1-643
join conditions 1-480
null values 1-644
relational operators in 1-647
subquery in SELECT 1-652
syntax 1-643
use of functions in 1-644
wildcards in searches 1-650
with BETWEEN keyword 1-648
with ESCAPE keyword 1-651
with EXISTS keyword 1-654
with IN keyword 1-648
with IS keyword 1-649
with MATCHES keyword 1-649
with NOT keyword 1-650
CONNECT keyword
in GRANT 1-343
in REVOKE 1-446
Connect privilege 1-343, 1-446
CONNECT statement
and INFORMIXSERVER
environment variable 1-91
connection context 1-91
connection identifiers 1-91
database environment 1-94
DEFAULT option 1-91
implicit connections 1-92
syntax 1-89
use 1-90
USER clause 1-99
WITH CONCURRENT
TRANSACTION option 1-93
CONNECT TO statement
with concatenation
operator 1-673
Connection
context 1-91, 1-262, 1-528
current 1-90, 1-263, 1-532
default 1-92, 1-262, 1-531
dormant 1-90, 1-262, 1-528
identifiers 1-91
implicit 1-92, 1-262, 1-531
Constant expression
Index 5
in SELECT 1-464
inserting with PUT 1-418
restrictions with GROUP
BY 1-484
syntax 1-676
Constraint
adding with ALTER TABLE 1-68,
1-69, 1-70, 1-156, 1-515
affected by dropping a column
from table 1-65
checking 1-217
definition of 1-155
dropping with ALTER
TABLE 1-73, 1-156
enforcing 1-157
modifying a column that has
constraints 1-66
number of columns
allowed 1-156, 1-174
object modes for
setting with SET 1-501
privileges needed to create 1-72
rules for unique constraints 1-70
specifying at table level 1-174
transaction mode 1-523
with DROP INDEX 1-268
CONSTRAINT keyword
in ALTER TABLE 1-69
in CREATE TABLE 1-162
Consumed table 1-25
CONTINUE keyword, in the
WHENEVER statement 1-632,
1-637
CONTINUE statement
syntax 2-7
Conventions
for naming tables 1-154
Correlated subquery
definition of 1-653
Correlation name
and stored procedures 1-210
in COUNT DISTINCT
clause 1-210
in GROUP BY clause 1-210
in SET clause 1-210
in stored procedure 1-214
new 1-205
old 1-205
rules for 1-209
scope of 1-210
table of values 1-211
using 1-209
when to use 1-210
COS function
syntax in expression 1-704
use in expression 1-705
COUNT DISTINCT clause 1-210
COUNT field
getting contents with GET
DESCRIPTOR 1-314
setting value for WHERE
clause 1-542
use in GET DESCRIPTOR 1-316
COUNT function
syntax in expression 1-709
use in expression 1-711, 1-713
COUNT keyword, use in SET
DESCRIPTOR 1-543
CREATE AUDIT statement
need for archive 1-103
starts audit trail 1-102
syntax 1-102
CREATE DATABASE statement
ANSI compliance 1-106
logging with OnLine 1-106
syntax 1-104
using with
CREATE SCHEMA 1-147
INFORMIX-SE 1-107
PREPARE 1-105
CREATE INDEX statement
cluster with fragments 1-111
composite indexes 1-113
fragment by expression 1-124
implicit table locks 1-110
IN dbspace clause 1-123
specifying a storage option 1-123
specifying object modes 1-128
syntax 1-109
using with
ASC keyword 1-113
CLUSTER keyword 1-111
CREATE SCHEMA 1-147
DESC keyword 1-113
FILLFACTOR clause 1-122
UNIQUE keyword 1-110
CREATE PROCEDURE FROM
statement
syntax and use 1-144
CREATE PROCEDURE statement
syntax 1-134
CREATE ROLE statement 1-145
CREATE SCHEMA statement
defining a trigger 1-193
specifying owner of created
objects with GRANT 1-149
syntax 1-147
with CREATE sequences 1-149
CREATE SYNONYM statement
chaining synonyms 1-152
synonym for a table 1-150
synonym for a view 1-150
syntax 1-150
with CREATE SCHEMA 1-147
CREATE TABLE statement
adding rowids 1-183
cascading deletes 1-170
CHECK clause 1-172
creating temporary table 1-177
DEFAULT clause 1-159
defining constraints
at column level 1-162
at table level 1-174
FRAGMENT BY clause 1-186
IN dbspace clause 1-184
LOCK MODE clause 1-190
naming conventions 1-154
ON DELETE CASCADE
keywords 1-165
REFERENCES clause 1-165
rules for primary keys 1-167
rules for referential
constraints 1-167
rules for unique constraints 1-167
setting columns NOT
NULL 1-162
specifying extent size 1-188
specifying table columns 1-158
storing database tables 1-183
syntax 1-154
TEMP TABLE clause 1-177
with BLOB data types 1-163
with CREATE SCHEMA 1-147
WITH ROWIDS clause 1-183
CREATE TRIGGER statement
in ESQL/C 1-193
in ESQL/COBOL 1-193
6 Informi x Gui de to SQL: Syntax
privilege to use 1-193
purpose 1-192
specifying object modes 1-222
syntax 1-192
triggered action clause 1-206
use 1-193
CREATE VIEW statement
column data types 1-225
privileges 1-225
syntax 1-224
virtual column 1-226
WITH CHECK OPTION
1-227
with CREATE SCHEMA 1-147
with SELECT * notation 1-224
Curly brackets ({}) comment
symbol 1-9
Current database
specifying with
DATABASE 1-229
CURRENT function
syntax
in Condition segment 1-644
in expression 1-676
in INSERT 1-375
use
in ALTER TABLE 1-51
in CREATE TABLE 1-159
in expression 1-680
in INSERT 1-377
in WHERE condition 1-681
input for DAY function 1-681
CURRENT keyword
in DISCONNECT
statement 1-263
in SET CONNECTION
statement 1-532
syntax in FETCH 1-296
use in FETCH 1-300
CURRENT OF keywords
syntax
in DELETE 1-252
in UPDATE 1-612
use
in DELETE 1-254
in UPDATE 1-620
Cursor
activating with OPEN 1-390
affected by transaction end 1-84
associating with prepared
statements 1-247
characteristics 1-239
closing 1-81
closing with ROLLBACK
WORK 1-456
declaring 1-234
definition of types 1-237
for update 1-239, 1-242
restricted statements 1-245
using in ANSI-mode
databases 1-246
using in non-ANSI
databases 1-246
manipulation statements 1-13
opening 1-392, 1-393
read-only 1-245
defined 1-238
restricted statements 1-245
using in ANSI-mode
databases 1-246
using in non-ANSI
databases 1-246
retrieving values with
FETCH 1-296
scroll 1-240
sequential 1-239
statement, as trigger event 1-195
using with transactions 1-248
with
INTO keyword in
SELECT 1-469
prepared statements 1-238
Cursor Stability isolation
level 1-558
CURSOR STABILITY keywords,
syntax in SET
ISOLATION 1-556
Cursory procedure 2-25
D
Data
inserting with the LOAD
statement 1-380
Data access statements 1-14
Data definition statements 1-12
Data distributions
confidence 1-629
on temporary tables 1-631
RESOLUTION 1-628, 1-629
DATA field
setting with SET
DESCRIPTOR 1-545
Data integrity
statements 1-14
Data manipulation statements 1-13
Data model
See also Relational model.
Data type
changing with ALTER
TABLE 1-68
considerations for INSERT 1-376,
1-760
requirements for referential
constraints 1-60, 1-169
segment 1-664
specifying with CREATE
VIEW 1-225
syntax 1-665
See also each data type listed
under its own name.
Database
closing with CLOSE
DATABASE 1-85
creating ANSI-compliant 1-581
creating with CREATE
DATABASE 1-105
default isolation levels 1-558,
1-579
dropping 1-266
lock 1-231
naming conventions 1-662
naming with variable 1-663
opening in exclusive mode 1-231
optimizing queries 1-626
remote 1-662
renaming 1-431
restoring 1-457
stopping logging on 1-581
Database Administrator
(DBA) 1-344
Database Name segment
database outside DBPATH 1-663
for remote database 1-662
naming conventions 1-660
naming with variable 1-663
Index 7
syntax 1-660
using quotes, slashes 1-663
Database object
meaning in SET statement 1-502
DATABASE statement
determining database type 1-229
exclusive mode 1-231
specifying current database 1-229
SQLWARN after 1-230
syntax 1-229
using with program
variables 1-231
Database-level privilege
description of 1-342
granting 1-342
passing grant ability 1-353
revoking 1-446
See also Privilege.
Dataskip
skipping unavailable
dbspaces 1-534
DATE data type
functions in 1-699
syntax 1-665
DATE function
syntax in expression 1-699
use in expression 1-700
DATETIME data type
as quoted string 1-759
field qualifiers 1-669
in
expression 1-681
INSERT 1-760
syntax 1-665, 1-746
DATETIME Field Qualifier
segment 1-669
DAY function
syntax in expression 1-699
use
in expression 1-701
DAY keyword
syntax
in DATETIME data type 1-669
in INTERVAL data type 1-743
use
as DATETIME field
qualifier 1-746
as INTERVAL field
qualifier 1-749
DBA keyword in REVOKE 1-446
DBANSIWARN environment
variable 1-149, 1-155, 1-225
DBA-privileged procedure 1-135
DBCENTURY environment
variable 1-383
DBDATE environment
variable 1-383, 1-606
DBDELIMITER environment
variable 1-385
DBINFO function
syntax in expression 1-690
use in expression 1-690
DBMONEY environment
variable 1-383, 1-606
DBMS. See Database management
system.
DBPATH environment
variable 1-231, 1-663
.dbs extension 1-105, 1-179, 1-231
DBSERVERNAME function
returning server name 1-679
use
in ALTER TABLE 1-51
in CREATE TABLE 1-159
in expression 1-679
dbspace
skipping if unavailable 1-534
DBSPACETEMP environment
variable
for locating temporary
tables 1-178
DBTIME environment
variable 1-383, 1-607
DDL statements, summary 1-12
Deadlock detection 1-562
DEALLOCATE DESCRIPTOR
statement
syntax 1-232
with concatenation
operator 1-673
DECIMAL data type
syntax 1-665
using as default value 1-52, 1-160
DECLARE statement
cursor characteristics 1-239
cursor types 1-237
cursors with prepared
statements 1-247
cursors with transactions 1-248
definition and use
hold cursor 1-240
insert cursor 1-239, 1-250
procedure cursor 1-238
read-only cursor 1-238, 1-245
scroll cursor 1-240
select cursor 1-238
sequential cursor 1-239
update cursor 1-239, 1-242
FOR READ ONLY 1-238, 1-245
insert cursor 1-237
insert cursor with hold 1-251
procedure cursor 1-237
restrictions with SELECT with
ORDER BY 1-491
syntax 1-234
update cursor 1-237
updating specified
columns 1-243
use
with concatenation
operator 1-673
with FOR UPDATE
keywords 1-239
with SELECT 1-470
DEFAULT keyword
in CONNECT statement 1-91
in DISCONNECT
statement 1-262
in SET CONNECTION
statement 1-531
Default value
specifying
with ALTER TABLE 1-52
with CREATE TABLE 1-159
DEFINE statement
placement of 2-9
syntax 2-8
DELETE keyword
syntax
in GRANT 1-349
in REVOKE 1-442
use
in GRANT 1-350
in REVOKE 1-443
Delete privilege 1-349
DELETE REFERENCING clause
8 Informi x Gui de to SQL: Syntax
and FOR EACH ROW
section 1-205
syntax 1-203
DELETE statement
as triggering statement 1-195
cascading 1-253
CURRENT OF clause 1-254
in trigger event 1-194
in triggered action 1-207
privilege for 1-349
syntax 1-252
with cursor 1-242
with SELECT...FOR
UPDATE 1-492
within a transaction 1-252
DELIMIDENT environment
variable 1-728
Delimited identifers
non-ASCII characters in 1-728
Delimited identifier
defined 1-727
multibyte characters in 1-728
syntax 1-726
Delimiter
for LOAD input file 1-385
specifying with UNLOAD 1-608
DELIMITER keyword
in LOAD 1-385
in UNLOAD 1-608
Demonstration database
copying Intro-9
installation script Intro-8
overview Intro-8
See also stores7 database.
DESC keyword 1-490
syntax
in CREATE INDEX 1-109
in SELECT 1-487
use
in CREATE INDEX 1-113
in SELECT 1-490
DESCRIBE statement
and the USING SQL
DESCRIPTOR clause 1-258
describing statement type 1-256
INTO sqlda pointer clause 1-259
relation to GET
DESCRIPTOR 1-317
syntax 1-255
using with concatenation
operator 1-673
values returned by SELECT 1-257
Descriptor 1-258
Detached index 1-123
Diagnostics table
creating with START
VIOLATIONS TABLE 1-584
examples 1-510, 1-516, 1-599,
1-601, 1-604
how to start 1-506, 1-584
how to stop 1-507, 1-603
privileges on 1-597
relationship to target table 1-588
relationship to violations
table 1-588
restriction on dropping 1-275
structure 1-596
use with SET 1-505
when to start 1-506
Directory, extension, .dbs 1-105,
1-231
Dirty Read isolation level 1-557
DIRTY READ keywords, syntax in
SET ISOLATION 1-556
Disabled object mode
benefits of 1-521
defined 1-509
DISCONNECT statement
ALL keyword 1-264
CURRENT keyword 1-263
DEFAULT option 1-262
with
concatenation operator 1-673
Display label
syntax in SELECT 1-461
DISTINCT keyword
syntax
in CREATE INDEX 1-109
in expression 1-709
in SELECT 1-461
use
in CREATE INDEX 1-110
in SELECT 1-463
no effect in subquery 1-654
Distributions
dropping with DROP
DISTRIBUTIONS clause 1-628
privileges required to
create 1-629
using the HIGH keyword 1-629
using the MEDIUM
keyword 1-629
Division (/) symbol, arithmetic
operator 1-671
DML statements, summary 1-13
Documentation notes Intro-28
Double-dash (--) comment
symbol 1-9
DROP AUDIT statement 1-265
DROP CONSTRAINT keywords
syntax in ALTER TABLE 1-46
use in ALTER TABLE 1-73
DROP DATABASE
statement 1-266
DROP INDEX statement
syntax 1-268
DROP keyword
syntax in ALTER TABLE 1-46
use in ALTER TABLE 1-64
DROP ROLE statement 1-271
DROP SYNONYM statement 1-272
DROP TABLE statement 1-274
DROP TRIGGER statement
syntax 1-277
use of 1-277
DROP VIEW statement 1-279
Duplicate values
in a query 1-463
Dynamic management
statements 1-13
E
Enabled object mode
benefits of 1-522
defined 1-509
Environment variable
setting
with SYSTEM statement 2-44
ERROR 1-637
Error checking
continuing after error in stored
procedure 2-38
error status with ON
EXCEPTION 2-35
Index 9
with SYSTEM 2-43
ERROR keyword, in the
WHENEVER statement 1-632,
1-637
Errors
detecting with
WHENEVER 1-635
ESCAPE keyword
syntax in Condition
segment 1-644
use
in Condition segment 1-649
with LIKE keyword 1-477,
1-651
with MATCHES
keyword 1-478, 1-652
with WHERE keyword 1-477
EXCLUSIVE keyword
syntax
in DATABASE 1-229
in LOCK TABLE 1-387
use
in DATABASE 1-231
in LOCK TABLE 1-388
EXECUTE IMMEDIATE statement
restricted statement types 1-291
syntax and usage 1-290
using with concatenation
operator 1-673
EXECUTE ON keywords
syntax in GRANT 1-340
use
in GRANT 1-345
EXECUTE PROCEDURE
statement 1-293
associating cursor with
DECLARE 1-238
in FOREACH 2-23
in triggered action 1-207
with
INTO keyword 1-302
EXECUTE statement
and sqlca record 1-283
error conditions with 1-289
parameterizing a statement 1-287
syntax 1-281
USING DESCRIPTOR
clause 1-289
with concatenation
operator 1-673
with INTO keyword 1-283
with USING keyword 1-286
EXISTS keyword
beginning a subquery 1-478
use in condition subquery 1-654
EXIT statement
syntax 2-16
EXP function
syntax in expression 1-695
use in expression 1-695
Explicit temporary table 1-177
Exponential function
EXP function 1-695
Expression
in UPDATE 1-618
ordering by 1-491
Expression segment
aggregate expressions 1-709
column expressions 1-673
combined expressions 1-721
constant expressions 1-676
expression types 1-671
function expressions 1-683
in SPL expressions 1-722
syntax 1-671
Expression-based distribution
scheme
in ALTER FRAGMENT 1-35
in CREATE INDEX 1-124
in CREATE TABLE 1-187
EXTEND function
syntax in expression 1-699
use in expression 1-702
Extension, to SQL
symbol for Intro-21
extension, .lok 1-562
Extent
modifying size of new extents
with ALTER TABLE 1-74
EXTENT SIZE keywords 1-188
F
FETCH statement
as affected by CLOSE 1-82
checking results with
SQLCA 1-306
fetching a row for update 1-305
locking for update 1-305
relation to GET
DESCRIPTOR 1-314
specifying memory location of a
value 1-301
syntax 1-296
with
concatenation operator 1-673
program arrays 1-303
scroll cursor 1-300
sequential cursor 1-299
X/Open mode 1-299
Field qualifier
for DATETIME 1-669
for INTERVAL 1-743, 1-749
File
extension
.lok 1-562
sending output with the OUTPUT
statement 1-400
FILLFACTOR clause in CREATE
INDEX 1-122
Filtering object mode
benefits of 1-523
defined 1-510
finding location of row 1-675
FIRST keyword
syntax in FETCH 1-296
use in FETCH 1-300
FLOAT data type
syntax 1-665
using as default value 1-52, 1-160
FLUSH statement
syntax 1-308
with concatenation
operator 1-673
FOR EACH ROW action
SELECT statement in 1-201
triggered action list 1-200
FOR keyword
in CONTINUE 2-7
in CREATE AUDIT 1-102
in CREATE SYNONYM 1-150
in EXIT 2-16
FOR READ ONLY keywords
use
10 Informi x Gui de to SQL: Syntax
in DECLARE 1-245
FOR statement
specifying multiple ranges 2-21
syntax 2-18
using expression lists 2-21
using increments 2-20
FOR TABLE keywords, in UPDATE
STATISTICS 1-624
FOR UPDATE keywords
relation to UPDATE 1-621
syntax
in DECLARE 1-234
in SELECT 1-459
use
in DECLARE 1-239, 1-242, 1-248
in SELECT 1-492
with column list 1-243
FOREACH keyword
in CONTINUE statement 2-7
in EXIT 2-16
FOREACH statement
syntax 2-23
Foreign key 1-60, 1-168, 1-176
FOREIGN KEY keywords
in ALTER TABLE 1-69
in CREATE TABLE 1-174
FRACTION keyword
syntax
in DATETIME data type 1-669
in INTERVAL data type 1-743
use
as DATETIME field
qualifier 1-746
as INTERVAL field
qualifier 1-749
Fragment
modifying with ALTER
FRAGMENT 1-22
Fragmentation
adding a fragment 1-37
adding rowids with ALTER
TABLE 1-75
adding rowids with CREATE
TABLE 1-183
altering fragments 1-22
alter, attaching tables 1-25
and BLOB columns 1-29
combining tables 1-25
defining a new fragmentation
strategy 1-25
defining and initializing 1-30
detaching a table fragment 1-29
dropping an existing
fragment 1-39
dropping rowids with ALTER
TABLE 1-76
expression-based distribution
scheme 1-35, 1-124, 1-187
fragment expressions 1-28, 1-35,
1-126
if you run out of log/disk
space 1-24
indexes, by expression with
CREATE INDEX 1-124
modifying an existing fragment
expression 1-40
modifying indexes 1-42
number of rows in fragment 1-24
reinitializing fragmentation
strategy 1-30
reinitializing strategy with INIT
clause 1-32
remainder 1-39
round robin 1-35
round-robin distribution
scheme 1-187
rowid 1-35
rules 1-187
setting priority levels for
PDQ 1-568
skipping an unavailable
dbspace 1-534
tables, syntax 1-186
Fragment-level privilege
granting with GRANT
FRAGMENT 1-356
revoking with REVOKE
FRAGMENT 1-450
FREE statement
effect on cursors 1-399
syntax 1-311
with concatenation
operator 1-673
FROM keyword
syntax
in PUT 1-416
in SELECT 1-459
use
in PUT 1-420
in SELECT 1-472
Function
algebraic 1-684
Function expression
Algebraic functions 1-683
CHARACTER_LENGTH 1-698
CHAR_LENGTH 1-698
DBINFO function 1-690
description of 1-683
Exponential and logarithmic
functions 1-683
HEX function 1-683
in SELECT 1-464
LENGTH function 1-683, 1-697
OCTET_LENGTH 1-698
Time functions 1-683
Trigonometric functions 1-683
TRIM function 1-683
G
GET DESCRIPTOR statement
syntax 1-314
the COUNT keyword 1-316
use with FETCH statement 1-304
with concatenation
operator 1-673
X/Open mode 1-317
GET DIAGNOSTICS statement
CLASS_ORIGIN keyword 1-331
CONNECTION_NAME
keyword 1-334
exception clause 1-329
MESSAGE_LENGTH
keyword 1-331
MESSAGE_TEXT keyword 1-331
MORE keyword 1-328
NUMBER keyword 1-328
purpose 1-321
RETURNED_SQLSTATE
keyword 1-331
ROW_COUNT keyword 1-328
SERVER_NAME keyword 1-331
SQLSTATE codes 1-323
statement clause 1-327
keywords 1-327
Index 11
SUBCLASS_ORIGIN
keyword 1-331
syntax 1-321
Global Language Support (GLS)
default locale Intro-7
nondefault locales Intro-7
GLS. See Global Language Support.
GL_DATE environment
variable 1-383, 1-606
GL_DATETIME environment
variable 1-383, 1-607
GO TO keywords, in the
WHENEVER statement 1-632,
1-637
GOTO keyword, in the
WHENEVER statement 1-632,
1-637
GRANT FRAGMENT statement
AS grantor clause 1-363
syntax 1-356
usage 1-356
WITH GRANT OPTION
clause 1-362
GRANT statement
changing grantor 1-354
creating a privilege chain 1-353
database-level privileges 1-342
default table privileges 1-352
passing grant ability 1-353
privileges on a view 1-355
role privileges 1-345
syntax 1-340
table-level privileges 1-350
ALL keyword 1-352
ALTER keyword 1-350
with CREATE SCHEMA 1-147
GROUP BY clause 1-210
GROUP BY keywords
syntax in SELECT 1-459
use in SELECT 1-483
H
Hash rule 1-36, 1-126, 1-188
HAVING keyword
syntax in SELECT 1-459
use in SELECT 1-485
HEX function 1-675
syntax in expression 1-696
use in expression 1-696
HIGH keyword 1-566
Hold cursor
definition of 1-239
insert cursor with hold 1-251
use of 1-240
HOUR keyword
syntax
in DATETIME data type 1-669
in INTERVAL data type 1-743
use
as DATETIME field
qualifier 1-746
as INTERVAL field
qualifier 1-749
I
IDATA field
SET DESCRIPTOR
statement 1-545
with X/Open programs 1-317
Identifier segment
column names 1-734
cursor name 1-736, 1-739
delimited identifiers 1-726
multibyte characters in 1-726
non-ASCII characters in 1-726
stored procedures 1-736
syntax 1-723
table names 1-733, 1-734
using keywords as column
names 1-730
variable name 1-738
IF statement
syntax 2-27
syntax and use 2-27
with null values 2-28
ILENGTH field
SET DESCRIPTOR
statement 1-545
with X/Open programs 1-317
Implicit temporary table 1-178
IN keyword
syntax
in CREATE AUDIT 1-102
in CREATE DATABASE 1-104
in CREATE TABLE 1-183
in LOCK TABLE 1-387
use
in Condition segment 1-648
in Condition subquery 1-653
with WHERE keyword 1-476
Index
attached, defined 1-123
bidirectional traversal 1-114
cleaner list. See Btree cleaner list.
clustered fragments 1-111
converting during
upgrade 1-623, 1-627
creating fragments 1-124
creating with CREATE
INDEX 1-109
detached 1-123
displaying information for 1-367
dropping with DROP
INDEX 1-268
duplicate 1-110
effected with ALTER
FRAGMENT ATTACH 1-26
effects on altered fragments 1-29
naming conventions 1-659, 1-742
on ORDER BY columns 1-114,
1-492
provide for expansion 1-122
sharing with constraints 1-157
surviving 1-22
unique
adding when duplicate values
exist 1-130, 1-515
restrictions 1-33
with temporary tables 1-497
with unique and referential
constraints 1-110
index
number allowed on same
columns 1-120
INDEX keyword
syntax
in GRANT 1-349
in REVOKE 1-442
use
in GRANT 1-351
in REVOKE 1-443
Index Name segment
syntax 1-658, 1-741
12 Informi x Gui de to SQL: Syntax
use 1-742
Index privilege 1-351
INDEXES FOR keywords, in INFO
statement 1-367
INDICATOR field
setting with SET
DESCRIPTOR 1-547
INDICATOR keyword, in
SELECT 1-469, 1-470, 1-471
Indicator variable
in expression 1-721
in SELECT 1-469, 1-470, 1-471
INFO statement
displaying privileges and
status 1-368
displaying tables, columns, and
indexes 1-366
syntax 1-365
INFORMIX-OnLine Dynamic
Server
and triggering statement 1-194
INFORMIX-OnLine/Optical
list of statements 1-15
INFORMIXSERVER environment
variable 1-91
informix, privileges associated with
user 1-344
In-place alter algorithm 1-49
Insert buffer
counting inserted rows 1-310,
1-423
filling with constant values 1-418
inserting rows with a
cursor 1-373
storing rows with PUT 1-417
triggering flushing 1-422
Insert cursor
closing 1-82
definition of 1-237
in INSERT 1-373
in PUT 1-419
opening 1-394
reopening 1-396
result of CLOSE in SQLCA 1-82
use of 1-239
with hold 1-251
INSERT INTO keywords
in INSERT 1-370
in LOAD 1-386
INSERT keyword
syntax
in GRANT 1-349
in REVOKE 1-442
use
in GRANT 1-350
in REVOKE 1-443
INSERT REFERENCING clause
and FOR EACH ROW
section 1-205
syntax 1-202
INSERT statement
effect of transactions 1-374
filling insert buffer with
PUT 1-417
in dynamic SQL 1-379
in trigger event 1-194
in triggered action 1-207
inserting
nulls with the VALUES
clause 1-378
rows through a view 1-372
rows with a cursor 1-373
SERIAL columns 1-377
specifying values to insert 1-375
syntax 1-370
use with insert cursor 1-250
using functions in the VALUES
clause 1-377
with
DECLARE 1-234
SELECT 1-378
INTEGER data type
syntax 1-665
using as default value 1-52, 1-160
Integrity. See Data integrity.
INTERVAL data type
as quoted string 1-759
field qualifier, syntax 1-743
in expression 1-682
in INSERT 1-760
syntax 1-665, 1-749
INTERVAL Field Qualifier
segment 1-743
INTO keyword
in SELECT 1-467
syntax
in FETCH 1-296
in SELECT 1-459
use
in FETCH 1-303
in SELECT 1-467
INTO TEMP keywords
syntax in SELECT 1-459
use
in SELECT 1-495
with UNION operator 1-499
IS keyword
in Condition segment 1-649
with WHERE keyword 1-476
IS NOT keywords, syntax in
Condition segment 1-644
IS NULL keywords 1-476
ISAM error code 2-34, 2-39
Isolation level
Committed Read 1-557
Cursor Stability 1-558
definitions 1-557, 1-578
Dirty Read 1-557
in external tables 1-559, 1-575
Read Committed 1-578
Read Uncommitted 1-578
Repeatable Read 1-558, 1-578
Serializable 1-578
use with FETCH statement 1-305
ITYPE field
SET DESCRIPTOR
statement 1-545
setting with SET
DESCRIPTOR 1-547
with X/Open programs 1-317
J
Join
in Condition segment 1-480
multiple-table join 1-481
outer join 1-482
self-join 1-482
two-table join 1-481
Join column. See Foreign key.
K
Keywords
SQL 1-724
using in triggered action 1-208
Index 13
L
LAST keyword
syntax in FETCH 1-296
use in FETCH 1-300
LENGTH field
setting with SET
DESCRIPTOR 1-545
with DATETIME and INTERVAL
types 1-546
with DECIMAL and MONEY
types 1-546
LENGTH function
in expression 1-464
syntax in expression 1-683, 1-697
use in expression 1-698
LET statement
syntax 2-31
LIKE keyword
syntax in Condition
segment 1-644
use in SELECT 1-477
wildcard characters 1-477
List-mode format, in SET 1-502
Literal
DATETIME
in Condition segment 1-644
in expression 1-676, 1-681
segment 1-746
syntax 1-746
syntax in INSERT 1-375
use in ALTER TABLE 1-51
use in CREATE TABLE 1-159
with IN keyword 1-476
DATE, using as a default
value 1-52, 1-160
INTERVAL
in Condition segment 1-644
in expression 1-676, 1-682
segment 1-749
syntax 1-749
syntax in INSERT 1-375
using as default value 1-52,
1-160
Number
in Condition segment 1-644
in expression 1-676, 1-680
segment 1-752
syntax 1-752
syntax in INSERT 1-375
with IN keyword 1-649
LOAD statement
DELIMITER clause 1-385
INSERT INTO clause 1-386
loading VARCHAR, TEXT, or
BYTE data types 1-384
specifying the table to load
into 1-386
syntax 1-380
the LOAD FROM file 1-382
Locale
default Intro-7
non-default Intro-7
LOCK MODE keywords
syntax
in ALTER TABLE 1-46
in CREATE TABLE 1-190
use
in ALTER TABLE 1-75
in CREATE TABLE 1-190
LOCK TABLE statement
in databases with
transactions 1-388
in databases without
transactions 1-389
syntax 1-387
Locking
during
delete 1-252
inserts 1-374
updates 1-243, 1-615
overriding row-level 1-388
releasing with COMMIT
WORK 1-87
releasing with ROLLBACK
WORK 1-455
types of locks
page lock 1-190
row lock 1-190
update cursors effect on 1-243
update locks 1-615
waiting period 1-562
with
FETCH 1-305
SET ISOLATION 1-556
SET LOCK MODE 1-561
SET TRANSACTION 1-575
UNLOCK TABLE 1-610
within transaction 1-77
LOG IN keywords, syntax in
CREATE DATABASE 1-104
LOG10 function
syntax in expression 1-696
use in expression 1-696
Logarithmic function
syntax
LOG10 function 1-695
LOGN function 1-695
use
LOG10 function 1-696
LOGN function 1-695
Logging
buffered versus unbuffered 1-564
cascading deletes 1-62, 1-171
changing mode with SET
LOG 1-564
finding log-file location 1-108
renaming log 1-582
setting with CREATE
TABLE 1-182
starting with START
DATABASE 1-108, 1-581
stopping 1-582
stopping with START
DATABASE 1-581
with INFORMIX-OnLine 1-106
with INFORMIX-SE 1-107
with triggers 1-220
Logical operator
in Condition segment 1-656
LOGN function
syntax in expression 1-695
use in expression 1-695
.lok extension 1-562
Loop
controlled 2-18
indefinite with WHILE 2-49
LOW keyword 1-566
M
Machine notes Intro-28
Mail, sending from stored
procedure 2-44
MATCHES keyword
14 Informi x Gui de to SQL: Syntax
syntax in Condition
segment 1-644
use
in Condition segment 1-649
in SELECT 1-477
wildcard characters 1-478
MAX function
syntax in expression 1-709
use in expression 1-712
MDY function
syntax in expression 1-699
Memory
allocating for a system sqlda
structure 1-19
MIN function
syntax in expression 1-709
use in expression 1-713
Minus (-) sign, arithmetic
operator 1-671
MINUTE keyword
syntax
in DATETIME data type 1-669
in INTERVAL data type 1-743
use
as DATETIME field
qualifier 1-746
as INTERVAL field
qualifier 1-749
MOD function
syntax in expression 1-684
use in expression 1-687
MODE ANSI keywords
syntax
in CREATE DATABASE 1-104
in START DATABASE 1-581
use
in CREATE DATABASE 1-107
in START DATABASE 1-582
Model. See Data model.
MODIFY keyword
syntax in ALTER TABLE 1-46
use in ALTER TABLE 1-66
MODIFY NEXT SIZE keywords
syntax in ALTER TABLE 1-46
use in ALTER TABLE 1-74
MONEY data type
syntax 1-665
using as default value 1-52
MONEY data type, using as default
value 1-160
MONTH function
syntax in expression 1-699
use in expression 1-701
MONTH keyword
syntax
in DATETIME data type 1-669
in INTERVAL data type 1-743
use
as DATETIME field
qualifier 1-746
as INTERVAL field
qualifier 1-749
MS-DOS operating system. See DOS
operating system.
Multiple triggers
column numbers in 1-198
example 1-197
order of execution 1-198
preventing overriding 1-219
Multiplication sign, arithmetic
operator 1-671
Multirow query
destination of returned
values 1-301
managing with FETCH 1-298
N
Naming convention
column 1-429
database 1-662
index 1-659, 1-742, 1-767
table 1-154, 1-770
NCHAR data type
syntax 1-667
Nested ordering, in SELECT 1-490
NEW keyword
in DELETE REFERENCING
clause 1-204
in INSERT REFERENCING
clause 1-202
in UPDATE REFERENCING
clause 1-205
NEXT keyword
syntax in FETCH 1-296
use in FETCH 1-300
NEXT SIZE keywords, use in
CREATE TABLE 1-188
NODEFDAC environment variable
effects on new stored
procedure 1-135
NOT CLUSTER keywords
syntax in ALTER INDEX 1-43
use in ALTER TABLE 1-45
NOT FOUND keywords in
WHENEVER statement 1-632
NOT IN keywords, use in
Condition subquery 1-653
NOT keyword
syntax
in Condition segment 1-643,
1-644
with BETWEEN keyword 1-476
with IN keyword 1-478
use
in Condition segment 1-650
with LIKE, MATCHES
keywords 1-477
NOT NULL keywords
syntax
in ALTER TABLE 1-54
in CREATE TABLE 1-162
use
in ALTER TABLE 1-53
in CREATE TABLE 1-162
with IS keyword 1-476
NOT operator, condition 1-644
NOT WAIT keywords in SET
LOCK MODE 1-561
NULL keyword, ambiguous as
procedure variable 1-737
Null value
checking for in SELECT 1-284,
1-287
in SPL IF statement 2-28
inserting with the VALUES
clause 1-378
returned implicitly by stored
procedure 2-41
specifying as default value 1-53
updating a column 1-618
used in Condition with NOT
operator 1-644
used in the ORDER BY
clause 1-490
Index 15
with SPL WHILE statement 2-49
NVARCHAR data type
syntax 1-667
O
Object database in SET
statement 1-502
Object mode
disabled
benefits of 1-521
defined 1-509
enabled
benefits of 1-522
defined 1-509
examples 1-510, 1-516
filtering
benefits of 1-523
defined 1-510
error options in SET 1-504
for triggers 1-222
meaning in SET statement 1-502
privileges required for
changing 1-502
setting with SET 1-501
use
with data definition
statements 1-515
with data manipulation
statements 1-509
OCTET_LENGTH function 1-698
OF keyword
syntax in DECLARE 1-234
use in DECLARE 1-243
OLD keyword
in DELETE REFERENCING
clause 1-204
in INSERT REFERENCING
clause 1-202
in UPDATE REFERENCING
clause 1-205
ON DELETE CASCADE
keyword,DELETE trigger
event 1-194
ON EXCEPTION statement
placement of 2-35
syntax 2-34
ON keyword
syntax
in CREATE INDEX 1-109
in GRANT 1-340
use
in CREATE INDEX 1-110
in GRANT 1-352
On-line files Intro-28
OPEN statement
constructing the active set 1-392
opening a procedure cursor 1-393
opening an insert cursor 1-394
opening select or update
cursors 1-392
reopening a cursor 1-395, 1-396
substituting values for ?
parameters 1-396
syntax 1-390
with concatenation
operator 1-673
with FREE 1-399
Optimization, specifying a high or
low level 1-566
Optimizer
and SET OPTIMIZATION
statement 1-566
with UPDATE
STATISTICS 1-626, 1-631
Optimizing
a query 1-548
a server 1-566
across a network 1-567
OR keyword
syntax in Condition
segment 1-643
use in Condition segment 1-656
ORDER BY keywords
ascending order 1-490
descending order 1-490
indexes on ORDER BY
columns 1-114, 1-492
restrictions in INSERT 1-378
select columns by number 1-491
syntax in SELECT 1-459
use
in SELECT 1-487
with UNION operator 1-498
Order of execution, of action
statements 1-207
Outer join, forming 1-473
OUTER keyword, with FROM
keyword in SELECT 1-472
OUTPUT statement, syntax and
use 1-400
Owner
in ALTER TABLE 1-47
in CREATE SYNONYM 1-150
in Index Name segment 1-658,
1-741
in Procedure Name
segment 1-754
in RENAME COLUMN 1-429
in RENAME TABLE 1-432
in Synonym Name segment 1-766
in Table Name segment 1-768
in View Name segment 1-772
of view in CREATE VIEW 1-773
Owner-privileged procedure 1-135
P
PAGE keyword
use in ALTER TABLE 1-75
use in CREATE TABLE 1-190
Parallel distributed queries
SET PRIORITY statement 1-568
Parameter
BYTE or TEXT in SPL 2-15
in CALL statement 2-5
Parameterizing
defined 1-287
prepared statements 1-287
Parameterizing a statement
with SQL identifiers 1-409
Parent-child relationship 1-59,
1-168
PDQ
SET PDQPRIORITY
statement 1-568
PDQPRIORITY, SET
PDQPRIORITY statement 1-568
Percent (%) sign, wildcard in
Condition segment 1-650
PERFORM keyword, in the
WHENEVER statement 1-632,
1-639
Permission, with SYSTEM 2-44
Permission. See Privilege.
16 Informi x Gui de to SQL: Syntax
Phantom row 1-557, 1-578
PIPE keyword, in the OUTPUT
statement 1-401
Plus (+) sign, arithmetic
operator 1-671
POW function
syntax in expression 1-684
use in expression 1-688
PRECISION field
with GET DESCRIPTOR 1-318
with SET DESCRIPTOR 1-546
PREPARE statement
executing 1-281
increasing performance
efficiency 1-414
multi-statement text 1-412, 1-414
parameterizing a statement 1-408
parameterizing for SQL
identifiers 1-409
question (?) mark as
placeholder 1-403
releasing resources with
FREE 1-313
restrictions with SELECT 1-405
statement identifier use 1-403
syntax 1-402
valid statement text 1-405
with concatenation
operator 1-673
Prepared statement
comment symbols in 1-405
describing returned values with
DESCRIBE 1-256
executing 1-281
parameterizing 1-287
prepared object limit 1-403
valid statement text 1-405
PREVIOUS keyword
syntax in FETCH 1-296
use in FETCH 1-300
Primary key constraint 1-59
data type conversion 1-68
defining column as 1-176
dropping 1-74
enforcing 1-157
modifying a column with 1-67
referencing 1-60
requirements for 1-54, 1-176
rules of use 1-72, 1-168
PRIMARY KEY keywords
in ALTER TABLE 1-69
in CREATE TABLE 1-162, 1-174
PRIOR keyword
syntax in FETCH 1-296
use in FETCH 1-300
Privilege
Alter 1-351
Connect 1-343
DBA 1-344
default for table using CREATE
TABLE 1-155
Delete 1-350
displaying with the INFO
statement 1-368
for triggered action 1-215
fragment-level
defined 1-358
duration of 1-360
granting with GRANT
FRAGMENT 1-356
revoking with REVOKE
FRAGMENT 1-450
role in command
validation 1-359
granting to roles 1-345
granting with GRANT 1-340
Index 1-351
Insert 1-350
needed
to create a view 1-355
to drop an index 1-268
to modify data 1-350
on a synonym 1-150
on a table fragment 1-356, 1-450
on a view 1-225
Resource 1-343
revoking with REVOKE 1-437
Update 1-350
when privileges conflict 1-341
PRIVILEGES FOR keywords, in
INFO statement 1-368
PRIVILEGES keyword
syntax
in GRANT 1-349
in REVOKE 1-442
use
in GRANT 1-351
in REVOKE 1-444
Procedure cursor
in DECLARE statement 1-237
opening 1-393
reopening 1-395
Procedure name
conflict with function name 1-755
naming conventions 1-755
Procedure Name segment
syntax 1-754
Promotable lock 1-243
PUBLIC keyword
syntax
in GRANT 1-340
in REVOKE 1-443
use
in GRANT 1-344
in REVOKE 1-443
PUT statement
FLUSH with 1-417
impact on trigger 1-195
source of row values 1-418
syntax 1-416
use in transactions 1-417
with concatenation
operator 1-673
Q
Qualifier, field
for DATETIME 1-669, 1-746
for INTERVAL 1-743, 1-749
Query
optimization information
statements 1-14
piping results to another
program 1-401
sending results to an operating
system file 1-400
sending results to another
program 1-401
Question mark (?)
as placeholder in PREPARE 1-403
naming variables in PUT 1-420
replacing with USING
keyword 1-396
wildcard in Condition
segment 1-651
Quotation marks
Index 17
double
around delimited
identifier 1-726
around quoted string 1-757
within delimited
identifier 1-729
within quoted string 1-759
single
around quoted string 1-757
within quoted string 1-759
Quoted string
in expression 1-676
syntax
in Condition segment 1-644
in expression 1-709
in INSERT 1-375
use
in expression 1-678
in INSERT 1-760
with LIKE, MATCHES
keywords 1-477
Quoted String segment
DATETIME, INTERVAL values
as strings 1-759
syntax 1-757
wildcards 1-759
with LIKE in a condition 1-759
R
RAISE EXCEPTION statement
syntax 2-39
RANGE function 1-717
Range rule 1-35, 1-126, 1-187
Read Committed isolation
level 1-578
READ COMMITTED keywords,
syntax in SET
TRANSACTION 1-575
Read Uncommitted isolation
level 1-578
READ UNCOMMITTED
keywords, syntax in SET
TRANSACTION 1-575
RECOVER TABLE statement
archiving a database with audit
trails 1-425
manipulating audit trail file 1-427
syntax 1-425
REFERENCES FOR keywords, in
INFO statement 1-368
REFERENCES keyword
in ALTER TABLE 1-57
in CREATE TABLE 1-165, 1-170
syntax
in GRANT 1-349
in REVOKE 1-442
use
in GRANT 1-351
in REVOKE 1-444
References privilege
definition of 1-351
displaying with the INFO
statement 1-368
REFERENCING clause
DELETE REFERENCING
clause 1-203
INSERT REFERENCING
clause 1-202
UPDATE REFERENCING
clause 1-204
using referencing 1-209
Referential constraint
and a DELETE trigger 1-194
data type restrictions 1-169
definition of 1-59, 1-167
dropping 1-74
enforcing 1-157
modifying a column with 1-67
rules of use 1-168
Relational operator
in Condition segment 1-644
segment 1-761
with WHERE keyword in
SELECT 1-475
RELATIVE keyword
syntax in FETCH 1-296
use in FETCH 1-300
Release notes Intro-28
Remainder, in fragment
expressions 1-39
RENAME COLUMN statement
restrictions 1-428
syntax 1-428
RENAME DATABASE
statement 1-431
RENAME TABLE statement
ANSI-compliant naming 1-432
syntax 1-432
REPAIR TABLE statement, syntax
and use 1-435
Repeatable Read isolation level
description of 1-558, 1-578
emulating during update 1-305
REPEATABLE READ keywords
syntax in SET ISOLATION 1-556
syntax in SET
TRANSACTION 1-575
Reserved words 1-724
in ANSI SQL standard 1-724
use with delimited
identifiers 1-727
use with identifiers 1-724
Resolution
in UPDATE STATISTICS 1-628,
1-629
with data distributions 1-628
RESOURCE keyword
use
in REVOKE 1-446
Resource privilege 1-343
Result of triggering
statement 1-208
RETURN statement
returning insufficient values 2-41
returning null values 2-41
syntax 2-41
REVOKE FRAGMENT statement
syntax 1-450
REVOKE statement
column-specific privileges 1-445
database-level privileges 1-445
privileges needed 1-439
RESTRICT option 1-441
syntax 1-438
table-level privileges
ALL keyword 1-444
description 1-442
using with roles 1-440
Role
creating with CREATE ROLE
statement 1-145
definition 1-145
dropping with DROP ROLE
statement 1-271
enabling with SET ROLE 1-571
18 Informi x Gui de to SQL: Syntax
granting privileges with GRANT
statement 1-345
revoking privileges with
REVOKE 1-440
setting with SET ROLE 1-571
ROLLBACK WORK statement
syntax 1-455
use with WHENEVER 1-78, 1-86,
1-456
with DROP DATABASE 1-267
with DROP INDEX
statement 1-269
with DROP PROCEDURE
statement 1-270
with DROP SYNONYM
statement 1-272
with DROP TABLE
statement 1-274
with DROP TRIGGER
statement 1-277
with DROP VIEW
statement 1-279
ROLLFORWARD DATABASE
statement
exclusive locking 1-457
syntax 1-457
ROOT function
syntax in expression 1-684
use in expression 1-688
ROUND function
syntax in expression 1-684
use in expression 1-688
Round-robin distribution scheme
defined with ALTER
FRAGMENT 1-35
Row
deleting 1-252
engine response to locked
row 1-562
inserting
through a view 1-372
with a cursor 1-373
multirow queries with
FETCH 1-298
order, guaranteeing
independence of 1-201
phantom 1-557, 1-578
retrieving with FETCH 1-301
rowid definition 1-301
updating through a view 1-613
writing buffered rows with
FLUSH 1-308
ROW keyword
use in ALTER TABLE 1-75
use in CREATE TABLE 1-190
Rowid
adding
column with INIT clause 1-35
to fragmented table with
CREATE TABLE 1-183
to fragmented tables with
ALTER TABLE 1-75
dropping from fragmented
tables 1-76
use in a column expression 1-675
use in fragmented tables 1-35
used as column name 1-732
ROWID keyword 1-675
Rule
arbitrary 1-36, 1-126, 1-188
hash 1-36, 1-126, 1-188
range 1-35, 1-126, 1-187
Rules for stored procedures 1-214
S
SCALE field
with GET DESCRIPTOR 1-318
with SET DESCRIPTOR 1-546
Schema. See Data model.
Scroll cursor
definition of 1-239
FETCH with 1-300
use of 1-240
SCROLL keyword
syntax in DECLARE 1-234
use in DECLARE 1-240
SECOND keyword
syntax
in DATETIME data type 1-669
in INTERVAL data type 1-743
use
as DATETIME field
qualifier 1-746
as INTERVAL field
qualifier 1-749
Segment
defined 1-640
relation to SPL statements 1-640
relation to SQL statements 1-640
Select cursor
definition of 1-237
opening 1-392
reopening 1-395
use of 1-238
SELECT keyword
ambiguous use as procedure
variable 1-737
syntax
in GRANT 1-349
in REVOKE 1-442
use
in GRANT 1-350
in REVOKE 1-443
Select privilege
definition of 1-350
SELECT statement
aggregate functions in 1-709
as an argument to a stored
procedure 2-6
associating with cursor with
DECLARE 1-238
BETWEEN condition 1-476
column numbers 1-491
cursor for 1-238, 1-492, 1-493
describing returned values with
DESCRIBE 1-255
FOR READ ONLY clause 1-493
FOR UPDATE clause 1-492
FROM Clause 1-472
GROUP BY clause 1-483
HAVING clause 1-485
IN condition 1-476
in FOR EACH ROW section 1-201
INTO clause with ESQL 1-467
INTO TEMP clause 1-495
IS NULL condition 1-476
joining tables in WHERE
clause 1-480
LIKE or MATCHES
condition 1-477
null values in the ORDER BY
clause 1-490
ORDER BY clause 1-487
relational-operator
condition 1-475
Index 19
restrictions with INTO
clause 1-405
ROWID keyword 1-675
SELECT clause 1-461
select numbers 1-491
singleton 1-468
subquery with WHERE
keyword 1-475
syntax 1-459
UNION operator 1-498
use of expressions 1-463
with
DECLARE 1-234
FOREACH 2-23
INSERT 1-378
INTO keyword 1-302
LET 2-32
writing rows retrieved to an
ASCII file 1-605
Self-join
description of 1-482
Sequential cursor
definition of 1-239
use of 1-239
with FETCH 1-299
SERIAL data type
in INSERT 1-377
resetting values 1-67
syntax 1-665
with stored procedures 2-10
Serializable isolation level
description of 1-578
SERIALIZABLE keyword, syntax in
SET TRANSACTION 1-575
Server. See Database server.
Session control block
accessed by DBINFO
function 1-693
defined 1-693
Session id
defined 1-693
returned by DBINFO
function 1-693
SET clause 1-210
SET CONNECTION statement
CURRENT keyword 1-532
DEFAULT option 1-531
syntax and use 1-527
with concatenation
operator 1-673
SET DATASKIP statement
syntax 1-534
what causes a skip 1-535
SET DEBUG FILE TO statement
syntax and use 1-537
with TRACE 2-46
SET DESCRIPTOR statement
syntax 1-540
the VALUE option 1-543
with concatenation
operator 1-673
X/Open mode 1-545
SET EXPLAIN statement
interpreting output 1-549
MERGE JOIN information 1-550
optimizer access paths 1-549
output examples 1-551
SORT SCAN information 1-550
syntax 1-548
SET ISOLATION statement
default database levels 1-558
definition of isolation levels 1-557
effects of isolation 1-559
similarities to SET
TRANSACTION
statement 1-576
syntax 1-556
SET keyword
syntax in UPDATE 1-612
use in UPDATE 1-616
SET LOCK MODE statement
kernel locking 1-562
setting wait period 1-562
syntax 1-561
SET LOG statement
buffered vs. unbuffered 1-564
syntax 1-564
SET OPTIMIZATION statement,
syntax and use 1-566
SET PDQPRIORITY
statement 1-568
SET ROLE statement 1-571
SET SESSION AUTHORIZATION
statement 1-573
SET statement
error options 1-504
list mode format 1-502
privileges required for
executing 1-502
purpose 1-501
relationship to START
VIOLATIONS TABLE 1-505,
1-585
relationship to STOP
VIOLATIONS TABLE 1-507
syntax 1-501
table mode format 1-502
use
in setting transaction mode of
constraints 1-523
with CREATE TRIGGER 1-217
with data definition
statements 1-515
with data manipulation
statements 1-509
with diagnostics tables 1-505
with violations tables 1-505
SET TRANSACTION statement
default database levels 1-579
definition of isolation levels 1-578
effects of isolation 1-580
similarities to SET ISOLATION
statement 1-576
syntax 1-575
SHARE keyword, syntax in LOCK
TABLE 1-387
Simple assignment 2-32
SIN function
syntax in expression 1-704
use in expression 1-705
Single-threaded application 1-529
Singleton SELECT statement 1-468
SITENAME function
returns server name 1-679
syntax
in expression 1-676
in INSERT 1-375
use
in ALTER TABLE 1-51
in CREATE TABLE 1-159
in expression 1-679
in INSERT 1-377
Slash (/), arithmetic operator 1-671
SMALLFLOAT data type
syntax 1-665
SMALLINT data type
20 Informi x Gui de to SQL: Syntax
syntax 1-665
using as default value 1-52, 1-160
SOME keyword
beginning a subquery 1-479
use in Condition subquery 1-655
Sorting
in a combined query 1-498
in SELECT 1-487
SPL
statements described 2-3
SQL
comments 1-9
compliance of statements with
ANSI standard 1-16
keywords 1-724
statement types 1-12
SQL Communications Area
(SQLCA)
and EXECUTE statement 1-283
result after CLOSE 1-82
result after DATABASE 1-229
result after DESCRIBE 1-256
result after FETCH 1-306
result after FLUSH 1-309
result after OPEN 1-392, 1-393
result after PUT 1-422
result after SELECT 1-471
warning when dbspace
skipped 1-534
SQL statement. SeeStatement, SQL .
SQLCA. See SQL Communications
Area.
sqlda structure
syntax
in DESCRIBE 1-256
in FETCH 1-296
in OPEN 1-284, 1-287, 1-391,
1-417
use
in DESCRIBE 1-257
in FETCH 1-304
in OPEN 1-398
in PUT 1-421
use with EXECUTE
statement 1-287
SQLERROR keyword, in the
WHENEVER statement 1-632,
1-635
SQLNOTFOUND, error conditions
with EXECUTE statement 1-289
SQLSTATE
Not Found condition 1-637
runtime errors 1-635
warnings 1-636
SQLSTATE variable
list of codes 1-323
SQLWARNING keyword, in the
WHENEVER statement 1-632,
1-636
SQRT function
syntax in expression 1-684
use in expression 1-689
START DATABASE statement
syntax and use 1-581
START VIOLATIONS TABLE
statement
description of 1-584
privileges required for
executing 1-587
relationship to SET 1-505, 1-585
relationship to STOP
VIOLATIONS TABLE 1-586
syntax 1-584
Statement
SQL
Statements that are extensions to
ANSI standard 1-16
Statement identifier
associating with cursor 1-238
definition of 1-403
releasing 1-404
syntax
in DECLARE 1-234
in FREE 1-311
use
in DECLARE 1-247
in FREE 1-313
in PREPARE 1-403
Statement, SQL
ANSI-compliant 1-16
ANSI-compliant with Informix
extensions 1-16
how to enter 1-6
types 1-12
STATUS FOR keywords, in INFO
statement 1-369
Status, displaying with INFO
statement 1-369
STDEV function 1-718
STOP keyword, in the WHENEVER
statement 1-632, 1-637
STOP VIOLATIONS TABLE
statement
description of 1-603
privileges required for
executing 1-604
relationship to SET 1-507
relationship to START
VIOLATIONS TABLE 1-586
syntax 1-603
Stored procedure
as triggered action 1-214
BYTE and TEXT data types 2-15
checking references 1-214
comments in 1-10, 1-138
cursors with 2-24
DBA-privileged, how to
create 1-135
DBA-privileged, use with
triggers 1-215
debugging 2-46
definition of 2-3
displaying documentation 1-139
executing operating system
commands from 2-43
granting privileges on 1-345
handling multiple rows 2-42
header 2-9
in SELECT statements 1-465
in WHEN condition 1-207
naming output file for TRACE
statement 1-537
owner-privileged 1-135, 1-215
privileges 1-215
receiving data from
SELECT 1-467
revoking privileges on 1-439
sending mail from 2-44
simulating errors 2-39
stores7 database
copying Intro-9
creating Intro-9
overview Intro-8
See also Demonstration database.
Index 21
Structured Query Language. See
SQL.
Subquery
beginning with
ALL/ANY/SOME
keywords 1-479
beginning with EXISTS
keyword 1-478
beginning with IN
keyword 1-478
correlated 1-653
definition of 1-475
in Condition segment 1-652
restrictions with UNION
operator 1-499
with DISTINCT keyword 1-463
Subscripting
on character columns 1-489, 1-675
Substring
in column expression 1-675
in ORDER BY clause of
SELECT 1-489
SUM function
syntax in expression 1-709
use in expression 1-713
Surviving
index 1-22
table 1-22, 1-25
Synonym
ANSI-compliant naming 1-150
chains 1-152
creating with CREATE
SYNONYM 1-150
difference from alias 1-150
dropping 1-272
naming conventions 1-767
Synonym Name segment
syntax 1-766
use 1-767
syscolauth system catalog
table 1-443
sysdepend system catalog
table 1-279
systabauth system catalog
table 1-443
System catalog
database entries 1-105
syscolauth 1-443
systabauth 1-354, 1-443
System descriptor area
assigning values to 1-542
modifying contents 1-543
resizing 1-543
use of 1-258
use with EXECUTE
statement 1-288
System name, in database
name 1-662
SYSTEM statement
setting environment variables
with 2-44
syntax 2-43
T
Table
adding a constraint 1-68, 1-69,
1-70
algorithms for adding
columns 1-49
alias in SELECT 1-472
ANSI-compliant naming 1-770
checking with the CHECK TABLE
statement 1-79
consumed 1-25
creating
a synonym for 1-150
a table 1-154
a temporary table 1-177
defining fragmentation
strategy 1-186
defining temporary 1-180
diagnostic 1-596
dropping
a synonym 1-272
a table 1-274
dropping a constraint 1-73
engine response to locked
table 1-562
fragmenting 1-183
joins in Condition segment 1-480
loading data with the LOAD
statement 1-380
locking
changing mode 1-75
with ALTER INDEX 1-44
with LOCK TABLE 1-387
logging 1-182
naming conventions 1-154, 1-770
optimizing queries 1-626
repairing with REPAIR TABLE
statement 1-435
restoring with audit trail 1-425
storing in dbspaces 1-183
surviving 1-22, 1-25
target 1-588
temporary 1-26
unlocking 1-610
violations 1-587
TABLE keyword, syntax in
UPDATE STATISTICS 1-624
Table mode format, in SET 1-502
Table Name segment 1-768
Table-level privilege
column-specific privileges 1-445
default with GRANT 1-352
definition and use 1-350
granting 1-349
passing grant ability 1-353
revoking 1-442
TABLES keyword, in INFO
statement 1-366
tabtype 1-108
TAN function
syntax in expression 1-704
use in expression 1-705
Target table
relationship to diagnostics
table 1-588
relationship to violations
table 1-588
TEMP keyword
syntax in SELECT 1-459
use in SELECT 1-495
TEMP TABLE keywords, syntax in
CREATE TABLE 1-154
Temporary table
building distributions 1-631
creating constraints for 1-180
DBSPACETEMP environment
variable 1-178
defining columns 1-180
explicit 1-177
implicit 1-178
naming 1-178
storage
22 Informi x Gui de to SQL: Syntax
created with CREATE
TABLE 1-178
created with SELECT INTO
TEMP 1-496
updating statistics 1-626
when deleted 1-177
TEXT data type
requirements for LOAD
statement 1-384
syntax 1-665
with stored procedures 2-10, 2-15
Thread
defined 1-529
in multithreaded
application 1-529
Thread-safe application
description 1-263, 1-529, 1-532
Time function
restrictions with GROUP
BY 1-484
use in SELECT 1-464
TO CLUSTER keywords, in ALTER
INDEX 1-44
TO keyword
in expression 1-709
in GRANT 1-340
TODAY function
syntax
in Condition segment 1-644
in expression 1-676
in INSERT 1-375
use
in ALTER TABLE 1-51
in constant expression 1-680
in CREATE TABLE 1-159
in INSERT 1-377
TP/XA. See Transaction manager.
TRACE statement
syntax 2-46
Transaction
and CREATE DATABASE 1-107
in active connection 1-93
recovering transactions 1-457
rolling back 1-455
starting with BEGIN WORK 1-77
stopping logging 1-581
using cursors in 1-248
Transaction logging
description of 1-581
renaming log 1-582
stopping 1-582
Transaction mode, for
constraints 1-523
Trigger
affected by dropping a column
from table 1-65
effects on altered fragments 1-29
effects with ALTER FRAGMENT
ATTACH 1-26
in client/server
environment 1-219
number on a table 1-194
object modes for 1-222
setting with SET 1-501
preventing overriding 1-219
Trigger event
definition of 1-194
in CREATE TRIGGER
statement 1-194
INSERT 1-202
privileges on 1-195
with cursor statement 1-195
Trigger name
syntax 1-196
Triggered action
action on triggering table 1-212
anyone can use 1-216
cascading 1-201
clause
action statements 1-207
WHEN condition 1-206
correlation name in 1-210, 1-214
in client/server
environment 1-219
list
AFTER 1-200
BEFORE 1-199
FOR EACH ROW 1-200
for multiple triggers 1-200
sequence of 1-199
merged 1-200
preventing overriding 1-219
syntax 1-206
WHEN condition 1-206
Triggering statement
affecting multiple rows 1-201
execution of 1-195
guaranteeing same result 1-194
result of 1-208
UPDATE 1-198
Triggering table
action on 1-212
and cascading triggers 1-217
Trigonometric function
ACOS function 1-706
ASIN function 1-706
ATAN function 1-706
ATAN2 function 1-706
COS function 1-705
SIN function 1-705
TAN function 1-705
TRIM function 1-707
TRUNC function
syntax in expression 1-684
use in expression 1-690
TYPE field
changing from BYTE or
TEXT 1-547
setting in SET
DESCRIPTOR 1-544
setting in X/Open
programs 1-545
with X/Open programs 1-317
U
Underscore (_), wildcard in
Condition segment 1-650
UNION operator
restrictions on use 1-498
syntax in SELECT 1-459
use in SELECT 1-498
Unique constraint
dropping 1-73, 1-74
modifying a column with 1-67
rules of use 1-71, 1-167, 1-176
UNIQUE keyword
syntax
in CREATE INDEX 1-109
in CREATE TABLE 1-162
in SELECT 1-461
use
in ALTER TABLE 1-69
in CREATE INDEX 1-110
in expression 1-709
in SELECT 1-463
Index 23
no effect in subquery 1-654
UNITS keyword
syntax in expression 1-676
use in expression 1-682
UNLOAD statement
DELIMITER clause 1-608
syntax 1-605
UNLOAD TO file 1-606
unloading VARCHAR, TEXT, or
BYTE columns 1-607
UNLOAD TO file 1-606
UNLOCK TABLE statement, syntax
and use 1-610
Updatable view 1-228
UPDATE clause, syntax 1-197
Update cursor
definition of 1-237
locking considerations 1-243
opening 1-392
restricted statements 1-245
use in UPDATE 1-620
using 1-242
UPDATE keyword
syntax
in GRANT 1-349
in REVOKE 1-442
use
in GRANT 1-350
in REVOKE 1-443
Update privilege
definition of 1-350
with a view 1-613
UPDATE REFERENCING clause
and FOR EACH ROW
section 1-205
syntax 1-204
UPDATE statement
and transactions 1-614
as triggered action 1-207
as triggering statement 1-195,
1-197, 1-198
in trigger event 1-194
locking considerations 1-615
restrictions on columns for
update 1-243
rolling back updates 1-614
syntax 1-613
updating a column to null 1-618
updating through a view 1-613
updating with cursor 1-620
use of expressions 1-619
with
a SELECT...FOR UDATE 1-492
FETCH 1-305
SET keyword 1-616
WHERE CURRENT OF
keywords 1-620
WHERE keyword 1-620
with an update cursor 1-242
UPDATE STATISTICS statement
and temporary tables 1-631
creating data distributions 1-628
dropping data distributions 1-628
examining index pages 1-626
optimizing search
strategies 1-626, 1-631
recommended procedure for
using 1-631
specifying distributions
only 1-630
syntax 1-623
using the LOW keyword 1-627
when to execute 1-627
Update trigger, defining
multiple 1-197
Upgrading the database
server 1-627
Upgrading to a newer database
server 1-627
USER function
as affected by ANSI
compliance 1-439, 1-679
syntax
in Condition segment 1-644
in expression 1-676
in INSERT 1-375
use
in ALTER TABLE 1-51
in CREATE TABLE 1-159
in expression 1-678
in INSERT 1-377
User informix, privileges associated
with 1-344
Using correlation names 1-209
USING DESCRIPTOR keywords
information from
DESCRIBE 1-258
syntax
in EXECUTE 1-281
in FETCH 1-296
in OPEN 1-390
in PUT 1-416
use
in FETCH 1-304
in OPEN 1-398
in PUT 1-289, 1-421
USING keyword
syntax
in EXECUTE 1-286
in OPEN 1-390
use
in EXECUTE 1-286
in OPEN 1-396
USING SQL DESCRIPTOR
keywords
in DESCRIBE 1-258
in EXECUTE 1-288
V
VALUE clause
after NULL value is fetched 1-319
relation to FETCH 1-318
use in GET DESCRIPTOR 1-317
use in SET DESCRIPTOR 1-543
VALUES clause
effect with PUT 1-419
syntax in INSERT 1-370
use in INSERT 1-375
VARCHAR data type
considerations for UNLOAD
statement 1-607
requirements for LOAD
statement 1-384
syntax 1-665
using as default value 1-52, 1-160
Variable
default values in SPL 2-12, 2-13
define in SPL 2-8
global, in SPL 2-11
local, in SPL 2-13
scope of SPL variable 2-9
unknown values in IF 2-28
VARIANCE function 1-718
View
24 Informi x Gui de to SQL: Syntax
affected by dropping a column
from base table 1-65
creating a view 1-224
creating synonym for 1-150
dropping 1-279
privilege when creating 1-225
privileges with GRANT 1-355
restrictions with UNION
operator 1-499
updatable 1-228
updating 1-613
virtual column 1-226
with SELECT * notation 1-224
View Name segment 1-772
Violations table
creating with START
VIOLATIONS TABLE 1-584
examples 1-510, 1-516, 1-592,
1-595, 1-604
how to start 1-506, 1-584
how to stop 1-507, 1-603
privileges on 1-590
relationship to diagnostics
table 1-588
relationship to target table 1-588
restriction on dropping 1-275
structure 1-587
use with SET 1-505
when to start 1-506
W
WAIT keyword, in the SET LOCK
MODE statement 1-561
Warning
if dbspace skipped 1-534
WEEKDAY function
syntax in expression 1-699
use in expression 1-701
WHEN condition
in triggered action 1-207
restrictions 1-207
use of 1-207
WHENEVER statement, syntax and
use 1-632
WHERE CURRENT OF keywords
impact on trigger 1-195
syntax
in DELETE 1-252
in UPDATE 1-612
use
in UPDATE 1-620
WHERE keyword
joining tables 1-480
setting descriptions of
items 1-542
syntax
in DELETE 1-252
in SELECT 1-459
in UPDATE 1-612
use
in DELETE 1-253
in UPDATE 1-620
with a subquery 1-475
with ALL keyword 1-479
with ANY keyword 1-479
with BETWEEN keyword 1-476
with IN keyword 1-476
with IS keyword 1-476
with LIKE keyword 1-477
with MATCHES keyword 1-477
with relational operator 1-475
with SOME keyword 1-479
WHILE keyword
in CONTINUE statement 2-7
in EXIT 2-16
WHILE statement
syntax 2-49
with NULL expressions 2-49
Wildcard character
asterisk (*) 1-651
backslash ( as escape
character 1-650, 1-651
caret (^) 1-651
percent sign (%) 1-650
question mark (?) 1-651
underscore (_) 1-650
with LIKE or MATCHES 1-477,
1-649, 1-759
wildcard in Condition
segment 1-651
WITH APPEND keywords, in the
SET DEBUG FILE TO
statement 1-537
WITH CHECK keywords
syntax in CREATE VIEW 1-224
use in CREATE VIEW 1-227
WITH GRANT keywords
syntax in GRANT 1-340
use in GRANT 1-353
WITH HOLD keywords
syntax in DECLARE 1-234
use in DECLARE 1-240, 1-251
WITH keyword, syntax in CREATE
DATABASE 1-104
WITH LOG IN keywords, syntax in
START DATABASE 1-581
WITH NO LOG keywords
syntax
in CREATE TABLE 1-154
in SELECT 1-495
in START DATABASE 1-581
use
in CREATE TABLE 1-182
in SELECT 1-498
in START DATABASE 1-582
WITH RESUME keywords, in
RETURN 2-42
WITH ROWIDS clause, of CREATE
TABLE 1-183
WITHOUT HEADINGS keywords,
in the OUTPUT statement 1-401
X
X/Open
specifications, icon for Intro-19
X/Open mode
FETCH statement 1-299
GET DESCRIPTOR 1-317
SET DESCRIPTOR
statement 1-545
Y
YEAR function
syntax in expression 1-699
use in expression 1-702
YEAR keyword
syntax
in DATETIME data type 1-669
in INTERVAL data type 1-743
use
as DATETIME field
qualifier 1-746
Index 25
as INTERVAL field
qualifier 1-749
Symbols
", double quotes
around delimited identifier 1-726
around quoted string 1-757
within delimited identifier 1-729
within quoted string 1-759
$INFORMIXDIR/etc/sqlhosts. See
sqlhosts file.
%, percent sign, wildcard in
Condition segment 1-650
) 1-651
*, asterisk
wildcard in Condition
segment 1-651
*, asterisk
arithmetic operator 1-671
use in SELECT 1-461
+, plus sign, arithmetic
operator 1-671
--, double dash, comment
symbol 1-9
-, minus sign, arithmetic
operator 1-671
, square brackets, wildcard in
Condition segment 1-651
., period 1-135
1-651
Square brackets 1-651
Wildcard character
square brackets ( 1-651
/, division symbol, arithmetic
operator 1-671
/, slash, arithmetic operator 1-671
?, question mark
as placeholder in PREPARE 1-403
naming variables in PUT 1-420
replacing with USING
keyword 1-396
wildcard in Condition
segment 1-651
\, backslash, as escape character
with LIKE 1-650
with MATCHES 1-651
^, caret, wildcard in Condition
segment 1-651
_, underscore, wildcard in
Condition segment 1-650
{}, curly brackets, comment
symbol 1-9
||, concatenation operator 1-672
, single quotes
around quoted string 1-757
within quoted string 1-759