SQL Syntax Informix
SQL Syntax Informix
Guide to SQL
Syntax
March 2003
Part Nos. CT1SQNA (Volume 1) and CT1SRNA (Volume 2)
Note:
Before using this information and the product it supports, read the information in the appendix
entitled “Notices.”
This document contains proprietary information of IBM. It is provided under a license agreement and is
protected by copyright law. The information contained in this publication does not include any product
warranties, and any statements provided in this manual should not be interpreted as such.
When you send information to IBM, you grant IBM a nonexclusive right to use or distribute the information
in any way it believes appropriate without incurring any obligation to you.
© Copyright International Business Machines Corporation 1996, 2003. All rights reserved.
US Government User Restricted Rights—Use, duplication or disclosure restricted by GSA ADP Schedule
Contract with IBM Corp.
Table of Contents
Introduction
In This Introduction . . . . . . . . . . . . . . . . . 3
About This Manual . . . . . . . . . . . . . . . . . . 3
Types of Users . . . . . . . . . . . . . . . . . . 3
Software Dependencies . . . . . . . . . . . . . . . 4
Assumptions About Your Locale. . . . . . . . . . . . 4
Demonstration Databases . . . . . . . . . . . . . . 5
New Features in Dynamic Server, Version 9.4 . . . . . . . . . 5
New Features in Extended Parallel Server Version 8.4 . . . . 7
Documentation Conventions . . . . . . . . . . . . . . 9
Typographical Conventions . . . . . . . . . . . . . 9
Icon Conventions . . . . . . . . . . . . . . . . . 10
Syntax Conventions . . . . . . . . . . . . . . . . 12
Example-Code Conventions . . . . . . . . . . . . . 16
Additional Documentation . . . . . . . . . . . . . . . 17
Related Reading . . . . . . . . . . . . . . . . . . . 19
Compliance with Industry Standards . . . . . . . . . . . 20
IBM Welcomes Your Comments . . . . . . . . . . . . . 20
Table of Contents v
LOAD . . . . . . . . . . . . . . . . . . . . . . 2-504
LOCK TABLE . . . . . . . . . . . . . . . . . . . 2-513
OPEN . . . . . . . . . . . . . . . . . . . . . . 2-516
OUTPUT . . . . . . . . . . . . . . . . . . . . . 2-525
PREPARE . . . . . . . . . . . . . . . . . . . . . 2-527
PUT . . . . . . . . . . . . . . . . . . . . . . . 2-539
RENAME COLUMN . . . . . . . . . . . . . . . . . 2-549
RENAME DATABASE . . . . . . . . . . . . . . . . 2-551
RENAME INDEX . . . . . . . . . . . . . . . . . . 2-552
RENAME SEQUENCE . . . . . . . . . . . . . . . . 2-553
RENAME TABLE . . . . . . . . . . . . . . . . . . 2-554
REVOKE . . . . . . . . . . . . . . . . . . . . . 2-557
REVOKE FRAGMENT . . . . . . . . . . . . . . . . 2-575
ROLLBACK WORK . . . . . . . . . . . . . . . . . 2-579
SELECT . . . . . . . . . . . . . . . . . . . . . 2-581
SET AUTOFREE . . . . . . . . . . . . . . . . . . 2-640
SET COLLATION . . . . . . . . . . . . . . . . . . 2-643
SET CONNECTION . . . . . . . . . . . . . . . . . 2-646
SET CONSTRAINTS . . . . . . . . . . . . . . . . . 2-651
SET Database Object Mode . . . . . . . . . . . . . . . 2-652
SET DATASKIP . . . . . . . . . . . . . . . . . . . 2-659
SET DEBUG FILE TO . . . . . . . . . . . . . . . . . 2-661
SET Default Table Type . . . . . . . . . . . . . . . . 2-663
SET Default Table Space . . . . . . . . . . . . . . . . 2-665
SET DEFERRED_PREPARE . . . . . . . . . . . . . . . 2-666
SET DESCRIPTOR . . . . . . . . . . . . . . . . . . 2-670
SET ENVIRONMENT. . . . . . . . . . . . . . . . . 2-678
SET EXPLAIN . . . . . . . . . . . . . . . . . . . 2-683
SET INDEX . . . . . . . . . . . . . . . . . . . . 2-689
SET INDEXES . . . . . . . . . . . . . . . . . . . 2-690
SET ISOLATION . . . . . . . . . . . . . . . . . . 2-691
SET LOCK MODE . . . . . . . . . . . . . . . . . . 2-696
SET LOG . . . . . . . . . . . . . . . . . . . . . 2-698
SET OPTIMIZATION . . . . . . . . . . . . . . . . . 2-700
SET PDQPRIORITY . . . . . . . . . . . . . . . . . 2-704
SET PLOAD FILE . . . . . . . . . . . . . . . . . . 2-707
SET Residency . . . . . . . . . . . . . . . . . . . 2-708
SET ROLE . . . . . . . . . . . . . . . . . . . . . 2-710
SET SCHEDULE LEVEL . . . . . . . . . . . . . . . . 2-712
SET SESSION AUTHORIZATION . . . . . . . . . . . . 2-713
SET STATEMENT CACHE . . . . . . . . . . . . . . . 2-715
SET TABLE . . . . . . . . . . . . . . . . . . . . 2-719
Chapter 4 Segments
In This Chapter . . . . . . . . . . . . . . . . . . 4-3
Arguments . . . . . . . . . . . . . . . . . . . . 4-5
Collection-Derived Table . . . . . . . . . . . . . . . 4-7
Collection Subquery . . . . . . . . . . . . . . . . . 4-22
Condition . . . . . . . . . . . . . . . . . . . . 4-24
Database Name . . . . . . . . . . . . . . . . . . 4-44
Database Object Name . . . . . . . . . . . . . . . . 4-46
Data Type . . . . . . . . . . . . . . . . . . . . 4-49
DATETIME Field Qualifier . . . . . . . . . . . . . . 4-65
Expression . . . . . . . . . . . . . . . . . . . . 4-67
External Routine Reference . . . . . . . . . . . . . . 4-187
Appendix C Notices
Index
Introduction
In This Introduction . . . . . . . . . . . . . . . . . . 3
About This Manual . . . . . . . . . . . . . . . . . . . 3
Types of Users . . . . . . . . . . . . . . . . . . . 3
Software Dependencies . . . . . . . . . . . . . . . . 4
Assumptions About Your Locale . . . . . . . . . . . . . 4
Demonstration Databases . . . . . . . . . . . . . . . 5
Additional Documentation . . . . . . . . . . . . . . . . 17
Related Reading . . . . . . . . . . . . . . . . . . . . 19
Compliance with Industry Standards . . . . . . . . . . . . 20
IBM Welcomes Your Comments . . . . . . . . . . . . . . 20
2 IBM Informix Guide to SQL: Syntax
In This Introduction
This introduction provides an overview of the information in this manual
and describes the documentation conventions that it uses.
Types of Users
This manual is written for the following users:
■ Database users
■ Database administrators
■ Database-application programmers
Introduction 3
Software Dependencies
Software Dependencies
This manual assumes that you are using one of the following database
servers:
This manual assumes that you use the U.S. 8859-1 English locale as the
default locale. The default is en_us.8859-1 (ISO 8859-1) on UNIX platforms or
en_us.1252 (Microsoft 1252) for Windows environments. These locales
support U.S. English format conventions for dates, times, and currency, and
also support the ISO 8859-1 or Microsoft 1252 code set, which includes the
ASCII code set plus many 8-bit characters such as é, è, and ñ.
Demonstration Databases
The DB-Access utility, which is provided with your IBM Informix database
server products, includes one or more of the following demonstration
databases:
The scripts that you use to install the demonstration databases reside in the
$INFORMIXDIR/bin directory on UNIX platforms and in the
%INFORMIXDIR%\bin directory in Windows environments.
The following list provides information about the new features for
IBM Informix Dynamic Server, Version 9.4, that this manual describes.
Introduction 5
New Features in Dynamic Server, Version 9.4
■ The LOAD and UNLOAD statements for flat-file I/O can support file
sizes larger than the 2 Gigabyte limit of earlier release versions.
■ User-defined functions can include multiple OUT parameters.
■ SPL functions can declare named return parameters.
■ Functional indexes can be based on more than 16 columns. The new
limit on index parts is language-dependent, but is greater than 90.
■ The LVARCHAR data type can be declared with a new size parameter
that can be larger than the former upper limit of 2048 bytes.
■ The functionality of the SET Residency statement is provided
automatically by the database server.
■ Performance enhancements
■ New SQL functionality
■ Version 8.3 features from Dynamic Server, Version 7.30
Performance Enhancements
This manual describes the following performance enhancements to
Version 8.4 of IBM Informix Extended Parallel Server:
Introduction 7
New Features in Extended Parallel Server Version 8.4
Documentation Conventions
This section describes the conventions that this manual uses. These
conventions make it easier to gather information from this and other volumes
in the documentation set.
Typographical Conventions
This manual uses the following conventions to introduce new terms,
illustrate screen displays, describe command syntax, and so forth.
Convention Meaning
italics Within text, new terms and emphasized words appear in italics.
italics Within syntax and code examples, variable values that you are
italics to specify appear in italics.
monospace Information that the product displays and information that you
monospace enter appear in a monospace typeface.
KEYSTROKE Keys that you are to press appear in uppercase letters in a sans
serif font.
Introduction 9
Icon Conventions
Icon Conventions
Throughout the documentation, you will find text that is identified by several
different types of icons. This section describes these icons.
Comment Icons
Comment icons identify three types of information, as the following table
describes. This information always appears in italics.
Icon Description
C
Identifies information that is specific to C user-defined
routines (UDRs)
DB
Identifies information that is specific to DB-Access
E/C
Identifies information that is specific to IBM Informix
ESQL/C
(1 of 2)
Icon Description
Ext
Identifies information that is specific to external routines,
that is, UDRs written in either C or Java language
GLS
Identifies information that relates to the IBM Informix
Global Language Support (GLS) feature
IDS
Identifies information or syntax that is specific to
IBM Informix Dynamic Server
Java
Identifies information that is specific to UDRs written in
Java
UNIX
Identifies information that is specific to the UNIX
operating system
Windows
Identifies information that applies to all Windows
environments
Introduction 11
Syntax Conventions
Compliance Icons
Compliance icons indicate paragraphs that provide guidelines for complying
with a standard.
Icon Description
ANSI
Identifies information that is specific to an ANSI-compliant
database
X/O
Identifies functionality that conforms to X/Open
+
Identifies an Informix extension to ANSI SQL-92 entry-
level standard SQL
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 or segment, as Figure 1 shows.
Figure 1
Example of a Simple Syntax Diagram
SET EXPLAIN ON
OFF
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.
Element Description
KEYWORD A word in UPPERCASE letters is a keyword. You must
spell the word exactly as shown; however, you can use
either uppercase or lowercase letters.
(.,;@+*-/) Punctuation and other nonalphanumeric 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 reference in a box represents a subdiagram. Imagine
ADD that the subdiagram is spliced into the main diagram
Clause
p. 3-288 at this point. When a page number is not specified, the
subdiagram appears on the same page. The aspect
ADD Clause ratio of a box is not significant.
(1 of 3)
Introduction 13
Syntax Conventions
Element Description
An icon is a warning that this path is valid only for
E/C some products, or only under certain conditions.
Characters on the icons indicate what products or
conditions support the path.
These icons might appear in path of a syntax diagram:
ALL
A shaded option is the default specification. This
option is in effect, unless you specify another path.
Element Description
NOT FOUND A set of multiple branches indicates that a choice
among more than two different paths is available.
ERROR
WARNING
Tip: For purposes of illustrating how to read syntax diagrams, this diagram has been
simplified, and does not reflect all of the options of the DELETE statement. See the
section “DELETE” on page 2-344” for the complete syntax of DELETE.
To use this diagram to construct a statement, start at the top left with the
keyword DELETE FROM. Then follow the diagram to the right, proceeding
through the options that you want.
Introduction 15
Example-Code Conventions
Example-Code Conventions
Examples of SQL code occur throughout this manual. Except where noted,
the code is not specific to any single IBM Informix application development
tool. If only SQL statements are listed in the example, they are not delimited
by semicolons. For instance, you might see the code in the following
example:
CONNECT TO stores_demo
...
COMMIT WORK
DISCONNECT CURRENT
To use this SQL code for a specific product, you must apply the syntax rules
for that product. For example, if you are using DB-Access, you must delimit
multiple statements with semicolons. If you are using an SQL API, you must
use EXEC SQL at the start of each statement and a semicolon (or other appro-
priate delimiter) at the end of the statement.
Tip: Ellipses points in program fragments indicate that additional code (that a full
application would include) has been omitted to simplify presentation of the concept
under discussion. In addition, ellipses symbols never begin or end an example. In
most contexts, including literal ellipses symbols in SQL code will produce an error.
Additional Documentation
IBM Informix Dynamic Server documentation is provided in a variety of
formats:
Introduction 17
Additional Documentation
UNIX On UNIX platforms in the default locale, the following online files
appear in the $INFORMIXDIR/release/en_us/0333 directory.
Windows The following items appear in the Informix folder. To display this
folder, choose Start➞Programs➞Informix➞ Documentation Notes
or Release Notes from the task bar.
Related Reading
For a list of publications that provide an introduction to database servers and
operating-system platforms, refer to your Getting Started Guide.
Introduction 19
Compliance with Industry Standards
This address is reserved for reporting errors and omissions in our documen-
tation. For immediate help with a technical problem, contact Customer
Services.
“How to Enter SQL 1-3 How to use the statement diagrams and descrip-
Statements” tions to enter SQL statements correctly
“How to Enter SQL 1-6 How to enter comments for SQL statements
Comments”
■ The Elements column lists the name of each variable term that
appears in the syntax diagram.
■ The Purpose column briefly describes the term, and identifies the
default value, if the term has one.
■ The Restrictions column summarizes the restrictions on the term,
such as acceptable ranges of values. (For some diagrams, restrictions
that cannot be tersely summarized appear in the Usage notes, rather
than in this column.)
■ The Syntax column points to the SQL segment that gives the detailed
syntax for the term. For a few terms, such as the names of host
variables or literal characters, no page reference is provided.
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:
These code examples are program fragments to illustrate valid syntax, rather
than complete SQL programs. In some code examples, ellipsis ( . . . ) symbols
indicate that additional code has been omitted. To save space, however,
ellipses are not shown at the beginning or end of the program fragments.
This section points to related information in this manual and other manuals
that helps you to understand the statement in question. The section provides
some or all of the following information:
■ The names of related statements that might contain a fuller
discussion of topics in this statement
■ The titles of other manuals that provide extended discussions of
topics in this statement
Tip: If you do not have extensive knowledge and experience with SQL, the
“IBM Informix Guide to SQL: Tutorial” gives you the basic SQL knowledge that you
need to understand and use the statement descriptions in this manual.
Your comments can help you or others to understand the role of the
statement within a program, SPL routine, or command file. The code
examples in this manual sometimes include comments that clarify the role of
an SQL statement within the code, but your own SQL programs will be easier
to read and to maintain if you document them with frequent comments.
The following table shows the SQL comment indicators that you can enter in
your code. Here a Y in a column signifies that you can use the symbol with
the product or with the database type identified in the column heading. An
N in a column signifies that you cannot use the symbol with the indicated
product or database type. (For additional information about a special use of
comments, see the section “Optimizer Directives” on page 4-222.)
ANSI- Databases
Comment SPL Compliant Not ANSI
Symbol ESQL/C Routine DB-Access Databases Compliant Description
IDS The section “Optimizer Directives” on page 4-222 describes a context where
information that you specify within comments can influence query plans of
the database server, and where (besides comments in these two formats),
comments in the style of the C language are also valid. ♦
ANSI If the product that you are using supports both comment symbols, your
choice of a comment symbol depends on requirements for ANSI compliance:
DB In DB-Access, you can use either comment symbol when you enter SQL state-
ments with the SQL editor and when you create SQL command files with the
SQL editor or a system editor. An SQL command file is an operating-system
file that contains one or more SQL statements. Command files are also known
as command scripts. For more information about command files, see the
discussion of command scripts in the IBM Informix Guide to SQL: Tutorial. For
information on how to create and modify command files with the SQL editor
or a system editor in DB-Access, see the IBM Informix DB-Access User’s Guide. ♦
SPL You can use either comment symbol in any line of an SPL routine. See the
discussion of how to comment and document an SPL routine in the
IBM Informix Guide to SQL: Tutorial. ♦
E/C In ESQL/C, the double hyphen ( -- ) can begin a comment that extends to the
end of the same line. For information on language-specific comment symbols
in ESQL/C programs, see the IBM Informix ESQL/C Programmer’s Manual. ♦
The following example uses 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 now enters a multiple-line comment:
SELECT * FROM customer
-- Selects all columns and rows
-- from the customer table
The next example uses the same SQL statement and the same comment as in
the preceding example, but the comment appears on a line by itself:
SELECT * FROM customer
{Selects all columns and rows}
The SQL statements of each category are listed in the pages that follow.
As their descriptions in Chapter 3 indicate, some statements (and options of
some statements, as designated with special icons in the syntax diagrams) are
specific to Dynamic Server or to Extended Parallel Server.
Optimization Statements
SET Default Table Space SET PDQPRIORITY
SET Default Table Type SET Residency
SET ENVIRONMENT SET SCHEDULE LEVEL
SET EXPLAIN SET STATEMENT CACHE
SET OPTIMIZATION UPDATE STATISTICS
Auxiliary Statements
INFO SET COLLATION
OUTPUT SET DATASKIP
GET DIAGNOSTICS WHENEVER
ANSI
ANSI Compliance and Extensions
The following lists show statements that are compliant with the ANSI SQL-92
standard at the entry level, statements that are ANSI compliant but include
Informix extensions, and statements that are Informix extensions to the ANSI
standard.
ANSI-Compliant Statements
CLOSE ROLLBACK WORK
COMMIT WORK SET SESSION AUTHORIZATION
EXECUTE IMMEDIATE SET TRANSACTION
BEGIN WORK
OUTPUT
PREPARE PUT
TRUNCATE
SQL Statements
2
In This Chapter . . . . . . . . . . . . . . . . . . . . 2-7
ALLOCATE COLLECTION . . . . . . . . . . . . . . . . 2-8
ALLOCATE DESCRIPTOR . . . . . . . . . . . . . . . . 2-10
ALLOCATE ROW . . . . . . . . . . . . . . . . . . . 2-12
ALTER ACCESS_METHOD . . . . . . . . . . . . . . . . 2-14
ALTER FRAGMENT . . . . . . . . . . . . . . . . . . 2-16
ALTER FUNCTION . . . . . . . . . . . . . . . . . . 2-39
ALTER INDEX . . . . . . . . . . . . . . . . . . . . 2-41
ALTER PROCEDURE . . . . . . . . . . . . . . . . . . 2-44
ALTER ROUTINE . . . . . . . . . . . . . . . . . . . 2-46
ALTER SEQUENCE . . . . . . . . . . . . . . . . . . 2-49
ALTER TABLE . . . . . . . . . . . . . . . . . . . . 2-52
BEGIN WORK . . . . . . . . . . . . . . . . . . . . 2-82
CLOSE . . . . . . . . . . . . . . . . . . . . . . . 2-85
CLOSE DATABASE . . . . . . . . . . . . . . . . . . 2-88
COMMIT WORK . . . . . . . . . . . . . . . . . . . 2-90
CONNECT . . . . . . . . . . . . . . . . . . . . . 2-92
CREATE ACCESS_METHOD . . . . . . . . . . . . . . . 2-102
CREATE AGGREGATE . . . . . . . . . . . . . . . . . 2-104
CREATE CAST . . . . . . . . . . . . . . . . . . . . 2-108
CREATE DATABASE . . . . . . . . . . . . . . . . . . 2-112
CREATE DISTINCT TYPE . . . . . . . . . . . . . . . . 2-115
CREATE DUPLICATE. . . . . . . . . . . . . . . . . . 2-118
CREATE EXTERNAL TABLE . . . . . . . . . . . . . . . 2-121
CREATE FUNCTION . . . . . . . . . . . . . . . . . . 2-133
CREATE FUNCTION FROM . . . . . . . . . . . . . . . 2-141
CREATE INDEX . . . . . . . . . . . . . . . . . . . . 2-144
CREATE OPAQUE TYPE . . . . . . . . . . . . . . . . . 2-169
CREATE OPCLASS . . . . . . . . . . . . . . . . . . . 2-176
CREATE PROCEDURE . . . . . . . . . . . . . . . . . 2-182
CREATE PROCEDURE FROM . . . . . . . . . . . . . . . 2-192
CREATE ROLE . . . . . . . . . . . . . . . . . . . . 2-194
CREATE ROUTINE FROM . . . . . . . . . . . . . . . . 2-196
CREATE ROW TYPE . . . . . . . . . . . . . . . . . . 2-198
CREATE SCHEMA . . . . . . . . . . . . . . . . . . . 2-203
CREATE SCRATCH TABLE . . . . . . . . . . . . . . . . 2-205
CREATE SEQUENCE . . . . . . . . . . . . . . . . . . 2-206
CREATE SYNONYM . . . . . . . . . . . . . . . . . . 2-210
CREATE TABLE . . . . . . . . . . . . . . . . . . . . 2-214
CREATE TEMP TABLE . . . . . . . . . . . . . . . . . 2-260
CREATE Temporary TABLE . . . . . . . . . . . . . . . . 2-261
CREATE TRIGGER . . . . . . . . . . . . . . . . . . . 2-269
CREATE VIEW . . . . . . . . . . . . . . . . . . . . 2-310
DATABASE . . . . . . . . . . . . . . . . . . . . . 2-316
DEALLOCATE COLLECTION . . . . . . . . . . . . . . . 2-318
DEALLOCATE DESCRIPTOR . . . . . . . . . . . . . . . 2-320
DEALLOCATE ROW . . . . . . . . . . . . . . . . . . 2-322
DECLARE . . . . . . . . . . . . . . . . . . . . . . 2-323
DELETE. . . . . . . . . . . . . . . . . . . . . . . 2-344
DESCRIBE . . . . . . . . . . . . . . . . . . . . . . 2-351
DESCRIBE INPUT . . . . . . . . . . . . . . . . . . . 2-359
DISCONNECT . . . . . . . . . . . . . . . . . . . . 2-366
DROP ACCESS_METHOD . . . . . . . . . . . . . . . . 2-369
DROP AGGREGATE . . . . . . . . . . . . . . . . . . 2-370
DROP CAST . . . . . . . . . . . . . . . . . . . . . 2-371
DROP DATABASE . . . . . . . . . . . . . . . . . . . 2-372
DROP DUPLICATE. . . . . . . . . . . . . . . . . . . 2-374
DROP FUNCTION . . . . . . . . . . . . . . . . . . . 2-375
DROP INDEX. . . . . . . . . . . . . . . . . . . . . 2-377
DROP OPCLASS. . . . . . . . . . . . . . . . . . . . 2-378
DROP PROCEDURE . . . . . . . . . . . . . . . . . . 2-379
DROP ROLE . . . . . . . . . . . . . . . . . . . . . 2-381
DROP ROUTINE . . . . . . . . . . . . . . . . . . . 2-382
For many statements, the syntax diagram, or the table of terms immediately
following the diagram, or both, can includes references to syntax segments in
Chapter 4, “Segments.”
+ ALLOCATE COLLECTION
IDS
Use the ALLOCATE COLLECTION statement to allocate memory for a variable
E/C of a collection data type (such as LIST, MULTISET, or SET) or an untyped
collection variable. Use this statement with ESQL/C.
Syntax
Usage
The ALLOCATE COLLECTION statement allocates memory for an ESQL/C
variable that can store the value of a collection data type.
Examples
The following example shows how to allocate resources with the ALLOCATE
COLLECTION statement for the untyped collection variable, a_set:
Related Information
Related examples: Refer to the collection-variable example in PUT.
+ ALLOCATE DESCRIPTOR
E/C
Use the ALLOCATE DESCRIPTOR statement to allocate memory for a system-
descriptor area. Use this statement with ESQL/C.
Syntax
items_var
Usage
The ALLOCATE DESCRIPTOR statement creates a system-descriptor area, which
is a location in memory to hold information that a DESCRIBE statement
obtains, or to hold information about the WHERE clause of a statement.
A system-descriptor area contains one or more fields called item descriptors.
Each item descriptor holds a data value that the database server can receive
or send. The item descriptors also contain information about the data, such
as data type, length, scale, precision, and nullability.
If the name that you assign to a system-descriptor area matches the name of
an existing system-descriptor area, the database server returns an error. If
you free the descriptor with the DEALLOCATE DESCRIPTOR statement, you
can reuse the descriptor.
Related Information
Related statements: DEALLOCATE DESCRIPTOR, DECLARE, DESCRIBE,
EXECUTE, FETCH, GET DESCRIPTOR, OPEN, PREPARE, PUT, and SET
DESCRIPTOR
+ ALLOCATE ROW
IDS
Use the ALLOCATE ROW statement to allocate memory for a ROW variable.
E/C Use this statement with ESQL/C.
Syntax
Usage
The ALLOCATE ROW statement allocates memory for a variable that stores
ROW-type data.
You must explicitly release memory with the DEALLOCATE ROW statement.
Once you free the ROW variable with the DEALLOCATE ROW statement, you
can reuse the ROW variable.
Tip: The ALLOCATE ROW statement allocates memory for an ESQL/C row variable
only. To allocate memory for an ESQL/C collection variable, use the ALLOCATE
COLLECTION statement.
When you use the same ROW variable in multiple calls without deallocating
it, a memory leak on the client computer results. Because there is no way to
determine if a pointer is valid when it is passed, ESQL/C assumes that it is not
valid and assigns it to a new memory location.
Example
The following example shows how to allocate resources with the ALLOCATE
ROW statement for the typed ROW variable, a_row:
Related Information
Related statements: ALLOCATE COLLECTION and DEALLOCATE ROW
+ ALTER ACCESS_METHOD
IDS
The ALTER ACCESS_METHOD statement changes the attributes of a user-
defined access method in the sysams system catalog table.
Syntax
,
ALTER ACCESS_METHOD access_method Purpose
MODIFY Option
p. 4-237
ADD
DROP purpose_keyword
Usage
Use ALTER ACCESS_METHOD to modify the definition of a user-defined
access method. You must be the owner of the access method or have DBA
privileges to alter an access method.
When you alter an access method, you change the purpose-option specifica-
tions (purpose functions, purpose methods, purpose flags, or purpose
values) that define the access method. For example, you might alter an access
method to assign a new user-defined function or method name or to provide
a multiplier for the scan cost on a table.
Example
The following statement alters the remote user-defined access method:
ALTER ACCESS_METHOD remote
ADD am_scancost = FS_scancost,
ADD am_rowids,
DROP am_getbyid,
MODIFY am_costfactor = 0.9;
The preceding example makes the following changes to the access method:
■ Adds a user-defined function or method named FS_scancost(),
which is associated in the sysams table with the am_scancost
keyword
■ Sets (adds) the am_rowids flag
■ Drops the user-defined function or method associated with the
am_getbyid keyword
■ Modifies the am_costfactor value
Related Information
Related statements: CREATE ACCESS_METHOD and DROP ACCESS_METHOD
For a discussion of privileges, see the GRANT statement or the IBM Informix
Database Design and Implementation Guide.
+
ALTER FRAGMENT
Use the ALTER FRAGMENT statement to alter the distribution strategy or
storage location of an existing table or index.
Syntax
Usage
The ALTER FRAGMENT statement applies only to table fragments or index
fragments that are located at the current site (or cluster, for Extended Parallel
Server). No remote information is accessed or updated.
You must have the Alter or the DBA privilege to change the fragmentation
strategy of a table. You must have the Index or the DBA privilege to alter the
fragmentation strategy of an index.
Warning: This statement can cause indexes to be dropped and rebuilt. Before under-
taking alter operations, check corresponding sections in your “Performance Guide”
to review effects and strategies.
Clause Purpose
ATTACH Combines tables that contain identical table structures into a single
fragmented table
Use the CREATE TABLE statement or the INIT clause of the ALTER FRAGMENT
statement to create fragmented tables.
XPS You cannot use ALTER FRAGMENT on a generalized-key (GK) index. If the
surviving_table has hash fragmentation, the only clauses available are
ATTACH and INIT. You cannot use the ALTER FRAGMENT statement on any
table that has a dependent GK index defined on it. In addition, you cannot use
this statement on a table that has range fragmentation. ♦
IDS You cannot use ALTER FRAGMENT on a typed table that is part of a table
hierarchy. ♦
When you run out of log space or disk space, try one of the following
procedures to make more space available:
■ Turn off logging and turn it back on again at the end of the operation.
This procedure indirectly requires a backup of the root dbspace.
■ Split the operations into multiple ALTER FRAGMENT statements,
moving a smaller portion of records each time.
1. Run the UPDATE STATISTICS statement on the table. This step fills the
sysfragments system catalog table with the current table
information.
2. Query the sysfragments system catalog table to examine the npused
and nrows fields. The npused field gives you the number of data
pages used in the fragment, and the nrows field gives you the
number of rows in the fragment.
ATTACH Clause
Use the ATTACH clause to combine tables that contain identical table
structures into a fragmentation strategy.
,
ATTACH 1 surviving_table
AFTER
IDS
1 AS REMAINDER
To use this clause, you must have the DBA privilege, or else be the owner of
the specified tables. The ATTACH clause supports the following tasks:
All consumed tables listed in the ATTACH clause must have the same
structure as the surviving table. The number, names, data types, and relative
position of the columns must be identical.
IDS User-defined routines and references to fields of a row-type column are not
valid. You cannot attach a fragmented table to another fragmented table. ♦
The ATTACH clause is not valid under either of the following conditions:
■ If the consumed tables contain data that belongs in some existing
fragment of the surviving table
■ If existing data in the surviving table would belong in a new
fragment
Thus, you cannot use the ATTACH clause for data movement among
fragments. To perform this task, see the “INIT Clause” on page 2-29.
IDS When you attach one or more tables to a fragmented table, a consumed_table
must be nonfragmented. ♦
XPS When you attach one or more tables to a fragmented table, a consumed_table
can be nonfragmented or have hash fragmentation.
If you know the name of the dbslice but not the names any of the dbspaces
that it is made up of, you can name the first dbspace in the dbslice by
adding.1 to the name of the dbslice. For example, if the dbslice were named
dbsl1, you could specify dbsl1.1.
IDS Each BYTE and TEXT column in every table that is named in the ATTACH
clause must have the same storage type, either blobspace or tblspace. If the
BYTE or TEXT column is stored in a blobspace, the same column in all tables
must be in the same blobspace. If the BYTE or TEXT column is stored in a
tblspace, the same column must be stored in a tblspace in all tables. ♦
XPS In Extended Parallel Server, BYTE and TEXT columns are stored in separate
fragments created for that purpose. If a table includes a BYTE or TEXT
column, the database server creates a separate, additional fragment in the
same dbspace as each regular table fragment. BYTE or TEXT columns are
stored in the separate fragment that is associated with the regular table
fragment where a given row resides.
When an ATTACH occurs, BYTE and TEXT fragments of the consumed table
become part of the surviving table and continue to be associated with the
same rows and data fragments as they were before the ATTACH. ♦
Views on the surviving table survive the ATTACH operation, but views on the
consumed table are automatically dropped.
When you attach two or more nonfragmented tables, however, the distri-
bution scheme can either be based on expression or round-robin.
IDS The following table shows the distribution schemes that can result from
different distribution schemes of the tables mentioned in the ATTACH clause.
XPS The following table shows the distribution schemes that can result from
different distribution schemes of the tables mentioned in the ATTACH clause.
When you attach a nonfragmented table to a table that has hash fragmen-
tation, the resulting table has hybrid fragmentation.
You can attach a table with a hash distribution scheme to a table that
currently has no fragmentation, hash fragmentation, or hybrid fragmen-
tation. In any of these situations, the resulting table has a hybrid distribution
scheme. ♦
The following examples illustrate the use of the ATTACH clause to create
fragmented tables with different distribution schemes.
After you execute the ATTACH clause, the database server fragments the table
pen_types round-robin into two dbspaces: the dbspace that contained
pen_types and the dbspace that contained pen_makers. Table pen_makers
is consumed, and no longer exists; all rows that were in table pen_makers are
now in table pen_types.
When you examine the sysfragments system catalog table after you alter the
fragment, you see that table cur_acct is fragmented by expression into three
dbspaces. For additional information about the sysfragments system catalog
table, see the IBM Informix Guide to SQL: Reference.
In addition to simple range rules, you can use the ATTACH clause to fragment
by expression with hash or arbitrary rules. For a discussion of all types of
expressions in an expression-based distribution scheme, see “FRAGMENT
BY Clause for Tables” on page 2-31.
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, DBCENTURY can affect
how the database server interprets the date value, so the UDR might not use the
default value that you intended. For more information, see the “IBM Informix Guide
to SQL: Reference.”
The data values for a new month are originally loaded from an external
source. The data values are distributed evenly across the name coservers on
which the sales_info table is defined, using a system-defined hash function
on the same column:
CREATE TABLE jan_97 (order_num INT, sale_date DATE, ...)
FRAGMENT BY HASH (order_num) IN sales_slice_9701
INSERT INTO jan_97 SELECT (...) FROM ...
After data values are loaded, you can attach the new table to sales_info. You
can issue the following ALTER FRAGMENT statement to attach the new table:
ALTER FRAGMENT ON TABLE sales_info ATTACH jan_97
AS sale_date >= '01/01/1997' AND sale_date < '02/01/1997'
DETACH Clause
Use the DETACH clause to detach a table fragment from a distribution scheme
and place the contents into a new nonfragmented table.
XPS In Extended Parallel Server, the new table can also be a table with hash
fragmentation. ♦
The new table that results from executing the DETACH clause does not inherit
any indexes or constraints from the original table. Only the data remains.
Similarly, the new table does not inherit any privileges from the original
table. Instead, the new table has the default privileges for any new table. For
further information on default table-level privileges, see the GRANT
statement on “Table-Level Privileges” on page 2-463.
The DETACH clause cannot be applied to a table if that table is the parent of a
referential constraint or if a rowid column is defined on the table.
XPS In Extended Parallel Server, you cannot use the DETACH clause if the table
has a dependent GK index defined on it. ♦
This example detaches dbsp2 from the distribution scheme for cur_acct and
places the rows in a new table, accounts. Table accounts now has the same
structure (column names, number of columns, data types, and so on) as table
cur_acct, but the table accounts does not contain any indexes or constraints
from the table cur_acct. Both tables are now nonfragmented. The following
example shows a table that contains three fragments:
ALTER FRAGMENT ON TABLE bus_acct DETACH dbsp3 cli_acct
This statement detaches dbsp3 from the distribution scheme for bus_acct
and places the rows in a new table, cli_acct. Table cli_acct now has the same
structure (column names, number of columns, data types, and so on) as
bus_acct, but the table cli_acct does not contain any indexes or constraints
from the table bus_acct. Table cli_acct is a nonfragmented table, and table
bus_acct remains a fragmented table.
In this example, data from January 1996 is detached from the sales_info table
and placed in a new table called jan_96.
INIT Clause
The INIT clause of ALTER FRAGMENT has the following syntax.
XPS You cannot use the INIT clause to change the fragmentation strategy of a table
that has a GK index. ♦
When you use the INIT clause to modify a table, the tabid value in the system
catalog tables changes for the affected table. The constrid of all unique and
referential constraints on the table also change.
For more information about the storage spaces in which you can store a table,
see “Using the IN Clause” on page 2-237.
Warning: When you execute the ALTER FRAGMENT statement with this clause, it
results in data movement if the table contains any data. If data moves, the potential
exists for significant logging, for the transaction being aborted as a long transaction,
and for a relatively long exclusive lock being held on the affected tables. Use this
statement when it does not interfere with day-to-day operations.
Important: The rowid column is a deprecated feature. You should use primary keys,
rather than the rowid column, as an access method.
You must use the IN dbspace clause to place the table in a dbspace explicitly.
, XPS IN dbslice
XPS ,, expr ,
HASH ( column ) IN ( dbspace , dbspace )
, dbslice
In the HYBRID clause, column identifies the column or columns on which you
want to apply the hash portion of the hybrid table fragmentation strategy.
The expression can contain only columns from the current table and only data
values from a single row. No subqueries or aggregates are allowed. In
addition, the built-in CURRENT, DATE, and TIME functions are not valid.
The following example shows the statement that originally defined the
fragmentation strategy on the table account and then shows an ALTER
FRAGMENT statement that redefines the fragmentation strategy:
IDS When you use the INIT clause to fragment an existing nonfragmented table,
all indexes on the table become fragmented in the same way as the table. ♦
XPS When you use the INIT clause to fragment an existing nonfragmented table,
indexes retain their existing fragmentation strategy. ♦
, REMAINDER IN dbspace
The expression can contain only columns from the current table and data
values from only a single row. No subqueries nor aggregates are allowed. The
built-in CURRENT, DATE, and TIME functions are not valid here.
ADD new_dbspace
The expression can contain column names only from the current table and data
values only from a single row. No subqueries or aggregates are allowed. In
addition, the built-in CURRENT, DATE, and TIME functions are not valid here.
To add another fragment to hold rows between 200 and 300, use the
following ALTER FRAGMENT statement:
ALTER FRAGMENT ON TABLE news ADD
c1 >= 200 AND c1 < 300 IN dbsp4;
Any rows that were formerly in the remainder fragment and that fit the
criteria c1 >= 200 and c1 < 300 are moved to the new dbspace.
DROP dbspace
You cannot drop one of the fragments when the table contains only two
fragments. You cannot drop a fragment in a table that is fragmented with an
expression-based distribution scheme if the fragment contains data that
cannot be moved to another fragment. If the distribution scheme contains a
REMAINDER option, or if the expressions were constructed in an overlapping
manner, you can drop a fragment that contains data.
When you want to make a fragmented table nonfragmented, use either the
INIT or DETACH clause.
When you drop a fragment from a dbspace, the underlying dbspace is not
affected. Only the fragment data values within that dbspace are affected.
When you drop a fragment, the database server attempts to move all the
records in the dropped fragment to another fragment. In this case, the desti-
nation fragment might not have enough space for the additional records.
When this happens, follow one of the procedures that are listed in “ALTER
FRAGMENT and Transaction Logging” on page 2-18 to increase your space,
and retry the procedure.
,
MODIFY mod_dbspace TO expression IN new_dbspace
1 REMAINDER
When you use the MODIFY clause to change an expression without changing
the dbspace storage for the expression, you must use the same name for the
mod_dbspace and the new_dbspace, as in the following example:
ALTER FRAGMENT ON TABLE cust_acct
MODIFY dbsp1 TO acct_num < 65 IN dbsp1
When you use the MODIFY clause to move an expression from one dbspace
to another, mod_dbspace is the name of the dbspace where the expression was
previously located, and new_dbspace is the new location for the expression:
ALTER FRAGMENT ON TABLE cust_acct
MODIFY dbsp1 TO acct_num < 35 IN dbsp2
Here the distribution scheme for the cust_acct table is modified so that all
row items in column acct_num that are less than 35 are now contained in the
dbspace dbsp2. These items were formerly contained in the dbspace dbsp1.
When you use the MODIFY clause to change the expression and to move it to
a new dbspace, you must change both the expression and the dbspace name.
If your indexes are attached indexes, and you modify the table, the index
fragmentation strategy is also modified.
Related Information
Related statements: CREATE TABLE, CREATE INDEX, and ALTER TABLE
+ ALTER FUNCTION
IDS
Use the ALTER FUNCTION statement to change the routine modifiers or
pathname of a user-defined function.
Syntax
,
ALTER FUNCTION function ( ) WITH ( ADD Routine )
Modifier
, p. 4-257
MODIFY
Usage
The ALTER FUNCTION statement allows you to modify a user-defined
function to tune its performance. With this statement you can modify charac-
teristics that control how the function executes. You can also add or replace
related used-defined routines (UDRs) that provide alternatives for the
optimizer, which can improve performance.
To use the ALTER FUNCTION statement, you must be the owner of the UDR or
have the DBA privilege.
Keyword Purpose
MODIFY EXTERNAL NAME Introduces a new location for the executable file
(for external functions only)
Related Information
Related Statements: ALTER PROCEDURE, ALTER ROUTINE, CREATE
FUNCTION, and CREATE PROCEDURE
For a discussion on how to create and use SPL routines, see the IBM Informix
Guide to SQL: Tutorial.
For a discussion on how to create and use external routines, see IBM Informix
User-Defined Routines and Data Types Developer’s Guide.
For information about how to create C UDRs, see the IBM Informix DataBlade
API Programmer’s Guide.
+
ALTER INDEX
Use the ALTER INDEX statement to change the clustering attribute or the
locking mode of an existing index.
Syntax
Usage
ALTER INDEX is valid only on indexes created explicitly with the CREATE
INDEX statement. It cannot modify indexes that were created implicitly to
support constraints, and it cannot modify an index on a temporary table.
IDS You cannot change the collating order of an existing index. If you use ALTER
INDEX to modify an index after SET COLLATION has specified a non-default
collating order, the SET COLLATION statement has no effect on the index. ♦
TO CLUSTER Option
The TO CLUSTER option causes the database server to reorder the rows of the
physical table according to the indexed order.
The next example shows how you can use the ALTER INDEX TO CLUSTER
statement to order the rows in the orders table physically. The CREATE INDEX
statement creates an index on the customer_num column of the table. Then
the ALTER INDEX statement causes the physical ordering of the rows.
CREATE INDEX ix_cust ON orders (customer_num);
ALTER INDEX ix_cust TO CLUSTER;
When you reorder, the entire file is rewritten. This process can take a long
time, and it requires sufficient disk space to maintain two copies of the table.
Over time, if you modify the table, you can expect the benefit of an earlier
cluster to disappear because rows are added in space-available order, not
sequentially. You can recluster the table to regain performance by issuing
another ALTER INDEX TO CLUSTER statement on the clustered index. You do
not need to drop a clustered index before you issue another ALTER INDEX TO
CLUSTER statement on a currently clustered index.
XPS If you are using Extended Parallel Server, you cannot use the CLUSTER
option on STANDARD tables. ♦
The first two statements create indexes for the orders table and cluster the
physical table in ascending order on the customer_num column. The last two
statements recluster the physical table in ascending order on the order_num
column.
When you use the COARSE mode, index-level locks are acquired on the index
instead of item-level or page-level locks. This mode reduces the number of
lock calls on an index.
The COARSE mode offers performance advantages when you know the index
is not going to change; for example, when read-only operations are
performed on the index.
Use the NORMAL mode to have the database server place item-level or page-
level locks on the index as necessary. Use this mode when the index gets
updated frequently.
When the database server executes the LOCK MODE COARSE option, it
acquires an exclusive lock on the table for the duration of the ALTER INDEX
statement. Any transactions currently using a lock of finer granularity must
complete before the database server switches to the COARSE lock mode.
Related Information
Related statements: CREATE INDEX and CREATE TABLE
+ ALTER PROCEDURE
IDS
Use the ALTER PROCEDURE statement to change the routine modifiers or
pathname of a previously defined external procedure.
Syntax
,
ALTER PROCEDURE procedure ( ) WITH ( ADD Routine )
Modifier
, p. 4-257
MODIFY
Usage
The ALTER PROCEDURE statement allows you to modify an external
procedure to tune its performance by modifying characteristics that control
how it executes. You can also add or replace related UDRs that provide alter-
natives for the optimizer, which can improve performance.
To use the ALTER PROCEDURE statement, you must be the owner of the UDR
or have the DBA privilege.
If the name is not unique among routines registered in the database, you
must enter one or more appropriate values for parameter_type.
Use the following keywords to introduce the items in the external procedure
that you want to modify.
Keyword Purpose
MODIFY EXTERNAL NAME Introduces a new location for the executable file,
(for external routines only) specifying a different pathname from the original
Related Information
Related Statements: ALTER FUNCTION, ALTER ROUTINE, CREATE
FUNCTION, CREATE PROCEDURE, DROP PROCEDURE, and DROP ROUTINE
For a discussion on how to create and use SPL routines, see the IBM Informix
Guide to SQL: Tutorial.
For a discussion on how to create and use external routines, see IBM Informix
User-Defined Routines and Data Types Developer’s Guide.
For information about how to create C UDRs, see the IBM Informix DataBlade
API Programmer’s Guide.
+ ALTER ROUTINE
IDS
Use the ALTER ROUTINE statement to change the routine modifiers or
pathname of a previously defined user-defined routine (UDR).
Syntax
,
ALTER ROUTINE routine ( ) WITH ( ADD Routine )
Modifier
, p. 4-257
MODIFY
Usage
The ALTER ROUTINE statement allows you to modify a previously defined
UDR to tune its performance by modifying characteristics that control how
the UDR executes. You can also add or replace related UDRs that provide
alternatives for the optimizer, which can improve performance.
This statement is useful when you do not know whether a UDR is a user-
defined function or a user-defined procedure. When you use this statement,
the database server alters the appropriate user-defined procedure or user-
defined function.
To use the ALTER ROUTINE statement, you must be the owner of the UDR or
have the DBA privilege.
Restrictions
If the name does not uniquely identify a UDR, you must enter one or more
appropriate values for parameter_type.
When you use this statement, the type of UDR cannot be ambiguous. The UDR
that you specify must refer to either a user-defined function or a user-defined
procedure. If either of the following conditions exist, the database server
returns an error:
■ The name (and parameters) that you specify applies to both a user-
defined procedure and a user-defined function.
■ The specific name that you specify applies to both a user-defined
function and a user-defined procedure.
Keyword Purpose
MODIFY EXTERNAL NAME Introduces a new location for the executable file
(for external UDRs only)
For example, both of the following statements alter the func1 UDR so that it
can be executed in parallel in the context of a parallelizable data query
statement:
ALTER ROUTINE func1 WITH (MODIFY PARALLELIZABLE)
ALTER ROUTINE func1 WITH (ADD PARALLELIZABLE)
Because the name func1 is not unique to the database, the data type param-
eters are specified so that the routine signature would be unique. If this
function had a Specific Name, for example, raise_sal, specified when it was
created, you could identify the function with the following first line:
ALTER SPECIFIC ROUTINE raise_sal
Related Information
Related Statements: ALTER FUNCTION, ALTER PROCEDURE, CREATE
FUNCTION, CREATE PROCEDURE, DROP FUNCTION, DROP PROCEDURE, and
DROP ROUTINE
For a discussion on how to create and use SPL routines, see the IBM Informix
Guide to SQL: Tutorial.
For a discussion on how to create and use external routines, see IBM Informix
User-Defined Routines and Data Types Developer’s Guide.
For information about how to create C UDRs, see the IBM Informix DataBlade
API Programmer’s Guide.
+ ALTER SEQUENCE
IDS
Use the ALTER SEQUENCE statement to modify the definition of a sequence.
Syntax
owner . 1 NOCYCLE
NOMAXVALUE 1 NOORDER
NOMINVALUE
Usage
ALTER SEQUENCE redefines an existing sequence object. It only affects subse-
quently generated values (and any unused values in the sequence cache).
You cannot use the ALTER SEQUENCE statement to rename a sequence nor to
change the owner of a sequence.
You must be the owner, or the DBA, or else have the ALTER privilege on the
sequence to modify its definition. Only elements of the sequence definition
that you specify explicitly in the ALTER SEQUENCE statement are modified.
An error occurs if you make contradictory changes, such as specifying both
MAXVALUE and NOMAXVALUE, or both the CYCLE and NOCYCLE options.
INCREMENT BY Option
Use the INCREMENT BY option to specify a new interval between successive
numbers in a sequence. The interval, or step value, can be a positive whole
number (for ascending sequences) or a negative whole number (for
descending sequences) in the INT8 range. The BY keyword is optional.
Use the NOMAXVALUE option to replace the current limit with a new default
maximum of 2e64 for ascending sequences or -1 for descending sequences.
Use the NOMINVALUE option to replace the current lower limit with a default
of 1 for ascending sequences or -(2e64) for descending sequences.
Use the NOCYCLE option to prevent the sequence from generating more
values after reaching the declared limit. Once the sequence reaches the limit,
the next reference to sequence.NEXTVAL returns an error message.
Related Information
Related statements: CREATE SEQUENCE, DROP SEQUENCE, RENAME
SEQUENCE, CREATE SYNONYM, DROP SYNONYM, GRANT, REVOKE, INSERT,
UPDATE, and SELECT
+
ALTER TABLE
Use the ALTER TABLE statement to modify the definition of a table.
Syntax
Usage
Altering a table on which a view depends might invalidate the view.
Warning: The clauses available with this statement have varying performance impli-
cations. Before you undertake alter operations, check corresponding sections in your
“Performance Guide” to review effects and strategies.
You cannot alter a temporary table. You also cannot alter a violations or
diagnostics table. In addition, you cannot add, drop, or modify a column if
the table that contains the column has a violation table or a diagnostics table
associated with it. If the USETABLENAME environment variable is set, you
cannot specify a synonym for the table in the ALTER TABLE statement.
XPS If a table has range fragmentation, only the Logging TYPE options and LOCK
MODE clause are valid. All other ALTER TABLE options return an error. ♦
If you have a static or raw table, the only information that you can alter is the
logging type of the table. That is, the Logging TYPE options are the only part
of the ALTER TABLE statement that you can use.
To use ALTER TABLE, you must meet one of the following conditions:
■ You must have DBA privilege on the database containing the table.
■ You must own the table.
■ You must have the Alter privilege on the specified table and the
Resource privilege on the database where the table resides.
■ To add a referential constraint, you must have the DBA or References
privilege on either the referenced columns or the referenced table.
■ To drop a constraint, you must have the DBA privilege or be the
owner of the constraint. If you are the owner of the constraint but not
the owner of the table, you must have Alter privilege on the specified
table. You do not need the References privilege to drop a constraint.
DROP
You can use the Basic Table Options segment to modify the schema of a table
by adding, modifying, or dropping columns and constraints, or changing the
extent size or locking granularity of a table. The database server performs
alterations in the order that you specify. If any of the actions fails, the entire
operation is cancelled.
IDS You can also associate a table with a named ROW type or specify a new
storage space to store large-object data. You can also add or drop rowid
columns and shadow columns for Enterprise Replication. You cannot,
however, specify these options in conjunction with any other alterations. ♦
Tip: Use the ADD ROWIDS clause only on fragmented tables. In nonfragmented
tables, the rowid column remains unchanged. It is recommended that you use
primary keys as an access method rather than exploiting the rowid column.
For additional information about the rowid column, refer to your Adminis-
trator’s Reference.
ADD Clause
Use the ADD clause to add a column to a table.
New Column
New Column
new_column Data
Type
p. 4-49 Single-Column
DEFAULT Constraint BEFORE column
Clause Format
p. 2-56 p. 2-57
If you do not include the BEFORE option, the database server adds the new
column or list of columns to the end of the table definition by default.
DEFAULT Clause
Use the DEFAULT clause to specify at value that the database server should
insert in a column when an explicit value for the column is not specified.
DEFAULT literal
NULL
+ USER
DATETIME Field
CURRENT Qualifier p. 4-65
TODAY
SITENAME
DBSERVERNAME
You cannot specify a default value for serial columns. If the table that you are
altering already has rows in it when you add a column that contains a default
value, the database server inserts the default value for all pre-existing rows.
The following example adds a column to the items table. In items, the new
column item_weight has a literal default value:
ALTER TABLE items
ADD item_weight DECIMAL (6, 2) DEFAULT 2.00
BEFORE total_price
In this example, each existing row in the items table has a default value of
2.00 for the item_weight column.
For more information about the options of the DEFAULT clause, refer to
“DEFAULT Clause” on page 2-217.
UNIQUE
+ +
NOT NULL
+ DISTINCT
Constraint
PRIMARY KEY Definition
Constraint p. 2-58
Definition
p. 2-58 REFERENCES
Clause
p. 2-59
CHECK Clause
p. 2-62
The following rules apply when you place primary-key or unique constraints
on existing columns:
You cannot place a unique constraint on a BYTE or TEXT column, nor can you
place referential constraints on columns of these types. A check constraint on
a BYTE or TEXT column can check only for IS NULL, IS NOT NULL, or LENGTH.
Constraint Definition
IDS In Dynamic Server, use the Constraint Definition portion of the ALTER TABLE
statement to declare the name of a constraint and to set the mode of the
constraint to disabled, enabled, or filtering. ♦
XPS In Extended Parallel Server, use the Constraint Definition portion of the
ALTER TABLE statement to declare the name of a constraint. ♦
DISABLED
FILTERING WITHOUT ERROR
WITH ERROR
REFERENCES Clause
The REFERENCES clause has the following syntax.
REFERENCES table
, +
( column ) ON DELETE CASCADE
If the referenced table is different from the referencing table, the default is the
primary-key column. If the referenced table is the same as the referencing
table, there is no default.
The following restrictions apply to the column that is specified (the referenced
column) in the REFERENCES clause:
If you specify this option, later when you delete a row in the parent table, the
database server also deletes any rows associated with that row (foreign keys)
in a child table. The advantage of the ON DELETE CASCADE option is that it
allows you to reduce the quantity of SQL statements needed to perform delete
actions.
For example, in the stores_demo database, the stock table contains the
stock_num column as a primary key. The catalog table refers to the
stock_num column as a foreign key. The following ALTER TABLE statements
drop an existing foreign-key constraint (without cascading delete) and add a
new constraint that specifies cascading deletes:
ALTER TABLE catalog DROP CONSTRAINT aa
If a table has a trigger with a DELETE trigger event, you cannot define a
cascading-delete referential constraint on that table. You receive an error
when you attempt to add a referential constraint that specifies ON DELETE
CASCADE to a table that has a delete trigger.
For information about syntax restrictions and locking implications when you
delete rows from tables that have cascading deletes, see “Considerations
When Tables Have Cascading Deletes” on page 2-346.
CHECK Clause
A check constraint designates a condition that must be met before data can be
inserted into a column.
Condition
CHECK ( p. 4-24 )
During an insert or update, if a row returns false for any check constraint
defined on a table, the database server returns an error. No error is returned,
however, if a row returns NULL for a check constraint. In some cases, you
might want to use both a check constraint and a NOT NULL constraint.
Check constraints are defined using search conditions. The search condition
cannot contain user-defined routines, subqueries, aggregates, host variables,
or rowids. In addition, the condition cannot contain the variant built-in
functions CURRENT, USER, SITENAME, DBSERVERNAME, or TODAY.
The check constraint cannot include columns in different tables. When you
are using the ADD or MODIFY clause, the check constraint cannot depend
upon values in other columns of the same table.
The next example adds a new unit_price column to the items table and
includes a check constraint to ensure that the entered value is greater than 0:
ALTER TABLE items
ADD (unit_price MONEY (6,2) CHECK (unit_price > 0) )
To create a constraint that checks values in more than one column, use the
ADD CONSTRAINT clause. The following example builds a constraint on the
column that was added in the previous example. The check constraint now
spans two columns in the table.
ALTER TABLE items ADD CONSTRAINT CHECK (unit_price < total_price)
DROP Clause
Use the DROP clause to drop one or more columns from a table.
DROP ( column )
column
You cannot issue an ALTER TABLE DROP statement that would drop every
column from the table. At least one column must remain in the table.
You cannot drop a column that is part of a fragmentation strategy.
XPS In Extended Parallel Server, you cannot use the DROP clause if the table has
a dependent GK index. ♦
Because any constraints that are associated with a column are dropped when
the column is dropped, the structure of other tables might also be altered
when you use this clause. For example, if the dropped column is a unique or
primary key that is referenced in other tables, those referential constraints
also are dropped. Therefore the structure of those other tables is also altered.
After the ALTER TABLE statement, tab2 has only one column. The col1trig
trigger is invalidated because the action clause as it is currently defined with
values for two columns cannot occur.
If you drop a column that occurs in the triggering column list of an UPDATE
trigger, the database server drops the column from the triggering column list.
If the column is the only member of the triggering column list, the database
server drops the trigger from the table. For more information on triggering
columns in an UPDATE trigger, see “CREATE TRIGGER” on page 2-269.
If a trigger is invalidated when you alter the underlying table, drop and then
re-create the trigger.
The view is not automatically dropped because ALTER TABLE can change the
order of columns in a table by dropping a column and then adding a new
column with the same name. In this case, views based on the altered table
continue to work, but retain their original sequence of columns.
If a view is invalidated when you alter the underlying table, you must rebuild
the view.
MODIFY Clause
Use the MODIFY clause to change the data type, length, or default value of a
column, or to allow or disallow NULL values in a column.
XPS In Extended Parallel Server, you cannot use the MODIFY clause if the table
has a dependent GK index. ♦
IDS You cannot change the data type of a column to a collection or a row type. ♦
When you modify a column, all attributes previously associated with that
column (that is, default value, single-column check constraint, or referential
constraint) are dropped. When you want certain attributes of the column to
remain, such as PRIMARY KEY, you must re-specify those attributes.
For example, if you are changing the data type of an existing column,
quantity, to SMALLINT, but you want to keep the default value (in this case,
1) and the NOT NULL column attribute, you can issue this statement:
When you change the data type of a column, the database server does not
perform the modification in-place. The next example (for Dynamic Server
only) changes a VARCHAR(15) column to an LVARCHAR(3072) column:
ALTER TABLE stock MODIFY (description LVARCHAR(3072))
When you modify a column that has column constraints associated with it,
the following constraints are dropped:
For example, if you modify a column that has a unique constraint, the unique
constraint is dropped. If this column was referenced by columns in other
tables, those referential constraints are also dropped. In addition, if the
column is part of a multiple-column primary-key or unique constraint, the
multiple-column constraints are not dropped, but any referential constraints
placed on the column by other tables are dropped.
IDS You can also use the MODIFY clause to change a BYTE column to a BLOB
column and a TEXT column to a CLOB column. ♦
As an alternative, you can use the INSERT statement to create a gap in the
sequence of a serial column. For more information, see “Inserting Values into
Serial Columns” on page 2-495.
Suppose you have row types parent, child1, child2, and child3.
CREATE ROW TYPE parent (a int);
CREATE ROW TYPE child1 (s serial) UNDER parent;
CREATE ROW TYPE child2 (b float, s8 serial8) UNDER child1;
CREATE ROW TYPE child3 (d int) UNDER child2;
To change the next SERIAL and SERIAL8 numbers to 75, you can enter the
following command:
ALTER TABLE child3tab MODIFY (s serial(75), s8 serial8(75))
When the ALTER TABLE statement executes, the database server updates
corresponding serial columns in the child1, child2, and child3 tables.
When you change the data type of an existing column, all data is converted
to the new data type, including numbers to characters and characters to
numbers (if the characters represent numbers). The following statement
changes the data type of the quantity column:
ALTER TABLE items MODIFY (quantity CHAR(6))
You can modify an existing column that did not permit NULLs to permit-
NULLs. To do this, specify MODIFY with the column name and the existing
data type, and omit the NOT NULL keywords. The omission of the NOT NULL
keywords drops the not-null constraint on the column. If a unique index
exists on the column, you can remove it using the DROP INDEX statement.
When you modify a column in a table, the triggers based on that table remain
unchanged, but the column modification might invalidate the trigger.
After the ALTER TABLE statement, column i4 accepts only character values.
Because character columns accept only values enclosed in quotation marks,
the action clause of the col1trig trigger is invalidated.
If a trigger is invalidated when you modify the underlying table, drop and
then re-create the trigger.
,
( )
EXTENT SIZE kilobytes
NO LOG
LOG
HIGH INTEG
When you modify the storage characteristics of a column, all attributes previ-
ously associated with the storage space for that column are dropped. When
you want certain attributes to remain, you must respecify those attributes.
For example, to retain logging, you must respecify the LOG keyword.
The format column.field is not valid here. That is, the smart large object that
you are storing cannot be one field of a ROW type.
When you modify the storage characteristics of a column that holds smart
large objects, the database server does not alter smart large objects that
already exist, but applies the new storage characteristics to only those smart
large objects that are inserted after the ALTER TABLE statement takes effect.
For example, to add a unique constraint to the fname and lname columns of
the customer table, use the following statement:
ALTER TABLE customer ADD CONSTRAINT UNIQUE (lname, fname)
When you do not specify a name for a new constraint, the database server
provides one. You can find the name of the constraint in the sysconstraints
system catalog table. For more information about the sysconstraints system
catalog table, see the IBM Informix Guide to SQL: Reference.
IDS When you add a constraint, the collating order must be the same as when the
table was created. ♦
UNIQUE ( 16 column )
+
+ DISTINCT CHECK Clause
p. 2-62
PRIMARY KEY Constraint
Definition
, p. 2-58
REFERENCES
FOREIGN KEY ( ) Clause
16 column p. 2-59
You can declare a name for the constraint and set its mode by means of
“Constraint Definition” on page 2-58.
If you own the table or have the Alter privilege on the table, you can create a
check, primary-key, or unique constraint on the table and specify yourself as
the owner of the constraint. To add a referential constraint, you must have the
References privilege on either the referenced columns or the referenced table.
When you have the DBA privilege, you can create constraints for other users.
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. The following
example specifies an extent size of 32 kilobytes:
ALTER TABLE customer MODIFY NEXT SIZE 32
When you use this clause, the size of existing extents does not change. You
cannot change the size of existing extents without unloading all of the data.
To change the size of existing extents, you must unload all the data, modify
the extent and next-extent sizes in the CREATE TABLE statement of the
database schema, re-create the database, and reload the data. For information
about how to optimize extents, see your Administrator’s Guide.
XPS TABLE
Granularity Purpose
To add a named ROW type to a table, all of the following must be true:
■ The named ROW type already exists.
■ The named ROW type fields match the column types in the table.
■ You have the Usage privilege on the table.
When you use the ADD TYPE clause, you assign a named ROW data type to a
table whose columns match the fields of the ROW type. The table cannot be a
fragmented table that has rowids.
You cannot combine the ADD TYPE clause with any clause that changes the
structure of the table. No other ADD, DROP, or MODIFY clause is valid in the
same ALTER TABLE statement that has the ADD TYPE clause. The ADD TYPE
clause does not allow you to change column data types. (To change the data
type of a column, use the MODIFY clause.)
TYPE ( STANDARD )
RAW
XPS
OPERATIONAL
STATIC
Other than the default option (STANDARD) that is used for online transaction
processing (OLTP) databases, these Logging TYPE options are used primarily
to improve performance in data warehousing databases.
Option Purpose
OPERATIONAL Logging table that uses light appends and cannot be restored
(XPS only) from archive. Use this type on tables that are refreshed
frequently. Light appends allow the quick addition of many
rows.
Warning: Use raw tables for fast loading of data. It is recommended that you alter the
logging type to STANDARD and perform a level-0 backup before you use the table in
a transaction or modify the data within the table. If you must use a raw table within
a transaction, either set the isolation level to Repeatable Read or lock the table in
exclusive mode to prevent concurrency problems.
For more information on these logging types of tables, refer to your Adminis-
trator’s Guide.
ADD CONSTRAINT
Clause
p. 2-72
DROP CONSTRAINT Clause
p. 2-75
1 DROP TYPE
MODIFY NEXT
1 SIZE Clause
p. 2-76
LOCK MODE Clause
1 p. 2-76
In Dynamic Server, the database server performs the actions in the ALTER
TABLE statement in the order that you specify. If any action fails, the entire
operation is cancelled.
If a table is part of a table hierarchy, you cannot drop its type unless it is the
last subtype in the hierarchy. That is, you can only drop a type from a table if
that table has no subtables. When you drop the type of a subtable, it is
automatically removed from the hierarchy. The table rows are deleted from
all indexes defined by its supertables.
Related Information
Related statements: CREATE TABLE, DROP TABLE, LOCK TABLE, and SET
Database Object Mode
For a discussion of database and table creation, see the IBM Informix Database
Design and Implementation Guide.
+
BEGIN WORK
Use the BEGIN WORK statement to start a transaction (a series of database
operations that the COMMIT WORK or ROLLBACK WORK statement
terminates). Use the BEGIN WORK WITHOUT REPLICATION statement to start
a transaction that does not replicate to other database servers.
Syntax
BEGIN
IDS
WORK WITHOUT REPLICATION
E/C
Usage
Each row that an UPDATE, DELETE, or INSERT statement affects during a
transaction is locked and remains locked throughout the transaction. A trans-
action that contains many such statements or that contains statements that
affect many rows can exceed the limits that your operating system or the
database server configuration imposes on the maximum number of simulta-
neous locks.
If no other user is accessing the table, you can avoid locking limits and reduce
locking overhead by locking the table with the LOCK TABLE statement after
you begin the transaction. Like other locks, this table lock is released when
the transaction terminates. The example of a transaction on “Example of
BEGIN WORK” on page 2-84 includes a LOCK TABLE statement.
Important: Issue the BEGIN WORK statement only if a transaction is not in progress.
If you issue a BEGIN WORK statement while you are in a transaction, the database
server returns an error.
E/C In ESQL/C, if you use the BEGIN WORK statement within a UDR called by a
WHENEVER statement, specify WHENEVER SQLERROR CONTINUE and
WHENEVER SQLWARNING CONTINUE before the ROLLBACK WORK
statement. These statements prevent the program from looping if the
ROLLBACK WORK statement encounters an error or a warning. ♦
BEGIN WORK;
■ DATABASE
■ COMMIT WORK
■ CREATE DATABASE
■ ROLLBACK WORK
The database server returns an error when you use a BEGIN WORK statement
after any other statement in an ANSI-compliant database.
You cannot use the DECLARE cursor CURSOR WITH HOLD with the BEGIN
WORK WITHOUT REPLICATION statement.
For more information about data replication, see the IBM Informix Dynamic
Server Enterprise Replication Guide.
Related Information
Related statements: COMMIT WORK and ROLLBACK WORK
For discussions of transactions and locking, see the IBM Informix Guide to SQL:
Tutorial.
E/C
CLOSE
Use the CLOSE statement when you no longer need to refer to the rows that
a select or function cursor retrieved, or to flush and close an insert cursor.
Syntax
CLOSE cursor_id
+ cursor_id_var
Usage
Closing a cursor makes the cursor unusable for any statements except OPEN
or FREE and releases resources that the database server had allocated to the
cursor. A CLOSE statement treats a cursor that is associated with an INSERT
statement differently than one that is associated with a SELECT or EXECUTE
FUNCTION (or EXECUTE PROCEDURE) statement.
In a database that is not ANSI-compliant, you can close a cursor that has not
been opened or that has already been closed. No action is taken in these cases.
The database server releases all resources that it might have allocated to the
active set of rows, for example, a temporary table that it used to hold an
ordered set. The database server also releases any locks that it might have
held on rows that were selected through the cursor. If a transaction contains
the CLOSE statement, the database server does not release the locks until you
execute COMMIT WORK or ROLLBACK WORK.
After you close a select or function cursor, you cannot execute a FETCH
statement that names that cursor until you have reopened it.
The SQLCODE field of the sqlca structure, sqlca.sqlcode, indicates the result
of the CLOSE statement for an insert cursor. If all buffered rows are success-
fully inserted, SQLCODE is set to zero. If an error is encountered, the
sqlca.sqlcode field in the SQLCODE is set to a negative error message number.
When SQLCODE is zero, the row buffer space is released, and the cursor is
closed; that is, you cannot execute a PUT or FLUSH statement that names the
cursor until you reopen it.
For more information on how to use a collection cursor, see “Fetching from a
Collection Cursor” on page 2-432 and “Inserting into a Collection Cursor” on
page 2-544.
For how to use insert cursors and the WITH HOLD clause, see “DECLARE”
on page 2-323.
Related Information
Related statements: DECLARE, FETCH, FLUSH, FREE, OPEN, PUT, and SET
AUTOFREE
For an introductory discussion of cursors, see the IBM Informix Guide to SQL:
Tutorial.
For a more advanced discussion of cursors, see the IBM Informix ESQL/C
Programmer’s Manual.
+
CLOSE DATABASE
Use the CLOSE DATABASE statement to close the current database.
Syntax
CLOSE DATABASE
Usage
When you issue a CLOSE DATABASE statement, you can issue only the
following SQL statements immediately after it:
■ CONNECT
■ CREATE DATABASE
■ DATABASE
■ DROP DATABASE
■ DISCONNECT
(The DISCONNECT statement is valid here only if an explicit connec-
tion existed before CLOSE DATABASE was executed.)
Issue the CLOSE DATABASE statement before you drop the current database.
The following example shows how to use the CLOSE DATABASE statement to
drop the current database:
DATABASE stores_demo
. . .
CLOSE DATABASE
DROP DATABASE stores_demo
When you issue the CLOSE DATABASE statement, any declared cursors are no
longer valid. You must re-declare any cursors that you want to use. ♦
Related Information
Related statements: CONNECT, CREATE DATABASE, DATABASE,
DISCONNECT, and DROP DATABASE
COMMIT WORK
Use the COMMIT WORK statement to commit all modifications made to the
database from the beginning of a transaction.
Syntax
COMMIT
WORK
Usage
The COMMIT WORK statement informs the database server that you reached
the end of a series of statements that must succeed as a single unit. The
database server takes the required steps to make sure that all modifications
that the transaction makes are completed correctly and saved to disk.
The COMMIT WORK statement releases all row and table locks.
BEGIN WORK;
DELETE FROM call_type WHERE call_code = 'O';
INSERT INTO call_type VALUES ('S', 'order status');
COMMIT WORK;
In this example, the user first deletes the row from the call_type table where
the value of the call_code column is O. The user then inserts a new row in the
call_type table where the value of the call_code column is S. The database
server guarantees that both operations succeed or else neither succeeds.
E/C In ESQL/C, the COMMIT WORK statement closes all open cursors except those
that were declared using the WITH HOLD option. ♦
You must, however, issue an explicit COMMIT WORK statement to mark the
end of each transaction. If you fail to do so, the database server rolls back any
modifications that the transaction made to the database.
Related Information
Related statements: BEGIN WORK, ROLLBACK WORK, and DECLARE
For a discussion of concepts related to transactions, see the IBM Informix Guide
to SQL: Tutorial.
+
CONNECT
Use the CONNECT statement to connect to a database environment.
Syntax
Database
CONNECT TO Environment
p. 2-97
E/C E/C
' connection ' USER
Clause
AS connection_var p. 2-99 E/C
DEFAULT
Usage
The CONNECT statement connects an application to a database environment,
which can be a database, a database server, or a database and a database
server. If the application successfully connects to the specified database
environment, the connection becomes the current connection for the appli-
cation. SQL statements fail if the application has no current connection to a
database server. If you specify a database name, the database server opens
that database. You cannot include CONNECT within a PREPARE statement.
Only one connection is current at any time; other connections are dormant.
The application cannot interact with a database through a dormant
connection. When an application establishes a new connection, that
connection becomes current, and the previous current connection becomes
dormant. You can make a dormant connection current with the SET
CONNECTION statement. See also “SET CONNECTION” on page 2-646.
For information on how to use the USER clause to specify an alternate user
name when the CONNECT statement connects to a database server on a
remote host, see “USER Clause” on page 2-99.
Connection Identifiers
The optional connection name is a unique identifier that an application can
use to refer to a connection in subsequent SET CONNECTION and
DISCONNECT statements. If the application does not provide a connection
name (or a connection-host variable), it can refer to the connection using the
database environment. If the application makes more than one connection to
the same database environment, however, each connection must have a
unique connection name.
After you associate a connection name with a connection, you can refer to the
connection using only that connection name.
Connection Context
Each connection encompasses a set of information that is called the connection
context. The connection context includes the name of the current user, the
information that the database environment associates with this name, and
information on the state of the connection (such as whether an active trans-
action is associated with the connection). The connection context is saved
when an application becomes dormant, and this context is restored when the
application becomes current again. (For more information, see “Making a
Dormant Connection the Current Connection” on page 2-646.)
DEFAULT Option
Use the DEFAULT option to request a connection to a default database server,
called a default connection. The default database server can be either local or
remote. To designate the default database server, set its name in the
environment variable INFORMIXSERVER. This form of the CONNECT
statement does not open a database.
If you select the DEFAULT option for the CONNECT statement, you must use
the DATABASE statement or the CREATE DATABASE statement to open or
create a database in the default database environment.
In this case, the application must commit or roll back the active transaction in
the current connection before it switches to a different connection.
main()
{
EXEC SQL connect to 'a@srv1' as 'A';
EXEC SQL connect to 'b@srv2' as 'B' with concurrent transaction;
EXEC SQL connect to 'c@srv3' as 'C' with concurrent transaction;
/*
Execute SQL statements in connection 'C' , starting a
transaction
*/
/*
Execute SQL statements starting a transaction in 'B'.
Now there are two active transactions, one each in 'B'
and 'C'.
*/
/*
Execute SQL statements starting a transaction in 'A'.
Now there are three active transactions, one each in 'A',
'B' and 'C'.
*/
/*
SET CONNECTION 'C' fails (current connection is still 'A')
The transaction in 'A' must be committed/rolled back since
connection 'A' was started without the CONCURRENT TRANSACTION
clause.
*/
/*
Now, there are two active transactions, in 'B' and in 'C',
which must be committed/rolled back separately
*/
Database Environment
'dbname'
'@dbservername'
'dbname@dbservername'
E/C db_var
Restrictions on dbservername
If you specify dbservername, it must satisfy the following restrictions.
■ If the database server that you specify is not online, you receive an
error.
UNIX ■ On UNIX, the database server that you specify in dbservername must
match the name of a database server in the sqlhosts file. ♦
Windows ■ On Windows, dbservername must match the name of a database
server in the sqlhosts subkey in the registry. It is recommended that
you use the setnet32 utility to update the registry. ♦
If you specify only dbname, its database server is read from the DBPATH
environment variable. The database server in the INFORMIXSERVER
environment variable is always added before the DBPATH value.
The next example shows the resulting DBPATH that your application uses:
//srvA://srvB://srvC
USER Clause
The USER clause specifies information that is used to determine whether the
application can access the target computer on a remote host.
user_id_var
The USER clause is required when the CONNECT statement connects to the
database server on a remote host. Subsequent to the CONNECT statement, all
database operations on the remote host use the specified user name.
Windows On Windows, the login name that you specify in user_id must be a valid login
name and must exist in User Manager. If the application connects to a remote
server, the login name must exist in the domain of both the client and the
server. ♦
■ The specified user lacks the privileges to access the database named
in the database environment.
■ The specified user does not have the required permissions to connect
to the remote host.
■ You supply a USER clause but do not include the USING
validation_var phrase.
E/C In compliance with the X/Open specification for the CONNECT statement, the
ESQL/C preprocessor allows a CONNECT statement that has a USER clause
X/O without the USING validation_var specification. If the validation_var is not
present, however, the database server rejects the connection at runtime. ♦
Related Information
Related Statements: DISCONNECT, SET CONNECTION, DATABASE, and
CREATE DATABASE
+ CREATE ACCESS_METHOD
IDS
Use the CREATE ACCESS_METHOD statement to register a new access method
in the sysams system catalog table.
Syntax
,
Usage
The CREATE ACCESS_METHOD statement adds a user-defined access method
to a database.
The am_getnext keyword is required in the Purpose Options list. You must
use this to specify a UDR (or the name of a method) to scan for the next item
that satisfies a query. For information on how to set purpose options, refer to
“Purpose Options” on page 4-237.
You must have the DBA or Resource privilege to create an access method.
Related Information
Related statements: ALTER ACCESS_METHOD and DROP ACCESS_METHOD
+ CREATE AGGREGATE
IDS
Use the CREATE AGGREGATE statement to create a new aggregate function
and register it in the sysaggregates system catalog table. User-defined aggre-
gates extend the functionality of the database server by performing
aggregate computations that the user implements.
Syntax
,
Modifiers
INIT = init_func
ITER = iter_func
HANDLESNULLS
Usage
You can specify the INIT, ITER, COMBINE, FINAL, and HANDLESNULLS
modifiers in any order.
Important: You must specify the ITER and COMBINE modifiers in a CREATE
AGGREGATE statement. You do not have to specify the INIT, FINAL, and
HANDLESNULLS modifiers in a CREATE AGGREGATE statement.
The ITER, COMBINE, FINAL, and INIT modifiers specify the support functions
for a user-defined aggregate. These support functions do not have to exist at
the time you create the user-defined aggregate.
Before you use the average aggregate in a query, you must also use CREATE
FUNCTION statements to create the support functions specified in the
CREATE AGGREGATE statement.
The following table gives an example of the task that each support function
might perform for average.
ITER average_iter For each row, adds the value of the expression to
the current sum and increments the current row
count by one
COMBINE average_combine Adds the current sum and the current row count
of one partial result to the other and returns the
updated result
FINAL average_final Returns the ratio of the current sum to the current
row count and converts this ratio to the result type
Parallel Execution
The database server can break up an aggregate computation into several
pieces and compute them in parallel. The database server uses the INIT and
ITER support functions to compute each piece sequentially. Then the
database server uses the COMBINE function to combine the partial results
from all the pieces into a single result value. Whether an aggregate is parallel
is an optimization decision that is transparent to the user.
Related Information
Related statements: CREATE FUNCTION and DROP AGGREGATE
For a description of the sysaggregates system catalog table that stores data
about user-defined aggregates, see the IBM Informix Guide to SQL: Reference.
+ CREATE CAST
IDS
Use the CREATE CAST statement to register a cast that converts data from one
data type to another.
Syntax
Usage
A cast is a mechanism that the database server uses to convert one data type
to another. The database server uses casts to perform the following tasks:
To create a cast, you must have the necessary privileges on both the source
data type and the target data type. All users have permission to use the built-in
data types. To create a cast to or from an OPAQUE, DISTINCT, or named ROW
data type, however, requires the Usage privilege on that data type.
The CREATE CAST statement registers a cast in the syscasts system catalog
table. For more information on syscasts, see the chapter on system catalog
tables in the IBM Informix Guide to SQL: Reference.
Explicit Casts
An explicit cast is a cast that you must specifically invoke, with either the
CAST AS keywords or with the cast operator ( :: ). The database server does
not automatically invoke an explicit cast to resolve data type conversions.
The EXPLICIT keyword is optional; by default, the CREATE CAST statement
creates an explicit cast.
The following CREATE CAST statement defines an explicit cast from the
rate_of_return opaque data type to the percent distinct data type:
CREATE EXPLICIT CAST (rate_of_return AS percent
WITH rate_to_prcnt)
The following SELECT statement explicitly invokes this explicit cast in its
WHERE clause to compare the bond_rate column (of type rate_of_return) to
the initial_APR column (of type percent):
SELECT bond_rate FROM bond
WHERE bond_rate::percent > initial_APR
Implicit Casts
The database server invokes built-in casts to convert from one built-in data
type to another built-in type that is not directly substitutable. For example,
the database server performs conversion of a character type such as CHAR to
a numeric type such as INTEGER through a built-in cast.
An implicit cast is a cast that the database server can invoke automatically
when it encounters data types that cannot be compared with built-in casts.
This type of cast enables the database server to automatically handle conver-
sions between other data types.
To define an implicit cast, specify the IMPLICIT keyword in the CREATE CAST
statement. For example, the following CREATE CAST statement specifies that
the database server should automatically use the prcnt_to_char( ) function to
convert from the CHAR data type to a distinct data type, percent:
CREATE IMPLICIT CAST (CHAR AS percent WITH char_to_prcnt)
This cast only supports automatic conversion from the CHAR data type to
percent. For the database server to convert from percent to CHAR, you also
need to define another implicit cast, as follows:
CREATE IMPLICIT CAST (percent AS CHAR WITH prcnt_to_char)
Users can also invoke implicit casts explicitly. For more information on how
to explicitly invoke a cast function, see “Explicit Casts” on page 2-109.
When a built-in cast does not exist for conversion between data types, you
can create user-defined casts to make the necessary conversion.
WITH Clause
The WITH clause of the CREATE CAST statement specifies the name of the
user-defined function to invoke to perform the cast. This function is called
the cast function. You must specify a function name unless the source data type
and the target data type have identical representations. Two data types have
identical representations when the following conditions are met:
The cast function must be registered in the same database as the cast at the
time the cast is invoked, but need not exist when the cast is created. The
CREATE CAST statement does not check permissions on the specified function
name, or even verify that the cast function exists. Each time a user invokes the
cast explicitly or implicitly, the database server verifies that the user has the
Execute privilege on the cast function.
Related Information
Related statements: CREATE FUNCTION, CREATE DISTINCT TYPE, CREATE
OPAQUE TYPE, CREATE ROW TYPE, and DROP CAST
For more information about data types, casting, and conversion, see the Data
Types segment in this manual and the IBM Informix Guide to SQL: Reference.
For examples that show how to create and use casts, see the IBM Informix
Database Design and Implementation Guide.
+
CREATE DATABASE
Use the CREATE DATABASE statement to create a new database.
Syntax
BUFFERED
LOG MODE ANSI
Usage
This statement is an extension to ANSI-standard syntax. (The ANSI/ISO
standard for the SQL language does not specify any syntax for construction
of a database, the process by which a database comes into existence.)
The database that CREATE DATABASE specifies becomes the current database.
The database name that you use must be unique within the database server
environment in which you are working. The database server creates the
system catalog tables that describe the structure of the database.
When you create a database, you alone can access it. It remains inaccessible
to other users until you, as DBA, grant database privileges. For information
on how to grant database privileges, see “GRANT” on page 2-459.
If you do not specify the dbspace, the database server creates the system
catalog tables in the root dbspace. The following statement creates the
vehicles database in the root dbspace:
CREATE DATABASE vehicles
XPS In Extended Parallel Server you can create a database in the dbspace of the
primary coserver (coserver 1) only. ♦
Logging Options
The logging options of the CREATE DATABASE statement determine the type
of logging that is done for the database.
In the event of a failure, the database server uses the log to re-create all
committed transactions in your database.
If you do not specify the WITH LOG option, you cannot use transactions or
the statements that are associated with databases that have logging (BEGIN
WORK, COMMIT WORK, ROLLBACK WORK, SET IMPLICIT TRANSACTION,
SET LOG, and SET ISOLATION).
XPS If you are using Extended Parallel Server, the CREATE DATABASE statement
always creates a database with logging. If you do not specify the WITH LOG
option, the unbuffered log type is used by default. ♦
If you use a buffered log, you marginally enhance the performance of logging
at the risk of not being able to re-create the last few transactions after a failure.
(See the discussion of buffered logging in the IBM Informix Database Design and
Implementation Guide.)
ANSI-compliant databases are different from databases that are not ANSI
compliant in several ways, including the following features:
■ All statements are automatically contained in transactions.
■ All databases use unbuffered logging.
■ Owner-naming is enforced.
You must use the owner name when you refer to each table, view,
synonym, index, or constraint, unless you are the owner.
■ For databases, the default isolation level is REPEATABLE READ.
■ Default privileges on objects differ from those in databases that are
not ANSI compliant. Users do not receive PUBLIC privilege to tables
and synonyms by default.
Other slight differences exist between databases that are ANSI compliant and
those that are not. These differences are noted with the related SQL statement
in this manual. For a detailed discussion of the differences between ANSI
compliant databases and databases that are not ANSI-compliant, see the
IBM Informix Database Design and Implementation Guide.
Related Information
Related statements: CLOSE DATABASE, CONNECT, DATABASE, and DROP
DATABASE
Syntax
Usage
A distinct type is a data type based on a built-in data type or on an existing
opaque data type, a named-row data type, or another distinct data type.
Distinct data types are strongly typed. Although the distinct type has the
same physical representation as data of its source type, values of the two
types cannot be compared without an explicit cast from one type to the other
To create a distinct type in a database, you must have the Resource privilege.
Any user with the Resource privilege can create a distinct type from one of
the built-in data types, which user informix owns.
Important: You cannot create a distinct type on the SERIAL or SERIAL8 data type.
To create a distinct type from an opaque type, a named-ROW type, or another
distinct type, you must be the owner of the data type or have the Usage
privilege on the data type.
Once a distinct type is defined, only the type owner and the DBA can use it.
The owner of the type can grant other users the Usage privilege on the type.
A distinct type has the same storage structure as its source type. The
following statement creates the distinct type birthday, based on the built-in
DATE data type:
Although Dynamic Server uses the same storage format for the distinct type
as it does for its source type, a distinct type and its source type cannot be
compared in an operation unless one type is explicitly cast to the other type.
To find out what privileges exist on a particular type, check the sysxtdtypes
system catalog table for the owner name and the sysxtdtypeauth system
catalog table for additional data type privileges that might have been
granted. For more information on system catalog tables, see the IBM Informix
Guide to SQL: Reference.
Because the two data types have the same representation (the same length
and alignment), no support functions are required to implement the casts.
You can create an implicit cast between a distinct type and its source type. To
create an implicit cast, use the Table Options clause to specify the format of
the external data. You must first drop the default explicit cast, however,
between the distinct type and its source type.
All support functions and casts that are defined on the source type can be
used on the distinct type. Casts and support functions that are defined on the
distinct type, however, Use the Table Options clause to specify the format of
the external data.are not available to the source type.
For example, suppose you create a distinct type, dist_type, that is based on
the NUMERIC data type. You then create a table with two columns, one of
type dist_type and one of type NUMERIC.
CREATE DISTINCT TYPE dist_type AS NUMERIC;
CREATE TABLE t(col1 dist_type, col2 NUMERIC);
To directly compare the distinct type and its source type or assign a value of
the source type to a column of the distinct type, you must cast one type to the
other, as the following examples show:
INSERT INTO tab (col1) VALUES (3.5::dist_type);
Related Information
Related statements: CREATE CAST, CREATE FUNCTION, CREATE OPAQUE
TYPE, CREATE ROW TYPE, DROP TYPE, and DROP ROW TYPE
For information and examples that show how to use and cast distinct types,
see the IBM Informix Guide to SQL: Tutorial.
For more information on when you might create a distinct type, see
IBM Informix User-Defined Routines and Data Types Developer’s Guide.
+ CREATE DUPLICATE
XPS
Use the CREATE DUPLICATE statement to create a duplicate copy of an
existing table for read-only use in a specified dbslice or in specified dbspaces
across coservers.
Syntax
,
Usage
If the original table resides entirely on a single coserver, you can create
duplicate copies of small tables across coservers for read-only use. For each
attached index of the original table, a similarly defined index is built on each
table duplicate, using the same dbspaces as the table.
Because query operators read the local copy of the table, duplicating small
tables across coservers might improve the performance of some queries.
If a local copy of a duplicated table exists but is not available because the
dbspace that stores it is offline (or for some similar reason), a query that
requires access to the table fails. The database server does not attempt to
access the original table.
■ If the original table is not fragmented, the dbspace list need provide
only a single dbspace on each coserver.
For example, if the table tab1 is not fragmented, enter the following
statement to create a duplicate on the remaining three of the four
coservers if the original table is stored in the dbspace db1 on coserver
1 and db2 is on coserver 2, db3 is on coserver 3, and db4 is on
coserver 4.
CREATE DUPLICATE OF TABLE tab1 IN (db2, db3, db4)
■ If the original table is fragmented with one fragment in the first
dbspace of several dbslices that contain dbspaces on all coservers,
you can create duplicate copies of the table in the remaining
dbspaces of the dbslice.
For example, you might create the tab3 table in the first dbspace of
three dbslices, each of which contains a dbspace on each coserver, as
follows:
CREATE TABLE tab3 (...)
FRAGMENT BY HASH (....) IN dbsl1.l, dbsl2.1, dbsl3.1
To duplicate the tab3 table across the remaining coservers, use the
following statement:
CREATE DUPLICATE OF TABLE tab3 IN dbsl1, dbsl2, dbsl3
■ You can mix dbslice names and dbspace lists in the same CREATE
DUPLICATE statement. For example, instead of using dbspaces in a
dbslice, for the previous example you might enter the following
statement in which dbsp2a is on coserver 2, dbsp3a is on coserver 3,
and dbsp4a is on coserver 4:
CREATE DUPLICATE OF TABLE tab3 IN
dbsl1, dbsl2, (dbsp2a, dbsp3a, dbsp4a)
The first fragment of the original table is duplicated into dbsl1, which
contains a dbspace on each coserver, the second fragment into dbsl2, which
also contains a dbspace on each coserver, and the third fragment into the list
of dbspaces.
Only one fragment of a duplicated table can reside in any single dbspace. You
cannot list an existing dbspace of the duplicated table in the list of dbspaces
into which it is duplicated, but it is not an error for an existing dbspace to be
a member of a dbslice that specifies duplication dbspaces. Matching
dbspaces in the dbslice are ignored.
Supported Operations
The following operations are permitted on duplicated tables:
■ SELECT
■ UPDATE STATISTICS
■ LOCK and UNLOCK
■ SET RESIDENCY
■ DROP TABLE
You cannot duplicate a table in certain circumstances. The table must not:
Related Statement
DROP DUPLICATE
Syntax
Column DATAFILES
CREATE EXTERNAL TABLE table Definition USING ( Clause )
p. 2-122 p.2-126
Table Table
Options , , Options
p. 2-128 p. 2-128
Usage
The left-hand portion of the syntax diagram declares the name of the table
and defines its columns and any column-level constraints.
The portion that follows the USING keyword specifies external files that the
database server opens when you use the external table, and additional
options for characteristics of the external table.
After executing the CREATE EXTERNAL TABLE statement, you can move data
to and from the external source with an INSERT INTO ... SELECT statement. See
the section “INTO EXTERNAL Clause” on page 2-635 for more information
about loading the results of a query into an external table.
Column Definition
SAMEAS template
,
Data Type
column p. 4-49
You must specify an external type for every column that is in fixed format.
You cannot specify an external type for delimited format columns except for
BYTE and TEXT columns where your specification is optional. For more infor-
mation, see “TEXT and HEX External Types” on page 2-124.
Big-Endian Format
The following examples are of column definitions with NULL values for a
FIXED-format external table:
If the packed decimal or zoned decimal is stored with all bits cleared to
represent a NULL value, the null_string can be defined as 0x0. The following
rules apply to the value assigned to a null_string:
■ The NULL representation must fit into the length of the external field.
■ If a bit pattern is defined, the null_string is not case sensitive.
■ If a bit pattern is defined, the null_string must begin with 0x.
■ For numeric fields, the left-most fields are assigned zeros by the
database server if the bit pattern does not fill the entire field.
■ If the NULL representation is not a bit pattern, the NULL value must
be a valid number for that field.
Warning: If a row that contains a NULL value is unloaded into an external table and
the column that receives the NULL value has no NULL value defined, the database
server inserts a zero into the column.
You do not need to specify these external types. If you do not define an
external column specifically, Informix TEXT columns default to TEXT and
Informix BYTE columns default to HEX.
The database server interprets two adjacent field delimiters as a NULL value.
For more information on BYTE and TEXT data, see your Administrator’s Guide.
Column-Level Constraints
Use column-level constraints to limit the type of data that is allowed in a
column. Constraints at the column level are limited to a single column.
( Condition )
NOT NULL CHECK p. 4-24
When no reject file exists and no value is encountered, the database server
returns an error and the loading stops. When a reject file exists and no value
is encountered, the error is reported in the reject file and the load continues.
Check constraints are defined with search conditions. The search condition
cannot contain subqueries, aggregates, host variables, or SPL routines. In
addition, it cannot include the built-in functions CURRENT, USER, SITENAME,
DBSERVERNAME, or TODAY. When you define 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.
DATAFILES Clause
The DATAFILES clause specifies external files that are opened when you use
external tables.
You can use cogroup names and coserver numbers when you describe the
input or output files for the external table definition. You can identify the
DATAFILES either by coserver number or by cogroup name. A coserver
number contains only digits. A cogroup name is a valid identifier that begins
with a letter but otherwise contains any combination of letters, digits, and
underscore symbols.
If you use only some of the available coservers for reading or writing files,
you can designate these coservers as a cogroup using onutil and then use the
cogroup name, rather than explicitly specifying each coserver and file
separately. Whenever you use all coservers to manage external files, you can
use the predefined coserver_group.
%c Replaced with the number of the coserver that manages the file
%n Replaced with the name of the node on which the coserver that
manages the file resides
Important: The formatted pathname option does not support the %o formatting
string.
Table Options
These options specify additional characteristics that define the table.
Use the table options keywords as the following table describes. You can use
each keyword whenever you plan to load or unload data unless only one of
the two modes is specified.
Keyword Purpose
DELIMITER Specifies the character that separates fields in a delimited text file
DELUXE Sets a flag causing the database server to load data in deluxe mode
(load only) Deluxe mode is required for loading into STANDARD tables.
EXPRESS Sets a flag that causes the database server to attempt to load data
in express mode. If you request express mode but indexes or
unique constraints exist on the table or the table contains BYTE or
TEXT data, or the target table is not RAW or OPERATIONAL, the
load stops with an error message that reports the problem.
MAXERRORS Sets the number of errors that are allowed per coserver before the
database server stops the load
RECORDEND Specifies the character that separates records in a delimited text file
REJECTFILE Sets the full pathname where all coservers write data-conversion
errors. If not specified or if files cannot be opened, any error ends
the load job abnormally. See also “Reject Files” on page 2-130.
SIZE The approximate number of rows in the external table. This can
improve performance when external table is used in a join query.
Reject Files
Rows that have conversion errors during a load or rows that violate check
constraints on the external table are written to a reject file on the coserver that
performs the conversion. Each coserver manages its own reject file. The
REJECTFILE clause declares the name of the reject file on each coserver.
You can use the formatting characters %c and %n (but not %r) in the filename
format. Use the %c formatting characters to make the filenames unique. For
more information on how to format characters, see the section “Using
Formatting Characters” on page 2-127.
If you perform another load to the same table during the same session, any
earlier reject file of the same name is overwritten.
Element Purpose
record Record number in the input file where the error was detected
field-name External field name where the first error in the line occurred, or
'<none>' if the rejection is not specific to a particular column
The reject file writes the coserver-number, filename, record, field-name, and
reason-code in ASCII. The bad-line information varies with the type of input file.
Examples
The examples in this section show how to specify the DATAFILES field.
Assume that the database server is running on four nodes, and one file is to
be read from each node. All files have the same name. The DATAFILES speci-
fication can then be as follows:
DATAFILES ("DISK:cogroup_all:/work2/unload.dir/mytbl")
Now, consider a system with 16 coservers where only three coservers have
tape drives attached (for example, coservers 2, 5, and 9). If you define a
cogroup for these coservers before you run load and unload commands, you
can use the cogroup name rather than a list of individual coservers when you
execute the commands. To set up the cogroup, run onutil.
% onutil
1> create cogroup tape_group
2> from coserver.2, coserver.5, coserver.9;
Cogroup successfully created.
If, instead, you want to process three files on each of two coservers, define the
files as follows:
DATAFILES ("DISK:1:/work2/extern.dir/mytbl.%r(1..3)",
"DISK:2:/work2/extern.dir/mytbl.%r(4..6)")
Related Information
Related statements: INSERT and SET PLOAD FILE
+ CREATE FUNCTION
IDS
Use the CREATE FUNCTION statement to create a user-defined function,
register an external function, or to write and register an SPL function.
Syntax
,
Specific Name WITH ( Routine Modifier
SPECIFIC p. 4-274 )
p. 4-257
Statement Block
; SPL p. 4-276 END FUNCTION
Tip: If you are trying to create a function from text of source code that is in a separate
file, use the CREATE FUNCTION FROM statement.
Usage
The database server supports user-defined functions written in the following
languages:
For information on how this manual uses the terms UDR, function, and
procedure as well as recommended usage, see “Relationship Between
Routines, Functions, and Procedures” on page 2-183 and “Using CREATE
PROCEDURE Versus CREATE FUNCTION” on page 2-183, respectively.
E/C You can use a CREATE FUNCTION statement only within a PREPARE
statement. If you want to create a user-defined function for which the text is
known at compile time, you must put the text in a file and specify this file
with the CREATE FUNCTION FROM statement. ♦
IDS Functions use the collating order that was in effect when they were created.
See SET COLLATION for information about using non-default collation ♦
Ext Before you can create an external function, you must also have the Usage
privilege on the language in which you will write the function. For more
information, see “GRANT” on page 2-459. ♦
SPL By default, the Usage privilege on SPL is granted to PUBLIC. You must also
have at least the Resource privilege on a database to create an SPL function
within that database. ♦
If you omit the DBA keyword, the UDR is known as an owner-privileged UDR.
Ext If an external function has a negator function, you must grant the Execute
privilege on both the external function and its negator function before users
can execute the external function. ♦
Naming a Function
Because Dynamic Server offers routine overloading, you can define more than
one function with the same name, but different parameter lists. You might
want to overload functions in the following situations:
For a brief description of the routine signature that uniquely identifies each
user-defined function, see “Routine Overloading and Naming UDRs with a
Routine Signature” on page 4-48.
DOCUMENT Clause
The quoted string in the DOCUMENT clause provides a synopsis and
description of the UDR. The string is stored in the sysprocbody system
catalog table and is intended for the user of the UDR. Anyone with access to
the database can query the sysprocbody system catalog table to obtain a
description of one or all of the UDRs stored in the database.
For example, the following query obtains a description of the SPL function
update_by_pct, that “SPL Functions” on page 2-137 shows:
SELECT data FROM sysprocbody b, sysprocedures p
WHERE b.procid = p.procid
--join between the two catalog tables
AND p.procname = 'update_by_pct'
-- look for procedure named update_by_pct
AND b.datakey = 'D'-- want user document;
A UDR or application program can query the system catalog tables to fetch
the DOCUMENT clause and display it for a user.
Ext You can use a DOCUMENT clause at the end of the CREATE FUNCTION
statement, whether or not you use the END FUNCTION keywords. ♦
If you do not use the WITH LISTING IN clause, the compiler does not generate
a list of warnings.
UNIX If you specify a filename but not a directory, this listing file is created in your
home directory on the computer where the database resides. If you do not
have a home directory on this computer, the file is created in the root
directory (the directory named “/”). ♦
Windows If you specify a filename but not a directory, this listing file is created in your
current working directory if the database is on the local computer. Otherwise,
the default directory is %INFORMIXDIR%\bin. ♦
SPL functions are parsed, optimized (as far as possible), and stored in the
system catalog tables in executable format. The body of an SPL function is
stored in the sysprocbody system catalog table. Other information about the
function is stored in other system catalog tables, including sysprocedures,
sysprocplan, and sysprocauth. For more information about these system
catalog tables, see the IBM Informix Guide to SQL: Reference.
The END FUNCTION keywords are required in every SPL function, and a
semicolon ( ; ) must follow the clause that immediately precedes the
statement block. The following code example creates an SPL function:
CREATE FUNCTION update_by_pct ( pct INT, pid CHAR(10))
RETURNING INT;
DEFINE n INT;
UPDATE inventory SET price = price + price * (pct/100)
WHERE part_id = pid;
LET n = price;
RETURN price;
END FUNCTION
DOCUMENT "USAGE: Update a price by a percentage",
"Enter an integer percentage from 1 - 100",
"and a part id number"
WITH LISTING IN '/tmp/warn_file'
For more information on how to write SPL functions, see the chapter about
SPL routines in IBM Informix Guide to SQL: Tutorial.
You can include valid SQL or SPL language statements in SPL functions. See,
however, the following sections in Chapter 4 that describe restrictions on SQL
and SPL statements within SPL routines: “Subset of SPL Statements Valid in
the Statement Block” on page 4-276; “SQL Statements Not Valid in an SPL
Statement Block” on page 4-277; and “Restrictions on SPL Routines in Data-
Manipulation Statements” on page 4-279.
1. Write a Java static method, which can use the JDBC functions to
interact with the database server.
2. Compile the Java source file and create a .jar file (the shared-object
file for Java).
3. Execute the install_jar( ) procedure with the EXECUTE PROCEDURE
statement to install the jar file in the current database.
4. If the UDR uses user-defined types, create a map between SQL data
types and Java classes.
Use the setUDTExtName( ) procedure that is explained in
“EXECUTE PROCEDURE” on page 2-414.
5. Register the UDR with the CREATE FUNCTION statement.
Rather than storing the body of an external routine directly in the database,
the database server stores only the pathname of the shared-object file that
contains the compiled version of the routine. When it executes the external
routine, the database server invokes the external object code.
This function returns a single INTEGER value. The EXTERNAL NAME clause
specifies that the Java implementation of the sql_explosive_reaction( )
function is a method called explosiveReaction( ), which resides in the
Chemistry Java class that resides in the course_jar jar file.
For example, assume that user mike creates this user-defined function:
CREATE FUNCTION func1 () RETURNING INT;
CREATE TABLE tab1 (colx INT);
RETURN 1;
END FUNCTION
If user joan now executes function func1, user mike, not user joan, is the
owner of the newly created table tab1.
In the case of a DBA-privileged UDR, however, the user who executes a UDR
(rather than the UDR owner) owns any database objects created by the UDR,
unless another owner is specified for the database object within the UDR.
For example, assume that user mike creates this user-defined function:
CREATE DBA FUNCTION func2 () RETURNING INT;
CREATE TABLE tab2 (coly INT);
RETURN 1;
END FUNCTION
If user joan now executes function func2, user joan, not user mike, is the
owner of the newly created table tab2.
See also the section “Support for Roles and User Identity” on page 4-280.
Related Information
Related statements: ALTER FUNCTION, ALTER ROUTINE, CREATE
PROCEDURE, CREATE FUNCTION FROM, DROP FUNCTION, DROP ROUTINE,
GRANT, EXECUTE FUNCTION, PREPARE, REVOKE, and UPDATE STATISTICS
Chapter 3 of this manual describes the syntax of the SPL language. For a
discussion on how to create and use SPL routines, see the IBM Informix Guide
to SQL: Tutorial.
For a discussion on how to create and use external routines, see IBM Informix
User-Defined Routines and Data Types Developer’s Guide.
For information about how to create C UDRs, see the IBM Informix DataBlade
API Programmer’s Guide.
Syntax
Usage
An ESQL/C program cannot directly create a user-defined function. That is,
it cannot contain the CREATE FUNCTION statement.
In the ESQL/C program, you can access the delete_order() SPL function with
the following CREATE FUNCTION FROM statement:
EXEC SQL create function from 'del_ord.sql';
If you are not sure whether the UDR in the file is a user-defined function or a
user-defined procedure, use the CREATE ROUTINE FROM statement.
The filename that you provide is relative. If you provide a simple filename
with no pathname (as in the preceding example), the client application looks
for the file in the current directory.
Important: The ESQL/C preprocessor does not process the contents of the file that you
specify. It just sends the contents to the database server for execution. Therefore, there
is no syntactic check that the file that you specify in CREATE FUNCTION FROM
actually contains a CREATE FUNCTION statement. To improve readability of the
code, however, It is recommended that you match these two statements.
Related Information
Related statements: CREATE FUNCTION, CREATE PROCEDURE, CREATE
PROCEDURE FROM, and CREATE ROUTINE FROM
+
CREATE INDEX
Use the CREATE INDEX statement to create an index for one or more columns
in a table, or on values returned by a UDR using columns as arguments.
Syntax
Index-Key
Specification
p. 2-147 IDS FILLFACTOR Storage IDS
Option Options
p. 2-155 p. 2-156 Index
XPS XPS Modes
USING Access- p. 2-161
Method Clause USING BITMAP
p. 2-153
GK SELECT Clause
GK INDEX index ON static ( p. 2-166 ) USING BITMAP
Usage
When you issue the CREATE INDEX statement, the table is locked in exclusive
mode. If another process is using the table, CREATE INDEX returns an error.
IDS Indexes use the collation that was in effect when CREATE INDEX executed. ♦
XPS If you are using Extended Parallel Server, use the USING BITMAP keywords
to store the list of records in each key of the index as a compressed bitmap.
The storage option is not compatible with a bitmap index because bitmap
indexes must be fragmented in the same way as the table. ♦
Index-Type Options
The index-type options let you specify the characteristics of the index.
UNIQUE CLUSTER
CLUSTER Option
Use the CLUSTER keyword to reorder the rows of the table in the order that
the index designates. The CREATE CLUSTER INDEX statement fails if a
CLUSTER index already exists on the same table.
This statement creates an index on the customer table that physically orders
the table by zip code.
XPS If you are using Extended Parallel Server, you cannot use the CLUSTER
option on STANDARD tables. In addition, you cannot use the CLUSTER option
and storage options in the same CREATE INDEX statement (see “Storage
Options” on page 2-156). When you create a clustered index the constrid
of any unique or referential constraints on the associated table changes.
The constrid is stored in the sysconstraints system catalog table. ♦
Index-Key Specification
Use the Index-Key Specification portion of the CREATE INDEX statement to
specify the key value for the index, an operator class, and whether the index
will be sorted in ascending or descending order.
,
( column ASC )
IDS , IDS
DESC
op_class
function ( func_col )
The index-key value can be one or more columns that contain built-in data
types. When multiple columns are listed, the concatenation of the set of
columns is treated as a single composite column for indexing.
IDS In addition, the index-key value can be one of the following types:
■ A column of type LVARCHAR(size), if size is fewer than 387 bytes
■ One or more columns that contain user-defined data types
■ One or more values that a user-defined function returns (referred to
as a functional index)
■ A combination of columns and functions ♦
■ All the columns must exist and must be in the table being indexed.
■ The maximum number of columns and total width of all columns
depends on the database server. See “Creating Composite Indexes”
on page 2-149.
■ You cannot add an ascending index to a column or column list that
already has a unique constraint on it. See “Using the ASC and DESC
Sort-Order Options” on page 2-149.
■ You cannot add a unique index to a column or column list that has a
primary-key constraint on it. The reason is that defining the column
or column list as the primary key causes the database server to create
a unique internal index on the column or column list. So you cannot
create another unique index on this column or column list with the
CREATE INDEX statement.
■ The number of indexes that you can create on the same column or the
same set of columns is restricted. See “Restrictions on the Number of
Indexes on a Set of Columns” on page 2-152.
IDS ■ You cannot create an index on a column of an external table.
■ The column cannot be of a collection data type. ♦
You can also create an index on a nonvariant user-defined function that does
not return a large object.
Functional indexes are indexed on the value that the specified function
returns, rather than on the value of a column. For example, the following
statement creates a functional index on table zones using the value that the
function Area() returns as the key:
CREATE INDEX zone_func_ind ON zones (Area(length,width));
XPS
IDS If you use SET COLLATION to specify a non-default locale, you can create
multiple indexes on the same set of columns, using different collations.
(Such indexes would be useful only on NCHAR or NVARCHAR columns.) ♦
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)
XPS You can include up to 16 columns in a composite index. The total width of all
indexed columns in a single COMPOSITE index cannot exceed 380 bytes. ♦
XPS
IDS An index key part is either a column in a table, or the result of a user-defined
function on one or more columns. A composite index can have up to 16 key
parts that are columns, or up to 341 key parts that are values returned by a
UDR. This limit is language-dependent, and applies to UDRs written in SPL or
Java; functional indexes based on C language UDRs can have up to 102 key
parts. A composite index can have any of the following items as an index key:
The total width of all indexed columns in a single CREATE INDEX statement
cannot exceed 390 bytes, except for functional indexes of Dynamic Server,
whose language-dependent limits are described earlier in this section. ♦
However, you can create a descending index on such columns, and you can
include such columns in composite ascending indexes in different combina-
tions. For example, the following sequence of statements is valid:
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)
)
Because of this capability, 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.
If you create a composite index on a table, however, 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.
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 first 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 the 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);
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;
You can create no more than one ascending index and one descending index
on a single column. Because of the bidirectional-traversal capability of the
database server, you only need to create one of the indexes. Creating both
would achieve exactly the same results for an ascending or descending sort
on the stock_num column.
■ The ix1 and ix2 indexes achieve the same results for sorts in which
the user specifies the same sort direction (ascending or descending)
for both columns, so you only need one index of this pair.
■ The ix3 and ix4 indexes achieve the same results for sorts in which
the user specifies different sort directions for the two columns
(ascending on the first column and descending on the second column
or vice versa). Thus, you only need to create one index of this pair.
(See also “Bidirectional Traversal of Indexes” on page 2-150.)
IDS Dynamic Serve can also suppport multiple indexes on the same combination
of ascending and descending columns, if each index has a different collating
order; see “SET COLLATION” on page 2-643.
If you use an alternative access method, and if the access method has a
default operator class, you can omit the operator class here; but if you do not
specify an operator class and the secondary-access method does not have a
default operator class, the database server returns an error. For more infor-
mation, see “Default Operator Classes” on page 2-180. The following CREATE
INDEX statement creates a B-tree index on the cust_tab table that uses the
abs_btree_ops operator class for the cust_num key:
CREATE INDEX c_num1_ix ON cust_tab (cust_num abs_btree_ops);
,
USING sec_acc_method ( parameter = value )
The access method that you specify must be a valid access method in the
sysams system catalog table. The default secondary-access method is B-tree.
If the access method is B-tree, you can create only one index for each unique
combination of ascending and descending columnar or functional keys with
operator classes. (This does not apply to other secondary-access methods.)
By default, CREATE INDEX creates a generic B-tree index. If you want to
create an index with a secondary-access method other than B-tree, you must
specify the name of the secondary-access method in the USING clause.
The following CREATE INDEX statement creates an index that uses the
secondary-access method fulltext, which takes two parameters:
WORD_SUPPORT and PHRASE_SUPPORT. It indexes a table t, which has two
columns: i, an integer column, and data, a TEXT column.
CREATE INDEX tx ON t(data)
USING fulltext (WORD_SUPPORT=‘PATTERN’,
PHRASE_SUPPORT=’MAXIMUM’);
FILLFACTOR Option
The FILLFACTOR 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.
FILLFACTOR percent
When the index is created, the database server initially fills only that
percentage of the nodes specified with the FILLFACTOR value.
The FILLFACTOR can also be set as a parameter in the ONCONFIG file. The
FILLFACTOR clause on the CREATE INDEX statement overrides the setting in
the ONCONFIG file. For more information about the ONCONFIG file and the
parameters you can use, see your Administrator’s Guide.
For example, with a 50-percent FILLFACTOR value, the page would be half
full and could accommodate doubling in size. A low percentage value can
result in faster inserts and can be used for indexes that you expect to grow.
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.
Storage Options
The storage options specify the distribution scheme of an index. You can use
the IN clause to specify a storage space for the entire index, or you can use the
FRAGMENT BY clause to fragment the index across multiple storage spaces.
IN dbspace
XPS dbslice
When you specify one of the storage options, you create a detached index.
Detached indexes are indexes that are created with a specified distribution
scheme. Even if the distribution scheme specified for the index is identical to
that specified for the table, the index is still considered to be detached. If the
distribution scheme of a table changes, all detached indexes continue to use
their own distribution scheme.
IDS In some earlier releases of Dynamic Server, if you did not use the storage
options to specify a distribution scheme, then by default the index inherited
the distribution scheme of the table on which it was built. Such an index is
called an attached index. In this release, CREATE INDEX creates new indexes as
detached indexes by default, but supports existing attached indexes that
were created by earlier release versions. An attached index is created in the
same dbspace (or dbspaces, if the table is fragmented) as the table on which
it is built. If the distribution scheme of a table changes, all attached indexes
start using the new distribution scheme.
Only B-tree indexes that are nonfragmented and that are on nonfragmented
tables can be attached. All other indexes, including extensibility related
indexes, such as R-trees and UDT indexes, must be detached. You cannot
create an attached index using a collating order different from that of the
table, nor different from what DB_LOCALE specifies. For information on how
to create attached indexes, see the description of the DEFAULT_ATTACH
environment variable in IBM Informix Guide to SQL: Reference. ♦
IN Clause
Use the IN clause to specify a storage space to hold the entire index. The
storage space that you specify must already exist.
Use the IN dbspace clause to specify the dbspace where you want your index
to reside. When you use this clause, you create a detached index.
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
XPS , expr
, ,
HYBRID ( column ) EXPRESSION ( dbspace , dbspace )
,
expr IN dbslice , REMAINDER IN dbslice
,
expr dbspace
( dbspace ) ,
dbspace ( dbspace )
■ Each fragment expression can contain columns only from the current
table, with data values only 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.
■ The expression must return a Boolean (true or false) value.
■ No subqueries, aggregates, user-defined routines, nor references to
fields of a ROW type column are allowed.
■ The built-in CURRENT, DATE, and TIME functions are not allowed.
XPS You can fragment indexes on any column of a table, even if the table spans
multiple coservers. The columns that you specify in the FRAGMENT BY clause
do not have to be part of the index key.
ENABLED
Mode Purpose
DISABLED The database server does not update the index after insert, delete,
and update operations that modify the base table. The optimizer does
not use the index during the execution of queries.
ENABLED The database server updates the index after insert, delete, and update
operations that modify the base table. The optimizer uses the index
during query execution. If an insert or update operation causes a
duplicate key value to be added to a unique index, the statement fails.
FILTERING The database server updates a unique index after insert, delete, and
update operations that modify the base table. (This option is not
available with duplicate indexes.)
The optimizer uses the index during query execution. If an insert or
update operation causes a duplicate key value to be added to a
unique index in filtering 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.
If you specify filtering for a unique index, you can also specify one of the
following error options.
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. 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 (enabled) unique, foreign-key, or primary-key
constraint on a column or set of columns if the indexes on which the active
constraint depends are disabled.
In COARSE lock mode, index-level locks are acquired on the index instead of
item-level or page-level locks. This mode reduces the number of lock calls on
an index. Use the coarse-lock mode when you know the index is not going to
change, that is, when read-only operations are performed on the index.
If you specify no lock mode, the default is NORMAL. That is, the database
server places item-level or page-level locks on the index as necessary.
A GK index is defined on a table when that table is the one being indexed. A
GK index depends on a table when the table appears in the FROM clause of the
index. Before you create a GK index, keep the following issues in mind:
FROM indexed_table
synonym1
, table
synonym2 AS alias
All tables that appear in the FROM clause must be local static tables. That is,
no views, non-static, or remote tables are allowed.
The tables that are mentioned in the FROM clause must be transitively joined
on key to the indexed table. Table A is transitively joined on key to table B if
A and B are joined with equal joins on the unique-key columns of A. For
example, suppose tables A, B, and C each have col1 as a primary key. In the
following example, B is joined on key to A and C is joined on key to B. C is
transitively joined on key to A.
CREATE GK INDEX gki
(SELECT A.col1, A.col2 FROM A, B, C
WHERE A.col1 = B.col1 AND B.col1 = C.col1)
Condition
WHERE p. 4-24
Join
p. 2-619
Related Information
Related statements: ALTER INDEX, CREATE OPCLASS, CREATE TABLE, DROP
INDEX, RENAME INDEX, and SET Database Object Mode
GLS For a discussion of the GLS aspects of the CREATE INDEX statement, see the
IBM Informix GLS User’s Guide. ♦
For information about the indexes that DataBlade modules provide, refer to
your DataBlade module user’s guide.
Syntax
,
, Opaque-Type Modifier
p. 2-171
Usage
The CREATE OPAQUE TYPE statement registers a new opaque type in the
sysxtdtypes system catalog table.
To create an opaque type, you must have the Resource privilege on the
database. When you create the opaque type, only you, the owner, have the
Usage privilege on this type. Use the GRANT or REVOKE statements to grant
or revoke the Usage privilege to other database users.
To view the privileges on a data type, check the sysxtdtypes system catalog
table for the owner name and the sysxtdtypeauth system catalog table for
additional type privileges that might have been granted.
For details of system catalog tables, see the IBM Informix Guide to SQL:
Reference.
The owner name is case sensitive. If you do not put quotes around the owner
name, the name of the opaque-type owner is stored in uppercase letters. ♦
INTERNALLENGTH Modifier
The INTERNALLENGTH modifier specifies the storage size that is required for
the opaque type as fixed length or varying length.
Opaque-Type Modifier
MAXLEN = length
CANNOTHASH
PASSEDBYVALUE
ALIGNMENT = align_value
Modifiers can specify the following optional information for opaque types:
■ A data structure that serves as the internal storage of the opaque type
The internal storage details of the type are hidden, or opaque. Once
you define a new opaque type, the database server can manipulate it
without knowledge of the C or Java structure in which it is stored.
■ Support functions that allow the database server to interact with this
internal structure
The support functions tell the database server how to interact with
the internal structure of the type. These support functions must be
written in the C or Java programming language.
■ Additional user-defined functions that other support functions or
end users can invoke to operate on the opaque type (optional)
Possible support functions include operator functions and cast func-
tions. Before you can use these functions in SQL statements, they
must be registered with the appropriate CREATE CAST, CREATE PRO-
CEDURE, or CREATE FUNCTION statement.
The following table summarizes the support functions for an opaque type.
input( ) Converts the opaque type from its external When a client application sends a
LVARCHAR representation to its internal character representation of the
representation opaque type in an INSERT,
UPDATE, or LOAD statement
output( ) Converts the opaque type from its internal When the database server sends a
representation to its external LVARCHAR character representation of the
representation opaque type as a result of a SELECT
or FETCH statement
receive( ) Converts the opaque type from its internal When a client application sends an
representation on the client computer to its internal representation of the
internal representation on the server computer opaque type in an INSERT,
Provides platform-independent results UPDATE, or LOAD statement
regardless of differences between client and
server computer types
(1 of 3)
send( ) Converts the opaque type from its internal repre- When the database server sends an
sentation on the server computer to its internal internal representation of the
representation on the client computer opaque type as a result of a SELECT
Provides platform-independent results or FETCH statement
regardless of differences between client and
database server computer types
db_receive( ) Converts the opaque type from its internal repre- When a local database receives a
sentation on the local database to the dbsendrecv type from an external
DBSENDRECV type for transfer to an external database on the local database
database on the local server server
db_send( ) Converts the opaque type from its internal repre- When a local database sends a
sentation on the local database to the dbsendrecv type to an external
DBSENDRECV type for transfer to an external database on the local database
database on the local server server
server_receive( ) Converts the opaque type from its internal repre- When the local database server
sentation on the local server computer to the receives a srvsendrecv type from a
SRVSENDRECV type for transfer to a remote remote database server
database server
Use any name for this function.
server_send( ) Converts the opaque type from its internal repre- When the local database server
sentation on the local server computer to the sends a srvsendrecv type to a
SRVSENDRECV type for transfer to a remote remote database server
database server
Use any name for this function.
import( ) Performs any tasks needed to convert from the When DB-Access (LOAD) or the
external (character) representation of an opaque High-Performance Loader (HPL)
type to the internal format for a bulk copy initiates a bulk copy from a text file
to a database
export ( ) Performs any tasks needed to convert from the When DB-Access (UNLOAD) or the
internal representation of an opaque type to the High Performance Loader initiates
external (character) format for a bulk copy a bulk copy from a database to a text
file
importbinary( ) Performs any tasks needed to convert from the When DB-Access (LOAD) or the
internal representation of an opaque type on the High Performance Loader initiates
client computer to the internal representation on a bulk copy from a binary file to a
the server computer for a bulk copy database
(2 of 3)
exportbinary( ) Performs any tasks needed to convert from the When DB-Access (UNLOAD) or the
internal representation of an opaque type on the High Performance Loader initiates
server computer to the internal representation on a bulk copy from a database to a
the client computer for a bulk copy binary file
assign() Performs any processing required before storing When the database server executes
the opaque type to disk INSERT, UPDATE, or LOAD, before
This support function must be named assign( ). it stores the opaque type to disk
destroy() Performs any processing necessary before When the database server executes
removing a row that contains the opaque type the DELETE or DROP TABLE,
This support function must be named destroy( ). before it removes the opaque type
from disk
lohandles() Returns a list of the LO-pointer structures When the database server must
(pointers to smart large objects) in an opaque search opaque types for references
type to smart large objects: when
oncheck runs, or an archive is
performed
compare() Compares two values of the opaque type and When the database server
returns an integer value to indicate whether the encounters an ORDER BY,
first value is less than, equal to, or greater than UNIQUE, DISTINCT, or UNION
the second value clause in a SELECT statement, or
when CREATE INDEX creates a B-
tree index
(3 of 3)
After you write the necessary support functions for the opaque type, use the
CREATE FUNCTION statement to register these support functions in the same
database as the opaque type. Certain support functions convert other data
types to or from the new opaque type. After you create and register these
support functions, use the CREATE CAST statement to associate each function
with a particular cast. The cast must be registered in the same database as the
support function.
After you have written the necessary C language or Java language source
code to define an opaque data type, you then use the CREATE OPAQUE TYPE
statement to register the opaque data type in the database.
Related Information
Related statements: CREATE CAST, CREATE DISTINCT TYPE, CREATE
FUNCTION, CREATE ROW TYPE, CREATE TABLE, and DROP TYPE
For a description of an opaque type, see the IBM Informix Guide to SQL:
Reference.
For information on how to define an opaque type, see IBM Informix User-
Defined Routines and Data Types Developer’s Guide.
For information on how to use the Java language to define an opaque type,
see the J/Foundation Developer’s Guide.
For information about the GLS aspects of the CREATE OPAQUE TYPE
statement, refer to the IBM Informix GLS User’s Guide.
+ CREATE OPCLASS
IDS
Use the CREATE OPCLASS statement to create an operator class for a secondary-
access method.
Syntax
, ,
Strategy Specification
( p. 2-178 ) SUPPORT ( support_function )
Usage
An operator class is the set of operators that Dynamic Server associates with
the specified secondary-access method for query optimization and building
the index. A secondary-access method (sometimes referred to as an index
access method) is a set of database server functions that build, access, and
manipulate an index structure such as a B-tree, R-tree, or an index structure
that a DataBlade module provides.
Define a new operator class when you want one of the following:
■ An index to use a different order for the data than the sequence that
the default operator class provides
■ A set of operators that is different from any existing operator classes
that are associated with a particular secondary-access method
You must have the Resource privilege or be the DBA to create an operator
class. The actual name of an operator class is an SQL identifier. When you
create an operator class, opclass name must be unique within a database.
■ Strategy functions
Specify strategy functions of an operator class in the STRATEGY
clause of the CREATE OPCLASS statement. In the preceding CREATE
OPCLASS code example, the abs_btree_ops operator class has five
strategy functions.
■ Support functions
Specify support functions of an operator class in the SUPPORT clause.
In the preceding CREATE OPCLASS code example, the abs_btree_ops
operator class has one support function.
STRATEGIES Clause
Strategy functions are functions that end users can invoke within an SQL
statement to operate on a data type. The query optimizer uses the strategy
functions to determine if a particular index can be used to process a query.
When you create a new operator class, you specify the strategy functions for
the secondary-access method in the STRATEGIES clause. The Strategy Specifi-
cation lists the name of each strategy function. List these functions in the
order that the secondary-access method expects. For the specific order of
strategy operators for the default operator classes for a B-tree index and an R-
tree index, see IBM Informix User-Defined Routines and Data Types Developer’s
Guide.
Strategy Specification
strategy_function
,
( 2 input_type )
output_type
You can specify UDTs as well as built-in data types. If you do not specify the
function signature, the database server assumes that each strategy function
takes two arguments of the same data type and returns a BOOLEAN value.
SUPPORT Clause
Support functions are functions that the secondary-access method uses
internally to build and search the index. Specify these functions for the
secondary-access method in the SUPPORT clause of CREATE OPCLASS.
You must list the names of the support functions in the order that the
secondary-access method expects. For the specific order of support operators
for the default operator classes for a B-tree index and an R-tree index, refer to
“Default Operator Classes” on page 2-180.
Related Information
Related statements: CREATE FUNCTION, CREATE INDEX, and DROP OPCLASS
For more about R-tree indexes, see the IBM Informix R-Tree Index User’s Guide.
For information about the GLS aspects of the CREATE OPCLASS statement,
refer to the IBM Informix GLS User’s Guide.
+
CREATE PROCEDURE
Use the CREATE PROCEDURE statement to create a user-defined procedure.
(To create a procedure from text of source code that is in a separate file, use
the CREATE PROCEDURE FROM statement.)
Syntax
SPL IDS ,
Specific
Return Name IDS
SPECIFIC WITH ( Routine )
Clause p. 4-274 SPL Modifier
p. 4-253 p. 4-257
Statement Block
; SPL p. 4-276 END PROCEDURE
Usage
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, tabs, and other whitespace characters.
E/C In ESQL/C, you can use CREATE PROCEDURE only as text 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. ♦
IDS Routines use the collating order that was in effect when they were created.
See SET COLLATION for information about using non-default collation ♦
IDS In Dynamic Server, although you can use CREATE PROCEDURE to write and
register an SPL routine that returns one or more values (that is, an SPL
function), it is recommended that you use CREATE FUNCTION instead. To
register an external function, you must use CREATE FUNCTION.
Tip: If you are trying to create a procedure from text that is in a separate file, use the
CREATE PROCEDURE FROM statement.
You can write a UDR in SPL (SPL routine) or in an external language (external
routine) that the database server supports. Where the term UDR appears in the
manual, it can refer to both SPL routines and external routines.
The term user-defined procedure refers to SPL procedures and external proce-
dures. User-defined function refers to SPL functions and external functions.
SPL In earlier IBM Informix products, the term stored procedure was used for both
SPL procedures and SPL functions. In this manual, the term SPL routine
replaces the term stored procedure. When it is necessary to distinguish
between an SPL function and an SPL procedure, the manual does so. ♦
XPS Extended Parallel Server does not support external routines, but the term
user-defined routine (UDR) encompasses both SPL routines and external
routines. Wherever the term UDR appears, it is applicable to SPL routines. ♦
Ext Before you can create an external procedure, you must also have the Usage
privilege on the language in which you will write the procedure. For more
information, see “GRANT” on page 2-459. ♦
SPL By default, the Usage privilege on SPL is granted to PUBLIC. You must also
have at least the Resource privilege on a database to create an SPL procedure
within that database. ♦
■ You create a UDR with the same name as a built-in routine (such as
equal( )) to process a new user-defined data type.
■ You create type hierarchies in which subtypes inherit data represen-
tation and UDRs from supertypes.
■ You create distinct types, which are data types that have the same
internal storage representation as an existing data type, but have
different names and cannot be compared to the source type without
casting. Distinct types inherit UDRs from their source types.
For a brief description of the routine signature that uniquely identifies each
UDR, see “Routine Overloading and Naming UDRs with a Routine
Signature” on page 4-48.
DOCUMENT Clause
The quoted string in the DOCUMENT clause provides a synopsis and
description of a UDR. The string is stored in the sysprocbody system catalog
table and is intended for the user of the UDR.
Anyone with access to the database can query the sysprocbody system
catalog table to obtain a description of one or all the UDRs stored in the
database. A UDR or application program can query the system catalog tables
to fetch the DOCUMENT clause and display it for a user.
For example, to find the description of the SPL procedure raise_prices, shown
in “SPL Procedures” on page 2-187, enter a query such as this example:
SELECT data FROM sysprocbody b, sysprocedures p
WHERE b.procid = p.procid
--join between the two catalog tables
AND p.procname = 'raise_prices'
-- look for procedure named raise_prices
AND b.datakey = 'D';-- want user document
Ext You can use a DOCUMENT clause at the end of the CREATE PROCEDURE
statement, whether or not you use the END PROCEDURE keywords. ♦
If you do not use the WITH LISTING IN clause, the compiler does not generate
a list of warnings.
UNIX If you specify a filename but not a directory, this listing file is created in your
home directory on the computer where the database resides. If you do not
have a home directory on this computer, the file is created in the root
directory (the directory named “/”). ♦
Windows If you specify a filename but not a directory, this listing file is created in your
current working directory if the database is on the local computer. Otherwise,
the default directory is %INFORMIXDIR%\bin. ♦
SPL routines are parsed, optimized (as far as possible), and stored in the
system catalog tables in executable format. The body of an SPL routine is
stored in the sysprocbody system catalog table. Other information about the
routine is stored in other system catalog tables, including sysprocedures,
sysprocplan, and sysprocauth.
If you specify an optional clause after the parameter list, you must place a
semicolon after the clause that immediately precedes the Statement Block.
1. Write a Java static method, which can use the JDBC functions to
interact with the database server.
2. Compile the Java source and create a jar file (the shared-object file).
3. Execute the install_jar( ) procedure with the EXECUTE PROCEDURE
statement to install the jar file in the current database.
4. If the UDR uses user-defined types, create a mapping between SQL
data types and Java classes, using the setUDTExtName( ) procedure
that is explained in “EXECUTE PROCEDURE” on page 2-414.
5. Register the UDR with the CREATE PROCEDURE statement. (If an
external routine returns a value, you must register it with the
CREATE FUNCTION statement, rather than CREATE PROCEDURE.)
Rather than storing the body of an external routine directly in the database,
the database server stores only the pathname of the shared-object file that
contains the compiled version of the routine. The database server executes an
external routine by invoking the external object code.
The EXTERNAL NAME clause specifies that the Java implementation of the
showusers( ) procedure is a method called showusers( ), which resides in the
admin Java class that resides in the admin_jar jar file. ♦
In the case of a DBA-privileged UDR, however, the user who executes the
UDR, not the UDR owner, owns any database objects that the UDR created
unless another owner is specified for the database object within the UDR.
You can also create the sysdbclose( ) SPL procedure which is executed when
a user disconnects from the database.
You can include valid SQL or SPL language statements that are appropriate
when a database is opened or closed. See the following sections for restric-
tions on SQL and SPL statements within SPL routines:
■ “Subset of SPL Statements Valid in the Statement Block” on
page 4-276
■ “SQL Statements Not Valid in an SPL Statement Block” on
page 4-277
■ “Restrictions on SPL Routines in Data-Manipulation Statements” on
page 4-279
For example, you might create the following procedure, which sets the
isolation level to Dirty Read and turns on the IMPLICIT_PDQ environment
option, to be executed when any user connect to the database:
create procedure public.sysdbopen()
set role engineer;
end procedure
user.sysdbopen() This procedure is executed when the specified user opens the
database as the current database.
user.sysdbclose() This procedure is executed when the specified user closes the
database, disconnects from the database server, or the user
session ends. If the sysdbclose() procedure did not exist
when a session opened the database, however, it is not
executed when the session closes the database.
Make sure that you set permissions appropriately to allow intended users to
execute the SPL procedure statements. For example, if the SPL procedure
executes a command that writes output to a local directory, permissions must
be set to allow users to write to this directory. If you want the procedure to
continue if permission failures occur, include an ON EXCEPTION error
handler for this condition.
See also the section “Support for Roles and User Identity” on page 4-280.
Only a user with DBA privileges can install these procedures. For security
reasons, non-DBAs cannot prevent execution of these procedures. For some
applications, however, such as ad hoc query applications, users can execute
commands and SQL statements that subsequently change the environment.
For general information about how to write and install SPL procedures, refer
to the chapter about SPL routines in IBM Informix Guide to SQL: Tutorial.
Related Information
Related statements: ALTER FUNCTION, ALTER PROCEDURE, ALTER
ROUTINE, CREATE FUNCTION, CREATE FUNCTION FROM, CREATE
PROCEDURE FROM, DROP FUNCTION, DROP PROCEDURE, DROP ROUTINE,
EXECUTE FUNCTION, EXECUTE PROCEDURE, GRANT, PREPARE, REVOKE,
and UPDATE STATISTICS
For a discussion of how to create and use SPL routines, see the IBM Informix
Guide to SQL: Tutorial. For a discussion of external routines, see IBM Informix
User-Defined Routines and Data Types Developer’s Guide.
For information about how to create C UDRs, see the IBM Informix DataBlade
API Programmer’s Guide. For more information on the NODEFDAC
environment variable and the related system catalog tables (sysprocedures,
sysprocplan, sysprocbody and sysprocauth), see the IBM Informix Guide to
SQL: Reference.
XPS In Extended Parallel Server, use this statement to access any SPL routine.
Extended Parallel Server does not support the CREATE FUNCTION FROM
statement. ♦
Syntax
Usage
You cannot create a user-defined procedure directly in an ESQL/C program.
That is, the program cannot contain the CREATE PROCEDURE statement.
In the ESQL/C program, you can access the raise_prices() SPL procedure with
the following CREATE PROCEDURE FROM statement:
EXEC SQL create procedure from 'raise_pr.sql';
IDS If you are not sure whether the UDR in the file is a user-defined function or a
user-defined procedure, use the CREATE ROUTINE FROM statement. ♦
IDS Procedures use the collating order that was in effect when they were created.
See SET COLLATION for information about using non-default collation ♦
UNIX On UNIX, if you specify a simple filename instead of a full pathname in the
file parameter, the client application looks for the file in your home directory
on the computer where the database resides. If you do not have a home
directory on this computer, the default directory is the root directory. ♦
Windows On Windows, if you specify a filename but not a directory in the file
parameter, the client application looks for the file in your current working
directory if the database is on the local computer. Otherwise, the default
directory is %INFORMIXDIR%\bin. ♦
Important: The ESQL/C preprocessor does not process the contents of the file that you
specify. It just sends the contents to the database server for execution. Therefore, there
is no syntactic check that the file that you specify in CREATE PROCEDURE FROM
actually contains a CREATE PROCEDURE statement. To improve readability of the
code, however, it is recommended that you match these two statements.
Related Information
Related statements: CREATE PROCEDURE, CREATE FUNCTION FROM, and
CREATE ROUTINE FROM
+ CREATE ROLE
Use the CREATE ROLE statement to create a new role.
Syntax Usage
The database administrator (DBA) can use the CREATE ROLE statement to
create a new role. A role can be considered as a classification, 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.
IDS Also, the role name cannot already be listed in the grantor or grantee
columns of the sysfragauth system catalog table. ♦
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.
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 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.
Related Information
Related statements: DROP ROLE, GRANT, REVOKE, and SET ROLE
For a discussion on how to use roles, see the IBM Informix Database Design and
Implementation Guide.
Syntax
Usage
An IBM Informix ESQL/C program cannot directly define a UDR. That is, it
cannot contain the CREATE FUNCTION or CREATE PROCEDURE statement.
The filename that you provide is relative. If you provide no pathname, the
client application looks for the file in the current directory.
If you do not know at compile time whether the UDR in the file is a function
or a procedure, use the CREATE ROUTINE FROM statement in the ESQL/C
program. If you do know if the UDR is a function or a procedure, it is recom-
mended that you use the matching statement to access the source file:
Related Information
Related statements: CREATE FUNCTION, CREATE FUNCTION FROM, CREATE
PROCEDURE, and CREATE PROCEDURE FROM
Syntax
,
row_type ( Field Definition )
CREATE ROW TYPE p. 2-201
UNDER supertype
Usage
The CREATE ROW TYPE statement creates a named ROW data type. You can
assign a named ROW type to a table or view to create a typed table or typed
view. You can also define a column as a named ROW type. Although you can
assign a ROW type to a table to define the schema of the table, ROW types are
not the same as table rows. Table rows consist of one or more columns; ROW
types consist of one or more fields, defined using the Field Definition syntax.
A named ROW type is valid in most contexts where you can specify a data
type. Named ROW types are strongly typed. No two named ROW types are
equivalent, even if they are structurally equivalent.
ROW types without names are called unnamed ROW types. Any two unnamed
ROW types are considered equivalent if they are structurally equivalent. For
more information, see “Row Data Types” on page 4-62.
Privileges on named ROW type columns are the same as privileges on any
column. For more information, see “Table-Level Privileges” on page 2-463.
(To see what privileges you have on a column, check the syscolauth system
catalog table, which is described in the IBM Informix Guide to SQL: Reference.)
For information about Resource and Under privileges, and the ALL keyword
in the context of privileges, see the GRANT statement.
To find out what privileges exist on a ROW type, check the sysxtdtypes
system catalog table for the owner name and the sysxtdtypeauth system
catalog table for privileges that might have been granted.
Privileges on a typed table (a table that is assigned a named ROW type) are
the same as privileges on any table. For more information, see “Table-Level
Privileges” on page 2-463.
To find out what privileges you have on a given table, check the systabauth
system catalog table. For more information on system catalog tables, see the
IBM Informix Guide to SQL: Reference.
The supertype must also be a named ROW type. If you create a named ROW
type under an existing supertype, then the new type name row_type becomes
the name of the subtype.
When you create a named ROW type as a subtype, the subtype inherits all
fields of the supertype. In addition, you can add new fields to the subtype
that you create. The new fields are specific to the subtype alone.
Creating a Subtype
In most cases, you add new fields when you create a named ROW type as a
subtype of another named ROW type (its supertype). To create the fields of a
named ROW type, use the field definition clause, as described in “Field
Definition” on page 2-201. When you create a subtype, you must use the
UNDER keyword to associate the supertype with the named ROW type that
you want to create. The following statement creates the employee_t type
under the person_t type:
CREATE ROW TYPE employee_t (salary NUMERIC(10,2),
bonus NUMERIC(10,2)) UNDER person_t;
The employee_t type inherits all the fields of person_t and has two
additional fields: salary and bonus; but the person_t type is not altered.
Type Hierarchies
When you create a subtype, you create a type hierarchy. In a type hierarchy,
each subtype that you create inherits its properties from a single supertype.
If you create a named ROW type customer_t under person_t, customer_t
inherits all the fields of person_t. If you create another named ROW type,
salesrep_t under customer_t, salesrep_t inherits all the fields of customer_t.
Thus, salesrep_t inherits all the fields that customer_t inherited from
person_t as well as all the fields defined specifically for customer_t. For a
discussion of type inheritance, refer to the IBM Informix Guide to SQL: Tutorial.
■ Verify that you are authorized to create new data types. You must
have the Resource privilege on the database. You can find this infor-
mation in the sysusers system catalog table.
■ Verify that the supertype exists. You can find this information in the
sysxtdtypes system catalog table.
■ Verify that you are authorized to create subtypes to that supertype.
You must have the Under privilege on the supertype. You can find
this information in the sysusers system catalog table.
■ Verify that the name that you assign to the named ROW type is
unique within the database. In an ANSI-compliant database, the
owner.type combination must be unique within the database. In a
database that is not ANSI-compliant, the name must be unique
among data type names in the database. To verify whether the name
you want to assign to a new data type is unique within the schema,
check the sysxtdtypes system catalog table. The name must not be
the name of an existing data type.
■ If you are defining fields for the ROW type, check that no duplicate
field names exist in both new and inherited fields.
Important: When you create a subtype, do not redefine fields that it inherited for its
supertype. If you attempt to redefine these fields, the database server returns an error.
You cannot apply constraints to named ROW types, but you can specify
constraints when you create or alter a table that uses named ROW types.
Field Definition
Use the field definition portion of CREATE ROW TYPE to define a new field in
a named ROW type.
field data_type
NOT NULL
The NOT NULL constraint on named ROW type field applies to corresponding
columns when the named ROW type is used to create a typed table.
You cannot create a ROW type that has a BYTE or TEXT value that is stored in
a separate storage space. That is, you cannot use the IN clause to specify the
storage location. For example, the following example produces an error:
CREATE ROW TYPE row1 (field1 byte IN blobspace1) --INVALID CODE
Across a table hierarchy, you can use only one SERIAL and one SERIAL8. That
is, if a supertable table contains a SERIAL column, no subtable can contain a
SERIAL column. However, a subtable can have a SERIAL8 column (as long as
no other subtables contain a SERIAL8 column). Consequently, when you
create the named ROW types on which the table hierarchy is to be based, they
can contain at most one SERIAL and one SERIAL8 field among them.
You cannot set the starting SERIAL or SERIAL8 value with CREATE ROW TYPE.
To modify the value for a serial field, you must use either the MODIFY clause
of the ALTER TABLE statement or the INSERT statement to insert a value that
is larger than the current maximum (or default) serial value.
Related Information
Related statements: DROP ROW TYPE, CREATE TABLE, CREATE CAST, GRANT,
and REVOKE
For a discussion of named ROW types, see the IBM Informix Database Design
and Implementation Guide and the IBM Informix Guide to SQL: Reference.
DB CREATE SCHEMA
SQLE
Use the CREATE SCHEMA statement to issue a block of data definition
language (DDL) and GRANT statements as a logical unit. Use this statement
with DB-Access.
Syntax
Usage
The CREATE SCHEMA statement allows the DBA to specify an owner for all
database objects that the CREATE SCHEMA statement creates. You cannot
issue CREATE SCHEMA until you create the database that stores the objects.
Users with the Resource privilege can create a schema for themselves. In this
case, user 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 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, as the
following example shows. Statements are considered part of the CREATE
SCHEMA statement until a semicolon or an end-of-file symbol is reached.
You can only grant privileges with the CREATE SCHEMA statement; you
cannot revoke or drop privileges.
If you create a database object or use the GRANT statement outside a CREATE
SCHEMA statement, you receive warnings if you use the -ansi flag or set
DBANSIWARN.
Related Information
Related statements: CREATE INDEX, CREATE SYNONYM, CREATE TABLE,
CREATE VIEW, and GRANT
For a discussion of how to create a database, see the IBM Informix Database
Design and Implementation Guide.
Syntax
Scratch Table
CREATE SCRATCH TABLE table Definition
Scratch Table ,
Definition ,
Column Multiple-Column
( Definition , Constraint Format )
p. 2-216 p. 2-264
Scratch Table
Options
Usage
CREATE SCRATCH TABLE is a special case of the CREATE Temporary TABLE
statement. See “CREATE Temporary TABLE” on page 2-261.
+ CREATE SEQUENCE
IDS
Use the CREATE SEQUENCE statement to create a new sequence. A sequence is
a database object from which multiple users can generate unique integers.
Syntax
owner . 1 NOCYCLE
NOMAXVALUE 1 NOORDER
NOMINVALUE
Usage
A sequence (sometimes called a sequence generator) returns a monotonically
ascending or descending series of unique integers, one at a time. The CREATE
SEQUENCE statement defines a new sequence and declares its identifier.
Generated values logically resemble the SERIAL8 data type, but are unique
within the sequence. Because the database server generates the values,
sequences support a much higher level of concurrency than a serial column
can. The values are independent of transactions; a generated value cannot be
rolled back, even if the transaction in which it was generated fails.
You can use a sequence to generate primary key values automatically, using
one sequence for many tables, or each table can have its own sequence.
CREATE SEQUENCE can specify the following characteristics of a sequence:
■ Initial value
■ Size and sign of the increment between values.
■ Maximum and minimum values
■ Whether the sequence recycles values after reaching its limit
■ How many values are preallocated in memory for rapid access
INCREMENT BY Option
Use the INCREMENT BY option to specify the interval between successive
numbers in the sequence. The interval, or step value, can be a positive whole
number (for an ascending sequence) or a negative whole number (for a
descending sequence) in the INT8 range. The BY keyword is optional.
If you do not specify any step value, the default interval between successive
generated values is 1, and the sequence is an ascending sequence.
If you do not specify an origin value, the default initial value is min for an
ascending sequence or max for a descending sequence. (The “MAXVALUE or
NOMAXVALUE Option” and “MINVALUE or NOMINVALUE Option”
sections that follow describe the max and min specifications respectively.)
If you do not specify a max value, the default is NOMAXVALUE. This default
setting supports values that are less than or equal to 2e64 for ascending
sequences, or less than or equal to -1 for descending sequences.
If you do not specify a min value, the default is NOMINVALUE. This default
setting supports values that are greater than or equal to 1 for ascending
sequences, or greater than or equal to -(2e64) for descending sequences.
The default is NOCYCLE. At this default setting, the sequence cannot generate
more values after reaching the declared limit. Once the sequence reaches the
limit, the next reference to sequence.NEXTVAL returns an error.
Related Information
Related statements: ALTER SEQUENCE, DROP SEQUENCE, RENAME
SEQUENCE, CREATE SYNONYM, DROP SYNONYM, GRANT, REVOKE, INSERT,
UPDATE, and SELECT
+
CREATE SYNONYM
Use the CREATE SYNONYM statement to declare and register an alternative
name for an existing table, view, or sequence object.
Syntax
CREATE SYNONYM synonym FOR table
PRIVATE sequence
Usage
Users have the same privileges for a synonym that they have for the database
object that the synonym references. The syssynonyms, syssyntable, and
systables system catalog tables maintain information about synonyms.
The identifier of the synonym must be unique among the names of tables,
temporary tables, views, and sequence objects in the same database. (See,
however, the section “Synonyms with the Same Name” on page 2-212.)
Once a synonym is created, it persists until the owner executes the DROP
SYNONYM statement. (This persistence distinguishes a synonym from an
alias that you can declare in the FROM clause of a SELECT statement; the alias
is in scope only during execution of that SELECT statement.) If a synonym
refers to a table, view, or sequence in the same database, the synonym is
automatically dropped if the referenced table, view, or sequence is dropped.
You can also create a synonym for a table or view that exists in a database of
a database server that is not your current database server. Both database
servers must be online when you create the synonym. In a network, the
remote database server verifies that the table or view referenced by the
synonym exists when you create the synonym. The next example reates a
synonym for a table supported by a remote database server:
CREATE SYNONYM mysum FOR payables@phoenix:jean.summary
The identifier mysum now refers to the table jean.summary, which is in the
payables database on the phoenix database server. 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.
IDS You cannot create synonyms, however, for these external objects:
ANSI In an ANSI-compliant database, all synonyms are private. If you use the
PUBLIC or PRIVATE keywords, the databasde server issues a syntax error. ♦
A private synonym can be declared with the same name as a public synonym
only if the two synonyms have different owners. If you own a private
synonym, and a public synonym exists with the same name, the database
server resolves the unqualified name as the private synonym. (In this case,
you must specify owner.synonym to reference the public synonym.) If you use
DROP SYNONYM with the unqualified synonym identifier when your private
synonym and the public synonym of another user both have the same
identifier, only your private synonym is dropped. If you repeat the same
DROP SYNONYM statement, the database server drops the public synonym.
Chaining Synonyms
If you create a synonym for a table or view that is not in the current database,
and this table or view is dropped, the synonym stays in place. You can create
a new synonym for the dropped table or view with the name of the dropped
table or view as the synonym, which points to another external or remote
table or view. (Synonyms for external sequence objects are not supported.)
In this way, you can move a table or view to a new location and chain
synonyms together so that the original synonyms remain valid. (You can
chain up to 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):
The synonym cust on the accntg database server now points to the customer
table on the zoo database server.
The synonym cust on the accntg database server now points to a new version
of the customer table on the training database server.
Related Information
Related statement: DROP SYNONYM
CREATE TABLE
Use the CREATE TABLE statement to create a new table in the current
database, to place data-integrity constraints on columns, to designate where
the table should be stored, to indicate the size of its initial and subsequent
extents, and to specify how to lock the new table.
You can use the CREATE TABLE statement to create relational-database tables
or typed tables (object-relational tables). For information on how to create
temporary tables, see “CREATE Temporary TABLE” on page 2-261.
Syntax
XPS OPERATIONAL
Table
Definition
, ,
Usage
When you create a new table, every column must have a data type associated
with it. The table name must be unique among all the names of tables, views,
sequences, and synonyms within the same database, but the names of
columns need only be unique among the column names of the same table.
E/C In ESQL/C, using the CREATE TABLE statement generates warnings if you use
the -ansi flag or set DBANSIWARN. ♦
Logging Options
Use the Logging Type options to specify characteristics that can improve
performance in various bulk operations on the table. Other than the default
option (STANDARD) that is used for OLTP databases, these logging options
are used primarily to improve performance in data warehousing databases.
STANDARD Logging table that allows rollback, recovery, and restoration from
archives. This type is the default. Use this type of table for all the
recovery and constraints functionality that OLTP databases require.
XPS By using raw tables with Extended Parallel Server, you can take advantage of
light appends and avoid the overhead of logging, checking constraints, and
building indexes. ♦
Warning: Use raw tables for fast loading of data, but set the logging type to
STANDARD and perform a level-0 backup before you use the table in a transaction or
modify the data within the table. If you must use a raw table within a transaction,
either set the isolation level to Repeatable Read or lock the table in exclusive mode to
prevent concurrency problems.
XPS Extended Parallel Server supports two additional logging type options.
Option Effect
OPERATIONAL Logging table that uses light appends; it cannot be restored from
archive. Use this type on tables that are refreshed frequently,
because light appends allow the quick addition of many rows.
Column Definition
Use the column definition portion of CREATE TABLE to list the name, data
type, default values, and constraints of a single column.
Because of the maximum row size limit of 32,767 bytes, no more than 195
columns in the table can be of the data types BYTE, TEXT, ROW, LVARCHAR,
NVARCHAR, VARCHAR, and varying-length UDTs. Similarly, no more than
97 columns can be of COLLECTION data types (SET, LIST, and MULTISET).
As with any SQL identifier, syntactic ambiguities can occur if the column
name is a keyword. For information on reserved words for Dynamic Server,
see Appendix A, “Reserved Words for IBM Informix Dynamic Server.”
For more information on reserved words for Extended Parallel Server, see
Appendix B, “Reserved Words for IBM Informix Extended Parallel Server.”
For more information on the ambiguities that can occur, see “Using
Keywords as Column Names” on page 4-195.
IDS If you define a column of a table to be of a named ROW type, the table does
not adopt any constraints of the named ROW. ♦
DEFAULT Clause
Use the DEFAULT clause to specify the default value for the database server
to insert into a column when no explicit value for the column is specified.
DEFAULT NULL
DBSERVERNAME
If you specify NULL as the default value for a column, you cannot specify a
NOT NULL constraint as part of the column definition. (For details of NOT
NULL constraints, see“Using the NOT NULL Constraint” on page 2-221.)
NULL is not a valid default value for a column that is part of a primary key.
If the column is BYTE or TEXT data type, NULL is the only valid default value.
IDS If the column is BLOB or CLOB data type, NULL is the only valid default
value. ♦
CHAR, CHARACTER VARYING, DATE, Quoted String, p. 4-243. See note that
VARCHAR, NCHAR, NVARCHAR follows for DATE.
DATE literals must be of the format that the DBDATE (or else GL_DATE)
environment variable specifies. In the default locale, if neither DBDATE nor
GL_DATE is set, DATE literals must be of the mm/dd/yyyy format.
These column sizes are recommended because, if the column length is too
small to store the default value during INSERT or ALTER TABLE operations,
the database server returns an error.
IDS You cannot designate a built-in function (that is, CURRENT, USER, TODAY,
SITENAME, or DBSERVERNAME) as the default value for a column that holds
opaque or distinct data types. ♦
+ DISTINCT
REFERENCES +
NOT NULL UNIQUE
Clause
+ p. 2-223
PRIMARY KEY
Constraint
Constraint Definition CHECK Clause Definition
p. 2-228 p. 2-227 p. 2-228
The following example creates a standard table with two constraints: num, a
primary-key constraint on the acc_num column; and code, a unique
constraint 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))
The constraints used in this example are defined in the following sections.
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))
You cannot specify NULL as the explicit default value for a column and also
specify the NOT NULL constraint.
You cannot place a unique constraint on a column that already has a primary-
key constraint.
The following example creates a simple table that has a unique constraint on
one of its columns:
CREATE TABLE accounts
(acc_name CHAR(12),
acc_num SERIAL UNIQUE CONSTRAINT acc_num)
You can designate only one primary key for a table. If you define a single
column as the primary key, then it is unique by definition. You cannot
explicitly give the same column a unique constraint.
In the previous two examples, a unique constraint was placed on the column
acc_num. The following example creates this column as the primary key for
the accounts table:
CREATE TABLE accounts
(acc_name CHAR(12),
acc_num SERIAL PRIMARY KEY CONSTRAINT acc_num)
REFERENCES Clause
Use the REFERENCES clause to establish a referential relationship:
■ Within a table (that is, between two columns of the same table)
■ Between two tables (in other words, create a foreign key)
REFERENCES table
, +
( column ) ON DELETE CASCADE
The referencing column (the column being defined) is the column or set of
columns that refers to the referenced column or set of columns. The refer-
encing column(s) can contain NULL and duplicate values, but values in the
referenced column (or set of columns) must be unique.
When you use the REFERENCES clause, you must observe the following
restrictions:
■ The referenced and referencing tables must be in the same database.
■ The referenced column (or set of columns when you use the
multiple-column constraint format) must have a unique or primary-
key constraint.
■ The data types of the referencing and referenced columns must be
identical.
The only exception is that a referencing column must be an integer
data type if the referenced column is a serial.
■ You cannot place a referential constraint on a BYTE or TEXT column.
■ When you use the single-column constraint format, you can
reference only one column.
XPS ■ When you use the multiple-column constraint format, the maximum
number of columns in the REFERENCES clause is 16, and the total
length of the columns cannot exceed 380 bytes. ♦
IDS ■ When you use the multiple-column constraint format, the maximum
number of columns in the REFERENCES clause is 16, and the total
length of the columns cannot exceed 390 bytes.
■ You cannot place a referential constraint on a BLOB or CLOB
column. ♦
When you use the single-column constraint format, you do not explicitly
specify the ref_num column as a foreign key. To use the FOREIGN KEY
keyword, use the “Multiple-Column Constraint Format” on page 2-231.
If you specify this option, later when you delete a row in the parent table, the
database server also deletes any rows associated with that row (foreign keys)
in a child table. 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.
Because the ON DELETE CASCADE option is specified for the child table,
when an item from the all_candy table is deleted, the delete cascades to the
corresponding rows of the hard_candy table.
For information about syntax restrictions and locking implications when you
delete rows from tables that have cascading deletes, see “Considerations
When Tables Have Cascading Deletes” on page 2-346.
CHECK Clause
Use the CHECK clause to designate conditions that must be met before data
can be assigned to a column during an INSERT or UPDATE statement.
( Condition )
CHECK p. 4-24
Warning: When you specify a date value in a search condition, make sure you specify
4 digits for the year, so that the DBCENTURY environment variable has no effect on
the condition. When you specify a 2-digit year, the DBCENTURY environment
variable can produce unpredictable results if the condition depends on an abbreviated
year value. For more information on the DBCENTURY environment variable, see the
“IBM Informix Guide to SQL: Reference.” More generally, the database server saves
the settings of environment variables from the time of creation of check constraints.
If any of these settings are subsequently changed in a way that can affect the evalu-
ation of a condition in a check constraint, the new settings are disregarded, and the
original environment variable settings are used when the condition is evaluated.
With a BYTE or TEXT column, you can check for NULL or not-NULL values.
This constraint is the only constraint allowed on a BYTE or TEXT column.
Both acct1 and acct2 are columns of MONEY data type whose values must be
between 0 and 99999. If, however, you want to test that acct1 has a larger
balance than acct2, you cannot use the single-column constraint format. To
create a constraint that checks values in more than one column, you must use
the “Multiple-Column Constraint Format” on page 2-231.
Constraint Definition
Use the constraint definition portion of CREATE TABLE for these purposes:
IDS
CONSTRAINT constraint
ENABLED
DISABLED
WITH ERROR
If you want, you can specify a meaningful name for the constraint. The name
must be unique among the names of constraints and indexes in the database.
IDS In addition, you specify a constraint name when you change the mode of
constraint with the SET Database Object Mode statement or the SET Trans-
action Mode statement. ♦
ANSI When you create a constraint of any type, the combination of the owner name
and constraint name must be unique within the database. ♦
IDS The system catalog table that holds information about indexes is the
sysindices table. ♦
If the generated name conflicts with an existing identifier, the database server
returns an error, and you must then supply an explicit constraint name.
The generated index name in sysindexes (or sysindices) has this format:
[blankspace]<tabid>_<constraintid>
For example, the index name might be something like “ 111_14 “ (with
quotation marks used here to show the blank space).
Mode Purpose
DISABLED Does not enforce the constraint during INSERT, DELETE, and
UPDATE operations.
If you choose filtering mode, you can specify the WITHOUT ERROR or WITH
ERROR options. The following list explains these options.
To set the constraint mode after the table exists, see “SET Database Object
Mode” on page 2-652. For information about where the database server
stores rows that violate a constraint set to FILTERING, see “START VIOLA-
TIONS TABLE” on page 2-729.
UNIQUE ( column )
+ DISTINCT +
PRIMARY KEY
, Constraint
REFERENCES Definition
( column ) Clause p. 2-228
FOREIGN KEY p. 2-223
CHECK Clause
p. 2-227
When you define a unique constraint (by using the UNIQUE or DISTINCT
keyword), a column cannot appear in the constraint list more than once.
Using the multiple-column constraint format, you can perform these tasks:
When you use this format, you can create composite primary and foreign
keys, or define check constraints that compare data in different columns.
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.
This example compares two columns, acct1 and acct2, in the new table:
CREATE TABLE my_accounts
(
chk_id SERIAL PRIMARY KEY,
acct1 MONEY,
acct2 MONEY,
CHECK (0 < acct1 AND acct1 < 99999),
CHECK (0 < acct2 AND acct2 < 99999),
CHECK (acct1 > acct2)
)
In this example, the acct1 column must be greater than the acct2 column, or
the insert or update fails.
The next example creates two tables. The first table has a composite key that
acts as a primary key, and the second table has a composite key that acts as a
foreign key.
CREATE TABLE accounts (
acc_num INTEGER,
acc_type INTEGER,
acc_descr CHAR(20),
PRIMARY KEY (acc_num, acc_type))
In this example, the foreign key of the sub_accounts table, ref_num and
ref_type, references the composite key, acc_num and acc_type, in the
accounts table. If, during an insert or update, 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_num and acc_type in an existing row
in the accounts table, the database server would return an error.
Because of the default behavior of the database server, when you create the
foreign-key reference, you do not have to reference the composite-key
columns (acc_num and acc_type) explicitly. You can rewrite the references
section of the previous example as follows:
FOREIGN KEY (ref_num, ref_type) REFERENCES accounts
Options
The CREATE TABLE options let you specify storage locations, extent size,
locking modes, and user-defined access methods.
IDS + USING
LOCK MODE Access-Method
Storage Options
WITH CRCOLS Options Clause
p. 2-253 p. 2-252
p. 2-236
For most database operations, the cdrserver and cdrtime columns are
hidden. For example, if you include the WITH CRCOLS keywords when you
create a table, the cdrserver and cdrtime columns:
To view the contents of cdrserver and cdrtime, explicitly name the columns
in a SELECT statement, as the following example shows:
SELECT cdrserver, cdrtime from tablename
For more information about how to use this option, refer to the IBM Informix
Dynamic Server Enterprise Replication Guide.
Storage Options
Use the storage-option portion of CREATE TABLE to specify the storage space
and the size of the extents for the table.
EXTENT SIZE
IN dbspace IDS Options
p. 2-251
XPS dbslice PUT Clause
p. 2-249
IDS extspace
FRAGMENT BY Clause
p. 2-238
You can specify a dbspace for the table that is different from the storage
location for the database, or you can fragment the table into several dbspaces.
If you do not specify the IN clause or a fragmentation scheme, the database
server stores the table in the dbspace where the current database resides.
IDS You can use the PUT clause to specify storage options for smart large objects.
For more information, see “PUT Clause” on page 2-249.
Tip: If your table has columns that contain simple large objects (TEXT or BYTE), you
can specify a separate blobspace for each object. For information on storing simple
large objects, refer to “Large-Object Data Types” on page 4-57. ♦
For more information about how to store and manage your tables in separate
dbspaces, see your Administrator’s Guide.
To fragment a table across a dbslice, you can use either the IN dbslice syntax
or the FRAGMENT BY ROUND ROBIN IN dbslice syntax.
FRAGMENT BY Clause
Use the FRAGMENT BY clause to create fragmented tables and specify their
distribution scheme .
When you fragment a table, the IN keyword introduces the storage space
where a table fragment is to be stored.
Important: This is a deprecated feature. Use primary keys as an access method rather
than the rowid column.
You cannot use the WITH ROWIDS clause with typed tables.
XPS With Extended Parallel Server, you can specify a dbslice to fragment a table
across a group of dbspaces that share the same naming convention. For a
syntax alternative to FRAGMENT BY ROUND ROBIN IN dbslice that achieves the
same results, see “Storing Data in a dbslice” on page 2-237. ♦
IDS Use the PUT clause to specify round-robin fragmentation for smart large
objects. For more information, see the “PUT Clause” on page 2-249. ♦
Fragmenting by EXPRESSION
In an expression-based distribution scheme, each fragment expression in a rule
specifies a storage space. Each fragment expression in the rule isolates data
and aids the database server in searching for rows.
■ Range rule
A range rule specifies fragment expressions that use a range to spec-
ify which rows are placed in a fragment, as the next example shows:
FRAGMENT BY EXPRESSION c1 < 100 IN dbsp1,
c1 >= 100 AND c1 < 200 IN dbsp2, c1 >= 200 IN dbsp3
■ Arbitrary rule
An arbitrary rule specifies fragment expressions based on a pre-
defined SQL expression that typically uses 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: See the note about the DBCENTURY environment variable and date values
in fragment expressions in the section “Logging Options” on page 2-215.
For the fragmentation strategy, you can specify the abs_btree_ops operator
class in the USING clause and use its strategy functions to fragment the table,
as follows:
FRAGMENT BY EXPRESSION USING abs_btree_ops
(abs_lt(x,345)) IN dbsp1,
(abs_gte(x,345) AND abs_lte(x,500)) IN dbsp2,
(abs_gt(x,500)) IN dbsp3
An implicit, user-defined cast converts 3001 and 6000 to the opaque type.
Alternatively, you can use user-defined functions to define the range rules for
the opaque data type of the long1 column:
FRAGMENT BY EXPRESSION
(lessthan(long1,'3001')) IN dbsp1,
(greaterthanorequal(long1,'3001') AND
lessthanorequal(long,'6000')) IN dbsp2,
(greaterthan(long1,'6000')) IN dbsp3
If you do not specify a remainder, and a row is inserted or updated such that
it no longer belongs to any dbspace, the database server returns an error.
You can also specify a dbslice. When you specify a dbslice, the database server
fragments the table across the dbspaces that make up the dbslice.
When you specify a dbslice, the database server fragments the table across
the dbspaces that make up the dbslice. Similarly, if you specify a dbspace list,
the database server fragments the table across the dbspaces in that list. In the
next example, my_hybrid, distributes rows based on two columns of the
table. The value of col1 determines in which dbslice the row belongs.
The hash value of col2 determines in which dbspace (within the previously
determined dbslice) to insert into.
CREATE TABLE my_hybrid
(col1 INT, col2 DATE, col3 CHAR(10))
HYBRID (col2) EXPRESSION col1 < 100 IN dbslice1,
col1 >= 100 and col1 < 200 IN dbslice2,REMAINDER IN dbslice3
Range Range IN
HYBRID ( RANGE ( column Definition )) RANGE ( column ) Clause
p. 2-245 p. 2-245
Range Range IN
HYBRID ( RANGE ( column )) ( column Definition ) Clause
RANGE p. 2-245 p. 2-245
For hybrid strategies with two range definitions, the second column must be
different column name from the first. For hybrid strategies with exactly one
range definition, both occurrences of column must specify the same column.
If you list more than one dbslice, including a remainder dbslice, each dbslice
must contain the same number of dbspaces. Unless you are specifying the
dbspace in the REMAINDER option, you must specify at least two dbspaces.
Range Definition
Use the range definition to specify the minimum and maximum values of the
entire range.
max_val
You do not need to specify a minimum value. The minimum and maximum
values define the exact range of values to allocate for each storage space.
Range IN Clause
Use the IN clause to specify the storage spaces in which to distribute the data.
IN dbslice
, REMAINDER IN dbslice
( dbspace ) ,
( dbspace )
If you specify more than one dbslice, including a remainder dbslice, each
dbslice must contain the same number of dbspaces.
Unless you are specifying the dbspace in the REMAINDER option, the
minimum number of dbspaces that you can specify is two. The maximum
number of dbspaces that you can specify is 2,048.
The error for this example occurs because the specified range contains three
values (5, 6, and 7), but six dbspaces are specified; three values cannot be
distributed across six dbspaces.
If you do not specify a remainder and a row is inserted or updated such that
it no longer belongs to any storage space, the database server returns an error.
Restrictions
If you fragment a table with range fragmentation, you cannot perform the
following operations on the table after it is created:
■ You cannot change the fragmentation strategy (ALTER FRAGMENT).
■ You cannot rename the columns of the table (RENAME COLUMN).
■ You cannot alter the table in any way except to change the table type
or to change the lock mode.
That is, the Usage-TYPE options and the Lock Mode clause are the only valid
options of ALTER TABLE for a table that has range fragmentation.
Examples
The following examples illustrate range fragmentation in its simple and
hybrid forms.
In this example, the database server fragments the table according to the
following allocations.
db1 100 <= Col1 < 125 db3 150 <= Col1 < 175
db2 125 <= Col1 < 150 db4 175 <= Col1 < 200
The previous table shows allocations that can also be made with an
expression-based fragmentation scheme:
... FRAGMENT BY EXPRESSION
Col1 >= 100 AND Col1 < 125 IN db1
Col1 >= 125 AND Col1 < 150 IN db2
Col1 >= 150 AND Col1 < 175 IN db3
Col1 >= 175 AND Col1 < 200 IN db4
Column-Major-Range Allocation
The following example demonstrates the syntax for column-major-range
allocation, a hybrid-range fragmentation strategy:
CREATE TABLE tab2 (col2 INT, colx char (5))
FRAGMENT BY HYBRID
( RANGE (col2 MIN 100 MAX 220))
RANGE (col2)
IN dbsl1, dbsl2, dbsl3
Row-Major-Range Allocation
The following example demonstrates the syntax for row-major-range
allocation, a hybrid-range fragmentation strategy:
CREATE TABLE tab3 (col3 INT, colx char (5))
FRAGMENT BY HYBRID
( RANGE (col3) )
RANGE (col3 MIN 100 MAX 220)
IN dbsl1, dbsl2, dbsl3
Independent-Range Allocation
The following example demonstrates the syntax for an independent-range
allocation, a hybrid-range fragmentation strategy:
CREATE TABLE tab4 (col4 INT, colx char (5), col5 INT)
FRAGMENT BY HYBRID
( RANGE (col4 MIN 100 MAX 200) )
RANGE (col5 MIN 500 MAX 800)
IN dbsl1, dbsl2, dbsl3
In this type of range fragmentation, the two columns are independent, and
therefore the range allocations are independent. The range allocation for a
dbspace on both columns is the conjunctive combination of the range
allocation on each of the two independent columns.
,
( )
EXTENT SIZE kbytes
NO LOG
LOG
HIGH INTEG
The column cannot be in the form column.field. That is, the smart large object
that you are storing cannot be one field of a ROW type.
A smart large object is contained in a single sbspace. The SBSPACENAME
configuration parameter specifies the system default in which smart large
objects are created unless you specify another area.
Specifying more than one sbspace distributes the smart large objects in a
round-robin distribution scheme, so that the number of smart large objects in
each space is approximately equal. The syscolattribs system catalog table
contains one row for each sbspace that you specify in the PUT clause.
When you fragment smart large objects across different sbspaces you can
work with smaller sbspaces. If you limit the size of an sbspace, backup and
archive operations can perform more quickly. For an example that uses the
PUT clause, see “Alternative to Full Logging” on page 2-251.
Six storage options are available to store BLOB and CLOB data:
Option Purpose
HIGH INTEG Produces user-data pages that contain a page header and a page
trailer to detect incomplete writes and data corruption.
This is the default data-integrity behavior.
LOG Follows the logging procedure used with the current database log
for the corresponding smart large object. This option can generate
large amounts of log traffic and increase the risk of filling the
logical log. (See also “Alternative to Full Logging” on page 2-251.)
NO KEEP Does not record the system time when the smart large object was
ACCESS TIME last read or written. This provides better performance than the
KEEP ACCESS TIME option, and is the default tracking behavior.
If a user-defined or complex data type contains more than one large object,
the specified large-object storage options apply to all large objects in the type
unless the storage options are overridden when the large object is created.
Important: The PUT clause does not affect the storage of simple-large-object data
types (BYTE and TEXT). For information on how to store BYTE and TEXT data, see
“Large-Object Data Types” on page 4-57.
Use the NO LOG option to turn off logging. If you use NO LOG, you can
restore the smart-large-object metadata later to a state in which no structural
inconsistencies exist. In most cases, no transaction inconsistencies will exist
either, but that result is not guaranteed.
The following statement creates the greek table. Data values for the table are
fragmented into the dbs1 and dbs2 dbspaces. The PUT clause assigns the
smart-large-object data in the gamma and delta columns to the sb1 and sb2
sbspaces, respectively. The TEXT data values in the eps column are assigned
to the blb1 blobspace.
CREATE TABLE greek
(alpha INTEGER,
beta VARCHAR(150),
gamma CLOB,
delta BLOB,
eps TEXT IN blb1)
FRAGMENT BY EXPRESSION
alpha <= 5 IN dbs1, alpha > 5 IN dbs2
PUT gamma IN (sb1), delta IN (sb2)