Progress
Progress
OPENEDGE 10
2009 Progress Software Corporation and/or its subsidiaries or affiliates. All rights reserved.
These materials and all Progress software products are copyrighted and all rights are reserved by Progress Software Corporation. The information in these materials is subject to change without notice, and Progress Software Corporation assumes no responsibility for any errors that may appear therein. The references in these materials to specific platforms supported are subject to change. Actional, Apama, Apama (and Design), Artix, Business Empowerment, DataDirect (and design), DataDirect Connect, DataDirect Connect64, DataDirect Technologies, DataDirect XML Converters, DataDirect XQuery, DataXtend, Dynamic Routing Architecture, EdgeXtend, Empowerment Center, Fathom, IntelliStream, IONA, IONA (and design), Making Software Work Together, Mindreef, ObjectStore, OpenEdge, Orbix, PeerDirect, POSSENET, Powered by Progress, PowerTier, Progress, Progress DataXtend, Progress Dynamics, Progress Business Empowerment, Progress Empowerment Center, Progress Empowerment Program, Progress OpenEdge, Progress Profiles, Progress Results, Progress Software Developers Network, Progress Sonic, ProVision, PS Select, SequeLink, Shadow, SOAPscope, SOAPStation, Sonic, Sonic ESB, SonicMQ, Sonic Orchestration Server, SonicSynergy, SpeedScript, Stylus Studio, Technical Empowerment, WebSpeed, Xcalia (and design), and Your Software, Our TechnologyExperience the Connection are registered trademarks of Progress Software Corporation or one of its affiliates or subsidiaries in the U.S. and/or other countries. AccelEvent, Apama Dashboard Studio, Apama Event Manager, Apama Event Modeler, Apama Event Store, Apama Risk Firewall, AppsAlive, AppServer, ASPen, ASP-in-a-Box, BusinessEdge, Business Making Progress, Cache-Forward, DataDirect Spy, DataDirect SupportLink, Fuse, Fuse Mediation Router, Fuse Message Broker, Fuse Services Framework, Future Proof, GVAC, High Performance Integration, ObjectStore Inspector, ObjectStore Performance Expert, OpenAccess, Orbacus, Pantero, POSSE, ProDataSet, Progress ESP Event Manager, Progress ESP Event Modeler, Progress Event Engine, Progress RFID, Progress Software Business Making Progress, PSE Pro, SectorAlliance, SeeThinkAct, Shadow z/Services, Shadow z/Direct, Shadow z/Events, Shadow z/Presentation, Shadow Studio, SmartBrowser, SmartComponent, SmartDataBrowser, SmartDataObjects, SmartDataView, SmartDialog, SmartFolder, SmartFrame, SmartObjects, SmartPanel, SmartQuery, SmartViewer, SmartWindow, Sonic Business Integration Suite, Sonic Process Manager, Sonic Collaboration Server, Sonic Continuous Availability Architecture, Sonic Database Service, Sonic Workbench, Sonic XML Server, StormGlass, The Brains Behind BAM, WebClient, Who Makes Progress, and Your World. Your SOA. are trademarks or service marks of Progress Software Corporation or one of its affiliates or subsidiaries in the U.S. and other countries. Java and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. Any other trademarks contained herein are the property of their respective owners. Third party acknowledgements See the Third party acknowledgements section on page Preface6.
December 2009
For the latest documentation updates see OpenEdge Product Documentation on PSDN (http://communities.progress.com/ pcom/docs/DOC-16074).
Contents
OpenEdge SQL Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . OpenEdge SQL Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 73
OpenEdge SQL Reserved Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 OpenEdge SQL Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 OpenEdge SQL System Limits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 OpenEdge SQL System Catalog Tables . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Data Type Compatibility. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 OpenEdge SQL Language Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 OpenEdge SQL Elements and Statements in Backus Naur Form . . . . . 215 Compliance with Industry Standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 Syntax for ABL Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Java Class Reference. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 JDBC Conformance Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 OpenEdge SQL and ODBC Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Contents
SQLGetInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .289 ODBC Scalar Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .309 Embedded SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .319 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Index1
Contents2
Contents Tables Table 1: Table 2: Table 3: Table 4: Table 5: Table 6: Table 7: Table 8: Table 9: Table 10: Table 11: Table 12: Table 13: Table 14: Table 15: Table 16: Table 17: Table 18: Table 19: Table 20: Table 21: Table 22: Table 23: Table 24: Table 25: Table 26: Table 27: Table 28: Table 29: Table 30: Table 31: Table 32: Table 33: Table 34: Table 35: Table 36: Table 37: Table 38: Table 39: Table 40: Table 41: Table 42: Table 43: Table 44: Table 45: Table 46: Table 47: Table 48: Table 49: Table 50: Table 51: Table 52: Table 53: Table 54: Table 55: OpenEdge SQL reserved words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . OpenEdge SQL error codes and messages . . . . . . . . . . . . . . . . . . . . OpenEdge SQL system limits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . System tables and descriptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSTABLES core system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSCOLUMNS core system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSINDEXES core system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSCALCTABLE system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSNCHARSTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSCOLAUTH system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSCOLSTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSCOLUMNS_FULL system table . . . . . . . . . . . . . . . . . . . . . . . . . . SYSDATATYPES system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSDATESTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSDBAUTH system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSFLOATSTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSIDXSTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSINTSTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSNUMSTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSPROCBIN system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSPROCCOLUMNS system table . . . . . . . . . . . . . . . . . . . . . . . . . . SYSPROCEDURES system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSPROCTEXT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSREALSTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSSEQAUTH system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSSEQUENCES system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSSYNONYMS system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSTABAUTH system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSTABLES_FULL system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSTBLSTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSTIMESTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSTINYINTSTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSTRIGCOLS system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSTRIGGER system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSTSSTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSTSTZSTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSNVARCHARSTAT system table . . . . . . . . . . . . . . . . . . . . . . . . . . SYSVIEWS system table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYS_CHKCOL_USAGE system table . . . . . . . . . . . . . . . . . . . . . . . . . SYS_CHK_CONSTRS system table . . . . . . . . . . . . . . . . . . . . . . . . . . SYS_KEYCOL_USAGE system table . . . . . . . . . . . . . . . . . . . . . . . . . SYS_REF_CONSTRS system table . . . . . . . . . . . . . . . . . . . . . . . . . . SYS_TBL_CONSTRS system table . . . . . . . . . . . . . . . . . . . . . . . . . . ABL and corresponding OpenEdge SQL data types . . . . . . . . . . . . . . OpenEdge SQL Number Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . Date formats and descriptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Time formats and descriptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Specification formats for binary values . . . . . . . . . . . . . . . . . . . . . . . . Relational operators and resulting predicates . . . . . . . . . . . . . . . . . . . Compatibility of SQL-92 scalar functions . . . . . . . . . . . . . . . . . . . . . . . Compliance of SQL-92 DDL and DML statements . . . . . . . . . . . . . . . ABL table attributes used in OpenEdge SQL statements . . . . . . . . . . ABL column attributes used in OpenEdge SQL statements . . . . . . . . ABL index attributes used in OpenEdge SQL statements . . . . . . . . . . Argument values for DhSQLException.getDiagnostics . . . . . . . . . . . . 139 144 161 164 165 166 167 168 168 168 169 169 171 171 172 172 172 173 173 174 174 175 175 176 176 177 177 178 178 179 180 180 181 181 182 182 183 183 183 184 184 185 185 187 191 192 194 199 208 231 235 237 239 240 247
Contents3
Contents Table 56: Table 57: Table 58: Table 59: Table 60: Table 61: Table 62: Table 64: Table 65: Table 66: Table 67: Table 68: Table 69: Table 70: Allowable values for fieldType in getParam . . . . . . . . . . . . . . . . . . . . . Allowable values for fieldType in getValue . . . . . . . . . . . . . . . . . . . . . . Allowable values for fieldType in registerOutParam . . . . . . . . . . . . . . . Mapping between Java and JDBC data types . . . . . . . . . . . . . . . . . . . Mapping between JDBC and Java data types . . . . . . . . . . . . . . . . . . . Mapping between SQL-92 and Java data types . . . . . . . . . . . . . . . . . . JDBC data type conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . OpenEdge SQL and ODBC data types . . . . . . . . . . . . . . . . . . . . . . . . . Information the ODBC driver returns to SQLGetInfo . . . . . . . . . . . . . . . Scalar string functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Scalar numeric functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Date and time functions supported by ODBC . . . . . . . . . . . . . . . . . . . . Scalar system functions supported by ODBC . . . . . . . . . . . . . . . . . . . . Compliance of SQL DDL and DML statements . . . . . . . . . . . . . . . . . . . 254 255 258 269 270 270 271 287 289 310 312 313 315 348
Contents4
Contents5
Contents
Contents6
Preface
This Preface contains the following sections: Purpose Audience Organization Typographical conventions Examples of syntax diagrams (SQL) Third party acknowledgements
Preface
Purpose
OpenEdge Data Management: SQL Reference provides specific information on the OpenEdge SQL language. The reference contains information on SQL statements, functions, reserved words, error messages, data type compatibility, and the languages compliance with industry standards. The book also provides reference information on the ODBC and JDBC drivers. For the latest documentation updates see the OpenEdge Product Documentation Overview page on PSDN: http://communities.progress.com/pcom/docs/DOC-16074.
Audience
The audience of this book is composed of two groups: Database administrators will use the book to: Create and maintain databases Create, modify, and revoke user privileges Tune database performance Perform installation and setup of servers and clients
Application developers will use the book to: Manage database connections and set up data sources Create database queries Tune database queries Develop application business logic
Organization
Part I, SQL Reference OpenEdge SQL Statements Describes the purpose and syntax of each OpenEdge SQL statement. A sample is provided for each statement. OpenEdge SQL Functions Describes the purpose and syntax of each OpenEdge SQL function. A sample is provided for each function.
Preface2
Preface OpenEdge SQL Reserved Words Provides a list of words that have special syntactic meaning to OpenEdge SQL and cannot be used as identifiers for constants, variables, cursors, types, tables, records, subprograms or packages. OpenEdge SQL Error Messages Provides a list of error messages generated by the various components of OpenEdge SQL. OpenEdge SQL System Limits Provides a list of the maximum sizes for various attributes of the OpenEdge SQL database environment, and for elements of SQL queries addressed to this environment. OpenEdge SQL System Catalog Tables Provides a set of system tables for storing information about tables, columns, indexes, constraints, and privileges. This chapter describes those system catalog tables. Data Type Compatibility Addresses compatibility issues when using OpenEdge SQL and earlier versions of the database. OpenEdge SQL Language Elements Describes Standard SQL language elements that are common to OpenEdge SQL. OpenEdge SQL Elements and Statements in Backus Naur Form Presents OpenEdge SQL elements and statements in Backus Naur Form. Compliance with Industry Standards Addresses compatibility issues when using OpenEdge SQL and earlier versions of its database. Syntax for ABL Attributes Lists and describes SQL keywords to use with statements that allow you to define ABL attributes for tables and columns. Part II, JDBC Reference Java Class Reference Provides information on OpenEdge SQL Java classes and methods. JDBC Conformance Notes Provides information on mapping between JDBC and other data types and return values for database metadata.
Preface3
Preface Part III, ODBC Reference OpenEdge SQL and ODBC Data Types Shows how the OpenEdge data types are mapped to the standard ODBC data types. SQLGetInfo Describes return values to SQL GetInfo from the ODBC driver. ODBC Scalar Functions Lists scalar functions that ODBC supports and are available to use in SQL statements. Part IV, ESQL Reference Embedded SQL Provides reference information for an ESQL interface.
Typographical conventions
This manual uses the following typographical conventions:
Description Bold typeface indicates commands or characters the user types, provides emphasis, or the names of user interface elements. Italic typeface indicates the title of a document, or signifies new terms. Small, bold capital letters indicate OpenEdge key functions and generic keyboard keys; for example, GET and CTRL. A plus sign between key names indicates a simultaneous key sequence: you press and hold down the first key while pressing the second key. For example, CTRL+X. A space between key names indicates a sequential key sequence: you press and release the first key, then press another key. For example, ESCAPE H.
KEY1 KEY2
Syntax:
Fixed width
A fixed-width font is used in syntax statements, code examples, system output, and filenames. Fixed-width italics indicate variables in syntax statements. Fixed-width bold indicates variables with special emphasis. Uppercase words are ABL keywords. Although these are always shown in uppercase, you can type them in either uppercase or lowercase in a procedure.
Preface4
Preface
Convention
Description This icon (three arrows) introduces a multi-step procedure. This icon (one arrow) introduces a single-step procedure.
lowercase
Lowercase words are source language elements that are not SQL keywords. Large brackets indicate the items within them are optional. Large braces indicate the items within them are required. They are used to simplify complex syntax diagrams. A vertical bar indicates a choice. Ellipses indicate repetition: you can choose one or more of the preceding items.
[] {} | ...
RESOURCE, DBA
TO user_name
[,
user_name
] ...
This excerpt from an ODBC application invokes a stored procedure using the ODBC syntax { call procedure_name ( param ) }, where braces and parentheses are part of the language: Syntax
proc1( param, "{ call proc2 (param) }", param);
In this example, you must specify a table_name, view_name, or synonym, but you can choose only one. In all SQL syntax, if you specify the optional owner_name qualifier, there must not be a space between the period separator and table_name, view_name, or synonym: Syntax
CREATE FOR
Preface5
owner_name.]{table_name
|view_name }
WHERE search_condition
In this example, you must include one expression (expr) or column position (posn), and optionally you can specify the sort order as ascending (ASC) or descending (DESC). You can specify additional expressions or column positions for sorting within a sorted result set. The SQL engine orders the rows on the basis of the first expr or posn. If the values are the same, the second expr or posn is used in the ordering: Syntax
ORDER BY
{ [ {
expr expr
| |
posn posn
} [ } [
ASC ASC
| |
DESC DESC
] ] ] ... ]
owner_name.]view_name
[
AS
( column_name
[,
column_name
query_expression
OPTION
Preface6
Preface The Apache Software Foundation. All rights reserved (Xerces Parser (XML); and Copyright 2000-2003 The Apache Software Foundation. All rights reserved (Ant). The names Apache, Xerces, ANT, and Apache Software Foundation must not be used to endorse or promote products derived from this software without prior written permission. Products derived from this software may not be called Apache, nor may Apache appear in their name, without prior written permission of the Apache Software Foundation. For written permission, please contact [email protected]. Software distributed on an AS IS basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License agreement that accompanies the product. OpenEdge includes Concurrent Java software Copyright 1994-2000 Sun Microsystems, Inc. All Rights Reserved. -Neither the name of or trademarks of Sun may be used to endorse or promote products including or derived from the Java Software technology without specific prior written permission; and Redistributions of source or binary code must contain the above copyright notice, this notice and the following disclaimers: This software is provided "AS IS," without a warranty of any kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN MICROSYSTEMS, INC. OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN MICROSYSTEMS, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. OpenEdge includes DataDirect software Copyright 1991-2007 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved. (DataDirect Connect for JDBC Type 4 driver); Copyright 1993-2009 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved. (DataDirect Connect for JDBC); Copyright 1988-2007 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved. (DataDirect Connect for ODBC); and Copyright 1988-2007 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved. (DataDirect Connect64 for ODBC). OpenEdge includes DataDirect Connect for ODBC and DataDirect Connect64 for ODBC software, which include ICU software 1.8 and later - Copyright 1995-2003 International Business Machines Corporation and others All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, provided that the above copyright notice(s) and this permission notice appear in all copies of the Software and that both the above copyright notice(s) and this permission notice appear in supporting documentation. OpenEdge includes DataDirect Connect for ODBC and DataDirect Connect64 for ODBC software, which include software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http:/www.openssl.org/). Copyright 1998-2006 The OpenSSL Project. All rights reserved. And Copyright 1995-1998 Eric Young ([email protected]). All rights reserved.
Preface7
Preface OpenEdge includes DataDirect products for the Microsoft SQL Server database which contain a licensed implementation of the Microsoft TDS Protocol. OpenEdge includes software authored by David M. Gay. Copyright 1991, 2000, 2001 by Lucent Technologies (dtoa.c); Copyright 1991, 1996 by Lucent Technologies (g_fmt.c); and Copyright 1991 by Lucent Technologies (rnd_prod.s). Permission to use, copy, modify, and distribute this software for any purpose without fee is hereby granted, provided that this entire notice is included in all copies of any software which is or includes a copy or modification of this software and in all copies of the supporting documentation for such software. THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. OpenEdge includes software authored by David M. Gay. Copyright 1998-2001 by Lucent Technologies All Rights Reserved (decstrtod.c; strtodg.c); Copyright 1998, 2000 by Lucent Technologies All Rights Reserved (decstrtof.c; strtord.c); Copyright 1998 by Lucent Technologies All Rights Reserved (dmisc.c; gdtoa.h; gethex.c; gmisc.c; sum.c); Copyright 1998, 1999 by Lucent Technologies All Rights Reserved (gdtoa.c; misc.c; smisc.c; ulp.c); Copyright 1998-2000 by Lucent Technologies All Rights Reserved (gdtoaimp.h); Copyright 2000 by Lucent Technologies All Rights Reserved (hd_init.c). Full copies of these licenses can be found in the installation directory, in the c:/OpenEdge/licenses folder. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent or any of its entities not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. OpenEdge includes http package software developed by the World Wide Web Consortium. Copyright 1994-2002 World Wide Web Consortium, (Massachusetts Institute of Technology, European Research Consortium for Informatics and Mathematics, Keio University). All rights reserved. This work is distributed under the W3C Software License [http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231] in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. OpenEdge includes ICU software 1.8 and later - Copyright 1995-2003 International Business Machines Corporation and others All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, provided that the above copyright notice(s) and this permission notice appear in all copies of the Software and that both the above copyright notice(s) and this permission notice appear in supporting documentation.
Preface8
Preface OpenEdge includes Imaging Technology copyrighted by Snowbound Software 1993-2003. www.snowbound.com. OpenEdge includes Infragistics NetAdvantage for .NET v2009 Vol 2 Copyright 1996-2009 Infragistics, Inc. All rights reserved. OpenEdge includes JSTL software Copyright 1994-2006 Sun Microsystems, Inc. All Rights Reserved. Software distributed on an AS IS basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License agreement that accompanies the product. OpenEdge includes OpenSSL software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/). Copyright 1998-2007 The OpenSSL Project. All rights reserved. This product includes cryptographic software written by Eric Young ([email protected]). This product includes software written by Tim Hudson ([email protected]). Copyright 1995-1998 Eric Young ([email protected]) All rights reserved. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact [email protected]. Products derived from this software may not be called "OpenSSL" nor may "OpenSSL" appear in their names without prior written permission of the OpenSSL Project. Software distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License agreement that accompanies the product. OpenEdge includes Quartz Enterprise Job Scheduler software Copyright 2001-2003 James House. All rights reserved. Software distributed on an AS IS basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License agreement that accompanies the product. This product uses and includes within its distribution, software developed by the Apache Software Foundation (http://www.apache.org/). OpenEdge includes code licensed from RSA Security, Inc. Some portions licensed from IBM are available at http://oss.software.ibm.com/icu4j/. OpenEdge includes the RSA Data Security, Inc. MD5 Message-Digest Algorithm. Copyright 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. OpenEdge includes Sonic software, which includes software developed by Apache Software Foundation (http://www.apache.org/). Copyright 1999-2000 The Apache Software Foundation. All rights reserved. The names Ant, Axis, Xalan, FOP, The Jakarta Project, Tomcat, Xerces and/or Apache Software Foundation must not be used to endorse or promote products derived from the Product without prior written permission. Any product derived from the Product may not be called Apache, nor may Apache appear in their name, without prior written permission. For written permission, please contact [email protected]. OpenEdge includes Sonic software, which includes software Copyright 1999 CERN European Organization for Nuclear Research. Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. CERN makes no representations about the suitability of this software for any purpose. It is provided "as is" without expressed or implied warranty.
Preface9
Preface OpenEdge includes Sonic software, which includes software developed by ExoLab Project (http://www.exolab.org/). Copyright 2000 Intalio Inc. All rights reserved. The names Castor and/or ExoLab must not be used to endorse or promote products derived from the Products without prior written permission. For written permission, please contact [email protected]. Exolab, Castor and Intalio are trademarks of Intalio Inc. OpenEdge includes Sonic software, which includes software developed by IBM. Copyright 1995-2003 International Business Machines Corporation and others. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, provided that the above copyright notice(s) and this permission notice appear in all copies of the Software and that both the above copyright notice(s) and this permission notice appear in supporting documentation. Software distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License agreement that accompanies the product. Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder. OpenEdge includes Sonic software, which includes the JMX Technology from Sun Microsystems, Inc. Use and Distribution is subject to the Sun Community Source License available at http://sun.com/software/communitysource. OpenEdge includes Sonic software, which includes software developed by the ModelObjects Group (http://www.modelobjects.com). Copyright 2000-2001 ModelObjects Group. All rights reserved. The name ModelObjects must not be used to endorse or promote products derived from this software without prior written permission. Products derived from this software may not be called ModelObjects, nor may ModelObjects appear in their name, without prior written permission. For written permission, please contact [email protected]. OpenEdge includes Sonic software, which includes code licensed from Mort Bay Consulting Pty. Ltd. The Jetty Package is Copyright 1998 Mort Bay Consulting Pty. Ltd. (Australia) and others. OpenEdge includes Sonic software, which includes files that are subject to the Netscape Public License Version 1.1 (the License); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/NPL/. Software distributed under the License is distributed on an AS IS basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is Mozilla Communicator client code, released March 31, 1998. The Initial Developer of the Original Code is Netscape Communications Corporation. Portions created by Netscape are Copyright 1998-1999 Netscape Communications Corporation. All Rights Reserved. OpenEdge includes Sonic software, which includes software developed by the University Corporation for Advanced Internet Development http://www.ucaid.edu Internet2 Project. Copyright 2002 University Corporation for Advanced Internet Development, Inc. All rights reserved. Neither the name of OpenSAML nor the names of its contributors, nor Internet2, nor the University Corporation for Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote products derived from this software and products derived from this software may not be called OpenSAML, Internet2, UCAID, or the University Corporation for Preface10
Preface Advanced Internet Development, nor may OpenSAML appear in their name without prior written permission of the University Corporation for Advanced Internet Development. For written permission, please contact [email protected]. OpenEdge includes the UnixWare platform of Perl Runtime authored by Kiem-Phong Vo and David Korn. Copyright 1991, 1996 by AT&T Labs. Permission to use, copy, modify, and distribute this software for any purpose without fee is hereby granted, provided that this entire notice is included in all copies of any software which is or includes a copy or modification of this software and in all copies of the supporting documentation for such software. THIS SOFTWARE IS BEING PROVIDED AS IS, WITHOUT ANY EXPRESS OR IMPLIED WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR AT&T LABS MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. OpenEdge includes Vermont Views Terminal Handling Package software developed by Vermont Creative Software. Copyright 1988-1991 by Vermont Creative Software. OpenEdge includes XML Tools, which includes versions 8.9 of the Saxon XSLT and XQuery Processor from Saxonica Limited (http://www.saxonica.com/) which are available from SourceForge (http://sourceforge.net/projects/saxon/). The Original Code of Saxon comprises all those components which are not explicitly attributed to other parties. The Initial Developer of the Original Code is Michael Kay. Until February 2001 Michael Kay was an employee of International Computers Limited (now part of Fujitsu Limited), and original code developed during that time was released under this license by permission from International Computers Limited. From February 2001 until February 2004 Michael Kay was an employee of Software AG, and code developed during that time was released under this license by permission from Software AG, acting as a "Contributor". Subsequent code has been developed by Saxonica Limited, of which Michael Kay is a Director, again acting as a "Contributor". A small number of modules, or enhancements to modules, have been developed by other individuals (either written especially for Saxon, or incorporated into Saxon having initially been released as part of another open source product). Such contributions are acknowledged individually in comments attached to the relevant code modules. All Rights Reserved. The contents of the Saxon files are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use these files except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ and a copy of the license can also be found in the installation directory, in the c:/OpenEdge/licenses folder. Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. OpenEdge includes XML Tools, which includes Xs3P v1.1.3. The contents of this file are subject to the DSTC Public License (DPL) Version 1.1 (the "License"); you may not use this file except in compliance with the License. A copy of the license can be found in the installation directory, in the c:/OpenEdge/licenses folder. Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is xs3p. The Initial Developer of the Original Code is DSTC. Portions created by DSTC are Copyright 2001, 2002 DSTC Pty Ltd. All rights reserved. OpenEdge includes YAJL software Copyright 2007, Lloyd Hilaiel. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form Preface11
Preface must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of Lloyd Hilaiel nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Preface12
Part I
SQL Reference
OpenEdge SQL Statements OpenEdge SQL Functions OpenEdge SQL Reserved Words OpenEdge SQL Error Messages OpenEdge SQL System Limits OpenEdge SQL System Catalog Tables Data Type Compatibility OpenEdge SQL Language Elements OpenEdge SQL Elements and Statements in Backus Naur Form Compliance with Industry Standards Syntax for ABL Attributes
This section provides detailed information on OpenEdge SQL statements. A description for each statement provides the following information: A definition of the statement The syntax of the statements proper usage A code sample that shows how the statement works Any associated notes Authorization required in order to run the statement Related statements
Notes
You must have SQL DBA privileges to enable large keys. As of OpenEdge Release 10.1B, large index keys are supported for databases with 4,000 and 8,000 byte block sizes and are enabled by default. In Releases 10.1B and later, large index key sizes are enabled by default. However, in Releases 10.1A and earlier, this statement must be used to enable large keys.
ALTER DATABASE SET PRO_ENABLE_64BIT_SEQUENCES 'Y' If large keys are already enabled, an error message indicating such will be returned when you use the statement.
Notes
You must have SQL DBA privileges to enable 64-bit sequences. As of OpenEdge Release 10.1B, OpenEdge databases support sequences with 64-bit maximums for positive and negative numbers. In releases 10.1B and later, this feature is enabled by default. However, in Releases 10.1A and earlier, this specific ALTER DATABASE statement must be used to enable 64-bit sequences. If 64-bit sequences are already enabled, an error message indicating such will be returned when you use the statement.
ALTER SEQUENCE
The ALTER SEQUENCE statement can be used to change the current value of an existing sequence. The sequence can be in the current schema or a schema can be specified. Syntax
ALTER SEQUENCE
[schema_name.]sequence_name SET { START WITH value | INCREMENT BY value |MAXVALUE value | NOMAXVALUE | MINVALUE value |NOMINVALUE | CYCLE | NOCYCLE | CURRVAL value };
schema_name
Specifies the schema name that contains the sequence. If this is not specified, OpenEdge SQL drops the sequence, if present, from the current schema.
sequence_name
Specifies the interval between sequence numbers. The value can be a positive or negative integer (INTEGER data type for 32-bit sequences, BIGINT datatype for 64-bit sequences), but cannot be 0. The value range for a 32-bit sequence is from -2,147,483,648 to 2,147,483,647. The value range for a 64-bit sequence is from -9223372036854775808 to 9223372036854775807. If value is positive, the sequence ascends. If it is negative, the sequence descends. The default value is 1.
ALTER SEQUENCE
START WITH
Specifies the first sequence number generated. In an ascending sequence, the value must be greater than or equal to the MINVALUE. In a descending sequence, the value must be greater than or equal to the MAXVALUE. For ascending sequences, the default value is MINVALUE. For descending sequences, the default value is MAXVALUE.
MAXVALUE
Specifies the maximum value for the sequence to generate. For both 32-bit and 64-bit descending sequences, the default value is -1. For a 32-bit ascending sequence, the default value is 2,147,483,647. For a 64-bit ascending sequence, the default value is 9223372036854775807.
NOMAXVALUE
Specifies -1 as the MAXVALUE for 32-bit descending sequences and 2,147,483,647 as the MAXVALUE for 32-bit ascending sequences. Specifies -1 as the MAXVALUE for 64-bit descending sequences and 9223372036854775807 as the MAXVALUE for 64-bit ascending sequences.
MINVALUE
Specifies the minimum value the sequence can generate. For an ascending sequence, the default value is 0. For a descending sequence, the default value is -2,147,483,648 for 32-bit sequences and -9223372036854775808 for 64-bit sequences.
NOMINVALUE
Specifies 0 as the MINVALUE for ascending sequences. The MINVALUE for descending sequences is -2,147,483,648 for 32-bit sequences and -9223372036854775808 for 64-bit sequences.
CYCLE
Indicates that the sequence will continue to generate values after reaching the value assigned to MAXVALUE (if sequence ascends) or MINVALUE (if sequence descends).
NOCYCLE
Indicates that the sequence cannot generate more values after reaching the value assigned to MAXVALUE (if sequence ascends) or MINVALUE (if sequence descends). The SQL sequence generator uses NOCYCLE as the default if CYCLE is not specified.
CURRVAL
Returns the current value of the sequence. Notes It is possible to set only one attribute of a sequence at a time. Attributes START WITH, INCREMENT BY, MAXVALUE, MINVALUE and CURRVAL can take either an INTEGER or BIGINT argument, depending on whether the sequence is a 32-bit or 64-bit sequence. The following example modifies a sequence by specifying a maximum value:
ALTER TABLE
ALTER TABLE
The ALTER TABLE statement can be used to: Syntax
ALTER TABLE
Change the name of a table Change the name of a column within a table Add a column to a table Set (ABL) Advanced Business Language table, column and index attributes
owner_name.]table_name
{ADD column-definition |SET progress_table_attribute value |SET { ENCRYPT WITH cipher | DECRYPT | ENCRYPT REKEY ] |BUFFER_POOL { PRIMARY | ALTERNATE }} |ALTER [ COLUMN ]column_name { SET DEFAULT value | DROP DEFAULT | SET [NOT] NULL | SET progress_column_attribute value} | SET ENCRYPT WITH cipher | SET DECRYPT | SET ENCRYPT REKEY | SET BUFFER_POOL { PRIMARY | ALTERNATE } } |DROP COLUMN column_name { CASCADE | RESTRICT } |ADD [CONSTRAINT constraint_name ] { primary_key_definition |foreign_key_definition |uniqueness_constraint |check_constraint} [ AREA area_name ] |DROP CONSTRAINT constraint_name [ CASCADE | RESTRICT] |ALTER INDEX index_name { SET progress_index_attribute value |SET ENCRYPT WITH cipher |SET DECRYPT |SET ENCRYPT REKEY |SET BUFFER_POOL { PRIMARY | ALTERNATE }} |RENAME {table_name TO new_table_name |COLUMN column_name TO new_column_name |INDEX index_name TO new_index_name } };
The following syntax is used to define an LOB column in ALTER TABLE ADD COLUMN statement:
{ [ [ [
Notes
LVARCHAR
CLOB
LVARBINARY
BLOB
} [
( length )
] ] |
ALTERNATE PRIMARY
} ]
See the Syntax for ABL Attributes section on page 237 for a list of ABL table, column and index attributes. The ALTER TABLE ALTER INDEX statement can use two index attributes, PRO_DESCRIPTION and PRO_ACTIVE. The PRO_DESCRIPTION attribute enables the index definition to accept free-form text in the same manner as ABL. The PRO_ACTIVE attribute takes only n as an argument, thereby changing the indexs status from active to inactive. Changing an indexs status to inactive is an action that must be performed offline. For a description of the PRO_DESCRIPTION and PRO_ACTIVE attributes, see the Syntax for ABL Attributes section on page 237. Table columns defined by OpenEdge SQL have default format values identical to those created by the Data Dictionary. For details on using the ALTER TABLE ADD COLUMN statement to designate objects for buffer pool assignments, including an alternate buffer pool, see OpenEdge Data Management: Database Administration. For details on using the ALTER TABLE statement to enable transparent data encryption, see OpenEdge Getting Started: Core Business Services.
Examples
customer
In the following example, the ALTER TABLE statement is used to change the name of a table from to Customers:
In this example, the ALTER TABLE statement is used to change the name of a column within a table and the column named Address changes to Street:
In this example, table customer changes an existing 32-bit INTEGER column into a 64-bit BIGINT column:
ALTER USER Once the above statement is executed, the column will appear as a BIGINT column both internally and to applications. A statement such as this executed against a column that is not 32-bit will result in an error. In this example, ALTER TABLE adds an ABL description to a table and changes the ABL default data access index of the table:
ALTER TABLE pub.customer SET PRO_DESCRIPTION 'Sports 2000 Customers'; ALTER TABLE pub.customer SET PRO_DEFAULT_INDEX CustNumIdx;
In this example, ALTER TABLE RENAME INDEX is used to change an index named CustNum to CustomerNumberIndex:
The ALTER TABLE statement enables you to change the names of tables or columns or to add columns while your database is online servicing other requests. Other changes performed by ALTER TABLE must occur offline. Authorization Must have the DBA privilege, ownership of the table, or all the specified privileges on the table. Related statements ADD TABLE, DROP TABLE
ALTER USER
Changes the password for the specified user. Syntax
ALTER USER 'username', 'old_password', 'new_password' ;
Example
In this example, the ALTER USER statement Jasper changes the Jasper account password from normandy to brittany:
Notes
Used in conjunction with CREATE USER and DROP USER, the ALTER USER statement provides a way to change a user password. The old_password specification must match the current password for username.
AUDIT INSERT Authorization User specified in username. Related statements CREATE USER, DROP USER
AUDIT INSERT
Writes application audit events to an audit-enabled database. For more information about auditing, see OpenEdge Getting Started: Core Business Services. For more information about enabling a database for auditing, see OpenEdge Data Management: Database Administration. Syntax
AUDIT INSERT
event_id
Positive integer value corresponding to an audit event record. The event_id must be a value greater than 32000.
event_context
Free-form character value that qualifies the event_id. May include non-ASCII characters.
event_detail
Free-form character value that supplies detailed information about the audit event. May include non-ASCII characters. Notes Before inserting the specified application audit event into the database, the OpenEdge SQL engine determines the following: The connected user has been granted the audit insert privilege. The event id is valid and active.
If both of these conditions are true, the engine writes the application audit event to the database. If one or both are not true, the engine does not write the event.
AUDIT INSERT always returns a success status. This prevents users from determining whether or not they have privileges to log application audit events.
AUDIT SET
AUDIT SET
Allows grouping of audit data by the client on a per-connection basis. For more information about auditing, see OpenEdge Getting Started: Core Business Services. For more information about enabling a database for auditing, see OpenEdge Data Management: Database Administration. Syntax
AUDIT SET
string
{ EVENT_GROUP | | NULL };
APPLICATION_CONTEXT
} {
string
NULL
},
EVENT_GROUP
Indicates that subsequent audit records written by the database engine during the current connection will be marked as part of an event group.
APPLICATION_CONTEXT
Indicates that subsequent audit records written by the database engine during the current connection will be saved with application context information.
string
Free-form character value which is a unique string identifier for the group/application context event.
NULL
Free-form character value which provides additional application detail that describes the group/application context.
NULL
Clears an event group or application context string. Examples In this example, an application context is set:
Note
AUDIT SET
always returns a success status. This prevents users from determining whether or not they have audit privileges.
CALL
Invokes a stored procedure. Syntax
CALL proc_name (
parameter
][
... ]
);
proc_name
Literal or variable value to pass to the procedure. Example This example shows an excerpt from an ODBC application that calls a stored procedure (order_parts) using the ODBC syntax {call procedure_name (param)}:
SQLUINTEGER Part_num; SQLINTEGER Part_numInd = 0; // Bind the parameter. SQLBindParameter (hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &Part_num, 0, Part_numInd); // Place the department number in Part_num. Part_num = 318; // Execute the statement. SQLExecDirect(hstmt, "{call order_parts(?)}", SQL_NTS);
Authorization Must have DBA or EXECUTE privileges. Related statements CREATE PROCEDURE, DROP PROCEDURE
Column constraints
Specifies a constraint for a column that restricts the values that the column can store. INSERT, UPDATE, or DELETE statements that violate the constraint fail. The database returns a constraint violation error with an SQLCODE of -20116. Column constraints are similar to table constraints, but their definitions are associated with a single column rather than the entire table.
PRIMARY KEY
UNIQUE
] [
( column_name )
| |
REFERENCES
owner_name.]table_name
CHECK ( search_condition )
CONSTRAINT constraint_name
Allows you to assign a name for the column constraint. This option facilitates making changes to the column definition. If you do not specify a constraint_name, the database assigns a name. These names can be long and unwieldy, and you must query system tables to retrieve the name.
NOT NULL
Defines the column as the primary key for the table. There can be at most one primary key for a table. A column with the NOT NULL PRIMARY KEY constraint should not contain null or duplicate values. Other tables can name primary keys as foreign keys in their REFERENCES clauses. If they do, SQL restricts operations on the table containing the primary key in the following ways:
DROP TABLE
DELETE and UPDATE statements that modify values in the column that match a foreign
Defines the column as a unique key that cannot contain null or duplicate values. Columns with NOT NULL UNIQUE constraints defined for them are also called candidate keys. Other tables can name unique keys in their REFERENCES clauses. If they do, SQL restricts operations on the table containing the unique key.
REFERENCES table_name
column_name
Defines the column as a foreign key and specifies a matching primary or unique key in another table. The REFERENCES clause names the matching primary or unique key. A foreign key and its matching primary or unique key specify a referential constraint. A value stored in the foreign key must either be null or be equal to some value in the matching unique or primary key. You can omit the column_name argument if the table specified in the REFERENCES clause has a primary key and you want the primary key to be the matching key for the constraint.
CHECK ( search_condition )
Specifies a column-level check constraint. SQL restricts the form of the search condition. The search condition must not:
10
Column constraints Examples Refer to any column other than the one with which it is defined Contain aggregate functions, subqueries, or parameter references
The following example shows the creation of a primary key column on the supplier table:
CREATE TABLE supplier ( supp_no INTEGER CONSTRAINT supp_key_con NOT NULL PRIMARY KEY, name CHAR (30), status SMALLINT, city CHAR (20) ) ;
The following example creates a NOT NULL UNIQUE constraint to define the column ss_no as a unique key for the employee table:
CREATE TABLE employee ( empno INTEGER NOT NULL PRIMARY KEY, ss_no INTEGER NOT NULL UNIQUE, ename CHAR (19), sal NUMERIC (10, 2), deptno INTEGER NOT NULL ) ;
The following example defines order_item.orditem_order_no as a foreign key that references the primary key orders.order_no:
CREATE TABLE orders ( order_no INTEGER NOT NULL PRIMARY KEY, order_date DATE ) ; CREATE TABLE order_item ( orditem_order_no INTEGER REFERENCES orders ( order_no ), orditem_quantity INTEGER ) ;
The second CREATE TABLE statement in the previous example could have omitted the column name order_no in the REFERENCES clause, since it refers to the primary key of table orders. The following example creates a check constraint:
CREATE TABLE supplier ( supp_no INTEGER NOT NULL, name CHAR (30), status SMALLINT, city CHAR (20) CHECK (supplier.city <> 'BadApple') ) ;
If a column is defined with a UNIQUE column constraints, no error results if more than one row has a NULL value for the column.
11
COMMIT
COMMIT
Commits a transaction explicitly after executing one or more SQL statements. Committing a transaction makes permanent any changes made by the SQL statements. Syntax
COMMIT
WORK
Notes
The SQL statements executed prior to executing the COMMIT statement are executed as one atomic transaction that is recoverable and durable. The transaction is serializable if you specify this isolation level. On a system failure and/or the execution of the ROLLBACK, the transaction is rolled back to its initial state. Any changes made by the transaction are undone, restoring the database to its initial state. In the event of a system failure, the transaction will be rolled back during crash recovery when the database is restarted. A COMMIT operation makes any database modifications made by that transaction permanent. Once a COMMIT operation is executed, the database modifications cannot be rolled back. Once a COMMIT operation is executed, the transaction modifications are guaranteed durable regardless of any transient system failures. The atomicity applies only to the database modification and not to any direct I/O performed to devices such as the terminal, printer, and OS files by the application code. A COMMIT operation releases all locks implicitly or explicitly acquired by the transaction.
CONNECT AS CATALOG
Establishes a connection to an auxiliary read-only database. Syntax
CONNECT database_path AS CATALOG catalog_name;
database_path
Full path to database directory and database name. This must be contained within quotes.
catalog_name
Catalog name to be used as an alias for the database in schema, table and column references. This must be in the form of an SQL identifier.
12
CREATE INDEX Example In this example, the database named customer in directory /usr/databases is connected as a catalog named mydb1:
Notes
Used to provide read-only access to multiple databases on a single client connection to an SQL server. Once connected, the catalog name for an auxiliary database may be used in SQL statements to qualify schema, table, and column access. The catalog name is visible, and usable, only in the client-server session in which it is defined. The catalog name of the primary database is the name of the primary database. The database name is the name by which the database is started (for example, by the proserve command) omitting all file system path information. Several client-server sessions may each connect to the same auxiliary database within an entire OpenEdge SQL Server process. Each such client-server session may use the same or different name when connecting to the same auxiliary database. If you are connected to a primary database that is unencrypted and it was started using the -t startup parameter, you will be unable to simultaneously connect to an encrypted auxiliary database. An attempt to do so will result in an error.
Authorization Any user allowed to execute this statement. However, authorization for access to the auxiliary database is governed by the same rules that govern access to the primary database. That is, the username and password of the current user must be authorized using access control information in the auxiliary database. SQL Compliance Progress Software Corporation specific extension. Related statements DISCONNECT CATALOG, SET CATALOG
CREATE INDEX
Creates an index on the specified table using the specified columns of the table. An index improves the performance of SQL operations whose predicates are based on the indexed column. However, an index slows performance of INSERT, DELETE, and UPDATE operations.
13
] [
[,
...
[ [ [ [
PRO_DESCRIPTION value
UNIQUE
Does not allow the table to contain any rows with duplicate column values for the set of columns specified for that index.
index_name
... ]
The columns on which searches and retrievals will be ordered. These columns are called the index key. When more than one column is specified in the CREATE INDEX statement, a concatenated index is created.
ASC
DESC
Allows the index to be ordered as either ascending (ASC) or descending (DESC) on each column of the concatenated index. The default is ASC.
AREA area_name
The name of the storage area where the index and its entries are stored.
ENCRYPT WITH cypher
PRIMARY
ALTERNATE
{N|n}
Indicates that the index will be created as an inactive index. Inactive indexes can be created while the database is online. Examples This example illustrates how to create a unique index on a table:
14
CREATE PROCEDURE
This example shows how to create an inactive word index with the description field specified:
CREATE PRO_WORD INDEX CommentsWordIdx on pub.customer PRO_DESCRIPTION Word index on comments field PRO_ACTIVE n;
Notes
The first index you create on a table should be the most fundamental key of the table. This index (the first one created on a table) cannot be dropped except by dropping the table. An index slows performance of INSERT, DELETE, and UPDATE operations. Use PROUTIL to activate inactive indexes. Use CREATE INDEX without the PRO_ACTIVE {N|n} attribute to create active indexes. Active indexes can only be created against an online database if the following conditions are met: You run CREATE INDEX immediately after creating a table. The index is created on the newly created table. Both the CREATE TABLE and CREATE INDEX are performed within the same transaction (that is, no commit is performed after CREATE TABLE is run).
Authorization Must have DBA privilege or INDEX privilege on the table. Related statements ALTER TABLE, CREATE TABLE, DROP INDEX
CREATE PROCEDURE
Creates a stored procedure. Stored procedures contain a Java code snippet that is processed into a Java class definition and stored in the database in text and compiled form. SQL applications invoke stored procedures through the SQL CALL statement or the procedure-calling mechanisms of ODBC and JDBC.
15
owner_name.]procname
parameter_decl (
... ] ] ]
[ [
RESULT IMPORT
column_name data_type
... ]
parameter_decl
IN
OUT
INOUT
parameter_name
data_type
owner_name
Specifies the owner of the procedure. If the name is different from the user name of the user executing the statement, then the user must have DBA privileges.
procname
Names the stored procedure. DROP PROCEDURE statements specify the procedure name defined here. SQL also uses procname in the name of the Java class that it creates from the Java snippet.
IN
OUT
INOUT
Specifies whether following parameter declaration is input, output, or both. Calling applications pass values for input parameters in the CALL statement or CALL escape sequence. Stored procedures assign values to output parameters as part of their processing.
INOUT parameters have both a value passed in and receive a new value during procedure processing. parameter_name data_type
Names a parameter and associates an SQL data type with it. The data type must be one supported by OpenEdge.
RESULT ( column_name data_type
... ]
Specifies columns in the result set the procedure returns. If the CREATE PROCEDURE statement includes this clause, the Java snippet must explicitly insert rows into the result set using the Java class SQLResultSet. Note that the column_name argument is not used in the body of the stored procedure. Instead, methods of the Java classes refer to columns in the result set by ordinal number, not by name. The IMPORT keyword must be uppercase and on a separate line. The body is 16
CREATE SEQUENCE a sequence of Java statements between the BEGIN and END keywords. The Java statements become a method in a class that SQL creates and submits to the Java compiler. The BEGIN and END keywords must be uppercase and on separate lines. The following example illustrates the use of the CREATE PROCEDURE statement: Example
CREATE PROCEDURE get_sal () IMPORT import java.math.*; BEGIN StringBuffer ename = new StringBuffer (20) ; BigDecimal esal = new BigDecimal (2) ; SQLCursor empcursor = new SQLCursor ( "SELECT name, sal FROM emp " ) ; empcursor.open () ; empcursor.fetch (); while (empcursor.found ()) { ename = (StringBuffer) empcursor.getValue (1, CHAR); esal = (BigDecimal) empcursor.getValue (2, NUMERIC); // do something with the values here } empcursor.close () ; END
Note
See OpenEdge Data Management: SQL Development for more information on using the CREATE statement and stored procedures. Authorization Must have DBA privilege, RESOURCE privilege, or ownership of procedure. Related statements CALL, DROP PROCEDURE
CREATE SEQUENCE
A sequence is an object for creating an incremental number series. Sequences can generate sequential values within any integer range with either positive or negative increments. The database holds the sequence definition and keeps track of the next available value. Syntax
CREATE SEQUENCE
[schema_name.]sequence_name [INCREMENT BY value], [START WITH value], [MAXVALUE value | NOMAXVALUE], [MINVALUE value | NOMINVALUE], [CYCLE | NOCYCLE]
17
CREATE SEQUENCE
schema_name
Specifies the schema to contain the sequence. If schema_name is not specified, the sequence generator creates the sequence in the current schema. OpenEdge supports only the PUBLIC (PUB) schema.
sequence_name
Specifies the interval between sequence numbers. The value can be a positive or negative integer (INTEGER data type for 32-bit sequences, BIGINT datatype for 64-bit sequences), but cannot be 0. The value range for a 32-bit sequence is from -2,147,483,648 to 2,147,483,647. The value range for a 64-bit sequence is from -9223372036854775808 to 9223372036854775807. If value is positive, the sequence ascends. If it is negative, the sequence descends. The default value is 1.
START WITH
Specifies the first sequence number generated. In an ascending sequence, the value must be greater than or equal to the MINVALUE. In a descending sequence, the value must be greater than or equal to the MAXVALUE. For ascending sequences, the default value is MINVALUE. For descending sequences, the default value is MAXVALUE.
MAXVALUE
Specifies the maximum value for the sequence to generate. For both 32-bit and 64-bit descending sequences, the default value is -1. For a 32-bit ascending sequence, the default value is 2,147,483,647. For a 64-bit ascending sequence, the default value is 9223372036854775807.
NOMAXVALUE
Specifies -1 as the MAXVALUE for 32-bit descending sequences and 2,147,483,647 as the MAXVALUE for 32-bit ascending sequences. Specifies -1 as the MAXVALUE for 64-bit descending sequences and 9223372036854775807 as the MAXVALUE for 64-bit ascending sequences.
MINVALUE
Specifies the minimum value the sequence can generate. For an ascending sequence, the default value is 0. For a descending sequence, the default value is -2,147,483,648 for 32-bit sequences and -9223372036854775808 for 64-bit sequences.
NOMINVALUE
Specifies 0 as the MINVALUE for ascending sequences. The MINVALUE for descending sequences is -2,147,483,648 for 32-bit sequences and -9223372036854775808 for 64-bit sequences.
CYCLE
Indicates that the sequence will continue to generate values after reaching the value assigned to MAXVALUE (if sequence ascends) or MINVALUE (if sequence descends).
18
CREATE SYNONYM
NOCYCLE
Indicates that the sequence cannot generate more values after reaching the value assigned to MAXVALUE (if sequence ascends) or MINVALUE (if sequence descends). The SQL sequence generator uses NOCYCLE as the default if CYCLE is not specified. Example In the following example, a sequence is used to generate unique customer numbers when a new customer is inserted into the table pub.customer:
CREATE SEQUENCE pub.customer_sequence START WITH 100, INCREMENT BY 1, NOCYCLE;
CREATE SYNONYM
Creates a synonym for the specified table, view, or synonym. A synonym is an alias that SQL statements can use instead of the name specified when the table, view, or synonym was created. Syntax
CREATE FOR
view_name
synonym
PUBLIC
Specifies that the synonym is public: all users can refer to the name without qualifying it. By default, the synonym is private: other users must qualify the synonym by preceding it with the user name of the user who created it. Users must have the DBA privilege to create public synonyms.
SYNONYM synonym
owner_name.]
table_name
view_name
synonym
Table, view, or synonym for which SQL creates the new synonym. Example The following example demonstrates the use of the CREATE SYNONYM statement:
CREATE SYNONYM customer FOR smith.customer ; CREATE PUBLIC SYNONYM public_suppliers FOR smith.suppliers ;
19
CREATE TABLE
Creates a table definition. A table definition consists of a set of named column definitions for data values that will be stored in rows of the table. SQL provides two forms of the CREATE TABLE statement. The first syntax form explicitly specifies column definitions. The second syntax form, with the AS query_expression clause, implicitly defines the columns using the columns in a query expression. Syntax
CREATE TABLE (
owner_name.]table_name
{ [ [ [ [
;
table_constraint
}, ...)
] ] |
ALTERNATE PRIMARY
progress_table_attribute_keyword
} ] value ]
CREATE TABLE
owner_name.]table_name
[ (column_name [ NOT NULL] , ... ) ] [ AREA area_name ] [ ENCRYPT WITH cipher ] [BUFFER_POOL { PRIMARY | ALTERNATE } ]
AS query_expression ;
owner_name
Specifies the owner of the table. If the name is different from the user name of the user executing the statement, then the user must have DBA privileges.
table_name
[ COLLATE case_insensitive | case_sensitive ] [ DEFAULT { literal | NULL | SYSDATE | SYSTIME | SYSTIMESTAMP } ] [ column_constraint [ column_constraint , ... ] ] [ progress_column_attribute_keyword value [progress_column_attribute_keyword value ] ...]
data_type
20
CREATE TABLE
column_name data_type
Names a column and associates a data type with it. The column names specified must be different from other column names in the table definition. The data_type must be supported by OpenEdge. For more information on supported datatypes, see the OpenEdge SQL Language Elements section on page 189. When a table contains more than one column, a comma separator is required after each column_definition except for the final column_definition.
COLLATE
Indicates the column will be case insensitive. The word case_insensitive itself cannot be used as a valid input. The value for the case_insensitive clause here can only be _I, I, or the default database collation with the suffix _I (for example: COLLATE_I, COLLATE I, or COLLATE BASIC_I).
case_sensitive
Indicates the column will be case sensitive. The word case_sensitive itself cannot be used as a valid input. The value for the case_sensitive clause here can only be _S, S, or the default database collation with the suffix _S (for example: COLLATE_S, COLLATE S, or COLLATE BASIC_S).
DEFAULT
Specifies an explicit default value for a column. The column takes on the value if an INSERT statement does not include a value for the column. If a column definition omits the DEFAULT clause, the default value is NULL. The DEFAULT clause accepts the arguments shown in the following table:
An integer, numeric, or string constant. A null value. The current date. Valid only for columns defined with DATE data types. SYSDATE is equivalent to the Progress default keyword TODAY. The current time. A TIME value. The current date and time. A TIMESTAMP value.
SYSTIME SYSTIMESTAMP
column_constraint
Specifies a constraint that will be applied while inserting or updating a value in the associated column.
21
CREATE TABLE
progress_column_attribute_keyword value
ABL column attribute keyword and value. See the Syntax for ABL Attributes section on page 237 for a list of column attribute keywords. This is the syntax used to define an LOB column: Syntax
{ [ [ [
LVARCHAR
CLOB
LVARBINARY
BLOB
} [
( length )
] ] |
ALTERNATE PRIMARY
} ]
table_constraint
Specifies a constraint that will be applied while inserting or updating a row in the table.
AREA area_name
Specifies the name of the storage area where data stored in the table is to be stored. The storage area name must be specified within double quotes. If the specified area does not exist, the database returns an error. If you do not specify an area, the default area is used.
ENCRYPT WITH cypher
PRIMARY
ALTERNATE
ABL table attribute keyword and value. See the Syntax for ABL Attributes section on page 237 for a list of table attribute keywords.
AS query_expression
Specifies a query expression to use for the data types and data values of the tables columns. The types and lengths of the columns of the query expression result become the types and lengths of the respective columns in the table created. The rows in the resultant set of the query expression are inserted into the table after creating the table. In this form of the CREATE TABLE statement, column names are optional. If omitted, the names of the tables columns are taken from the column names of the query expression. Examples In the following CREATE TABLE supplier_item example, the user issuing the CREATE TABLE statement must have REFERENCES privilege on the itemno column of the table john.item:
22
CREATE TABLE
CREATE TABLE supplier_item ( supp_no INTEGER NOT NULL PRIMARY KEY, item_no INTEGER NOT NULL REFERENCES john.item (itemno), qty INTEGER ) ;
The table will be created in the current owner schema. The following CREATE TABLE statement explicitly specifies a table owner, gus:
CREATE TABLE account ( account integer, balance numeric (12,2), info char (84) ) ;
The following example shows the AS query_expression form of CREATE TABLE to create and load a table with a subset of the data in the customer table:
CREATE TABLE dealer (name, street, city, state) AS SELECT name, street, city, state FROM customer WHERE state IN ('CA','NY', 'TX') ;
The following example includes a NOT NULL column constraint and DEFAULT clauses for column definitions:
CREATE TABLE emp ( empno integer NOT NULL, deptno integer DEFAULT 10, join_date date DEFAULT NULL ) ;
The following example shows how to create a table with two columns, both of which have ABL descriptions and column labels specified:
CREATE TABLE emp ( empno INTEGER NOT NULL UNIQUE PRO_DESCRIPTION A unique number for each employee PRO_COL_LABEL Employee No. deptno INTEGER DEFAULT 21 NOT NULL PRO_DESCRIPTION The department number of the employee PRO_COL_LABEL Dept. No. ) PRO_HIDDEN Y PRO_DESCRIPTION All Employees;
The table itself has a description specified, and will be created as hidden. Note Table columns defined in OpenEdge SQL have default format values identical to those created by the Data Dictionary. Thus, columns created by SQL will have the same default format as columns created by ABL tools. 23
CREATE TRIGGER Authorization Must have DBA privilege, RESOURCE privilege or SELECT privilege. Related statements DROP TABLE
CREATE TRIGGER
Creates a trigger for the specified table. A trigger is a special type of automatically executed stored procedure that helps ensure referential integrity for a database. Triggers contain Java source code that can use SQL Java classes to carry out database operations. Triggers are automatically activated when an INSERT, UPDATE, or DELETE statement changes the triggers target table. The Java source code details what actions the trigger takes when it is activated. Syntax
CREATE TRIGGER
owner_name.]trigname UPDATE
{ { [ [ [
BEFORE
| |
} DELETE |
AFTER
OF column_name
[ [
... ] ] } ] }]
REFERENCING
OLDROW
,NEWROW
]|
NEWROW
,OLDROW
ROW
STATEMENT
} ]
owner_name
Specifies the owner of the trigger. If the name is different from the user name of the user executing the statement, then the user must have DBA privileges.
trigname
Names the trigger. DROP TRIGGER statements specify the trigger name defined here. SQL also uses trigname in the name of the Java class that it creates from the Java snippet.
BEFORE
AFTER
Denotes the trigger action time. The trigger action time specifies whether the triggered action, implemented by java_snippet, executes BEFORE or AFTER the invoking INSERT, UPDATE, or DELETE statement.
INSERT
|DELETE |UPDATE [
OF column_name
...] ]
Denotes the trigger event. The trigger event is the statement that activates the trigger. If UPDATE is the triggering statement, this clause can include an optional column list. Only updates to any of the specified columns will activate the trigger. If UPDATE is the triggering 24
CREATE TRIGGER statement and does not include the optional column list, then any UPDATE on the table will activate the trigger.
ON table_name
Identifies the name of the table where the trigger is defined. A triggering statement that specifies table_name causes the trigger to execute. table_name cannot be the name of a view.
REFERENCING OLDROW
NEWROW
] |
NEWROW
OLDROW
Provides a mechanism for SQL to pass row values as input parameters to the stored procedure implemented by java_snippet. The code in java_snippet uses the getValue method of the NEWROW and OLDROW objects to retrieve values of columns in rows affected by the trigger event and store them in procedure variables. This clause is allowed only if the trigger specifies the FOR EACH ROW clause. The meaning of the OLDROW and NEWROW arguments of the REFERENCING clause depends on whether the trigger event is INSERT, UPDATE, or DELETE. For example: means the triggered action can access values of columns of each row inserted. SQL passes the column values specified by the INSERT statement.
INSERT...REFERENCING OLDROW is INSERT...REFERENCING NEWROW
meaningless, since there are no existing values for a row being inserted. INSERT...REFERENCING OLDROW generates a syntax error. means the triggered action can access the values of columns, before they are changed, of each row updated. SQL passes the column values of the row as it exists in the database before the update operation. means the triggered action can access values of columns of each row deleted. SQL passes the column values of the row as it exists in the database before the delete operation.
UPDATE...REFERENCING OLDROW
DELETE...REFERENCING OLDROW
to pass for a row being deleted. DELETE...REFERENCING OLDROW generates a syntax error.
UPDATE
REFERENCING
is the only triggering statement that allows both NEWROW and OLDROW in the clause.
UPDATE...REFERENCING NEWROW
means the triggered action can access the values of columns, after they are changed, of each row updated. SQL passes the column values specified by the UPDATE statement.
The trigger action time (BEFORE or AFTER) does not affect the meaning of the
REFERENCING clause. For instance, BEFORE UPDATE...REFERENCING NEWROW still means
the values of columns after they are updated will be available to the triggered action. The REFERENCING clause generates an error if the trigger does not include the FOR EACH ROW clause.
FOR EACH
ROW
STATEMENT
CREATE TRIGGER
FOR EACH ROW means the triggered action executes once for each row being updated by the
triggering statement. CREATE TRIGGER must include the FOR EACH ROW clause if it also includes a REFERENCING clause.
FOR EACH STATEMENT
means the triggered action executes only once for the whole triggering statement. FOR EACH STATEMENT is the default.
java_import_clause
IMPORT
Specifies standard Java classes to import. The IMPORT keyword must be uppercase and on a separate line.
BEGIN
java_snippet END Denotes the body of the trigger or the triggered action. The body contains the Java source code that implements the actions to be completed when a triggering statement specifies the target table. The Java statements become a method in a class that SQL creates and submits to the Java compiler. The BEGIN and END keywords must be uppercase and on separate lines. Notes Triggers can take action on their own table so that they invoke themselves. SQL limits such recursion to five levels. You can you have multiple triggers on the same table. Multiple UPDATE triggers on the same table must specify different columns. SQL executes all triggers applicable to a given combination of table, trigger event, and action time. The actions carried out by a trigger can fire another trigger. When this happens, the other triggers actions execute before the rest of the first trigger finishes executing. If a constraint and trigger are both invoked by a particular SQL statement, SQL checks constraints first, so any data modification that violates a constraint does not also fire a trigger. To modify an existing trigger, you must delete it and issue another CREATE TRIGGER statement. You can query the systrigger system table for information about the trigger before you delete it. The code in java_snippet uses the getValue method of the NEWROW and OLDROW objects. The
getValue method is valid on OLDROW before or after an update or delete and NEWROW before
or after an update or insert; the setValue method is only valid on NEWROW before an insert or update. Example The following code segment illustrates how to use the CREATE TRIGGER statement:
26
CREATE USER
CREATE TRIGGER TRG_TEST04 BEFORE INSERT ON tst_trg_01 REFERENCING NEWROW FOR EACH ROW IMPORT import java.sql.*; BEGIN //Inserting Into tst_trg_03 Integer new_value=newInteger(0); new_value=(Integer)NEWROW.getValue (1,INTEGER); SQLIStatement insert_tst3=new SQLIStatement ("INSERT INTO tst_trg_03 values (?)"); insert_tst3.setParam (1,new_value); insert_tst3.execute(); END
The following code segment illustrates how to set values for a new row in the CREATE TRIGGER statement:
CREATE TRIGGER trg1403 BEFORE INSERT ON tbl1401 REFERENCING NEWROW FOR EACH ROW IMPORT import java.sql.* ; BEGIN INTEGER n2 = new INTEGER(12345); NEWROW.setValue(2, n2); END
For more information on creating and using triggers, see OpenEdge Data Management: SQL Development. Authorization Must have the DBA privilege or RESOURCE privilege. Related statements DROP TRIGGER
CREATE USER
Creates the specified user. Syntax
CREATE USER 'username', 'password' ;
Example
In this example an account with DBA privileges creates the username Jasper with password spaniel: 27
CREATE VIEW
Notes
You are strongly advised to NOT create a user named PUB. A user named PUB is inherently the owner of all tables created in the ABL and all schema tables, since these are all in the PUB schema. As the owner, a user PUB has full access to those tables, including the ability to read and write data, and the ability to drop the application table. Therefore, the existence of a user PUB creates a very serious security risk for the database. For these reasons, please do NOT create a user named PUB. Used in conjunction with BEGIN-END DECLARE SECTION and DROP USER statement, the statement provides a way to manage user records through SQL.
CREATE USER
The user name and password must be enclosed in quotes. Before issuing the CREATE USER statement, there are no users defined in the user table and any user can log into the database. After issuing the CREATE USER statement, only users defined in the user table can log into the database.
Authorization Must have DBA privileges. Related statements BEGIN-END DECLARE SECTION, DROP USER
CREATE VIEW
Creates a view with the specified name on existing tables or views. Syntax
CREATE VIEW
owner_name.]view_name
[
AS
( column_name, column_name,... )
query_expression
owner_name
Specifies column names for the view. These names provide an alias for the columns selected by the query specification. If the column names are not specified, then the view is created with the same column names as the tables or views on which it is based.
28
CREATE VIEW
WITH CHECK OPTION
Checks that the updated or inserted row satisfies the view definition. The row must be selectable using the view. The WITH CHECK OPTION clause is only allowed on an updatable view. Notes A view is deletable if deleting rows from that view is allowed. For a view to be deletable, the view definition must satisfy the following conditions: The first FROM clause contains only one table reference or one view reference. There are no aggregate functions, DISTINCT clause, GROUP BY clause, or HAVING clause in the view definition. If the first FROM clause contains a view reference, then the view referred to is deletable.
A view is updatable if updating rows from that view is allowed. For a view to be updatable, the view has to satisfy the following conditions: The view is deletable (it satisfies all the previously specified conditions for deletability). All the select expressions in the first SELECT clause of the view definition are simple column references. If the first FROM clause contains a view reference, then the view referred to is updatable.
A view is insertable if inserting rows into that view is allowed. For a view to be insertable, the view has to satisfy the following conditions: The view is updatable (it satisfies all the previously specified conditions for update ability). If the first FROM clause contains a table reference, then all NOT NULL columns of the table are selected in the first SELECT clause of the view definition. If the first FROM clause contains a view reference, then the view referred to is insertable.
Example
The following examples illustrate CREATE VIEW statements defined by query expressions:
CREATE VIEW ne_customers AS SELECT name, address, city, state FROM customer WHERE state IN ( 'NH', 'MA', 'ME', 'RI', 'CT', 'VT' ) WITH CHECK OPTION ; CREATE VIEW OrderCount (custnum, numorders) AS SELECT CustNum, COUNT(*) FROM Order GROUP BY CustNum;
29
DELETE Authorization Must have DBA privilege, RESOURCE privilege, or SELECT privilege. Related statements DROP VIEW
DELETE
Deletes zero, one, or more rows from the specified table that satisfy the search condition specified in the WHERE clause. If the optional WHERE clause is not specified, then the DELETE statement deletes all rows of the specified table. Syntax
DELETE FROM
owner_name.]
[
Example
WHERE search_condition
{ table_name | ] ;
view_name
Note
If the table has primary or candidate keys and there are references from other tables to the rows to be deleted, the statement is rejected. Authorization Must have DBA privilege, ownership of the table, or DELETE permission of the table. Related statements WHERE clause
DISCONNECT CATALOG
Removes a connection to an auxiliary read-only database. Syntax
DISCONNECT CATALOG catalog_name;
catalog_name
Catalog name to be used as an alias for the database in schema, table and column references. This must be in the form of an SQL identifier. Example In this example, the auxiliary database connection identified by the catalog named mydb1 is removed:
30
DROP INDEX
Note
Used to remove auxiliary connections established by executing the CONNECT AS CATALOG statement. Authorization Any user is allowed to execute this statement. SQL Compliance Progress Software Corporation specific extension Related statements CONNECT AS CATALOG, SET CATALOG
DROP INDEX
Deletes an index on the specified table. Syntax
DROP INDEX ON
index_owner_name.]index_name ;
table_owner_name.]table_name
index_owner_name
Specifies the name of the index owner. If index_owner_name is specified and is different from the name of the user executing the statement, then the user must have DBA privileges.
table_name
Verifies the index_name to correspond to the table. Example The following example illustrates the DROP INDEX statement:
You cannot drop the first index created on a table, except by dropping the table. Authorization Must have DBA privilege or ownership of the index. Related statements CREATE INDEX
31
DROP PROCEDURE
DROP PROCEDURE
Deletes a stored procedure. Syntax
DROP PROCEDURE
owner_name.]procedure_name ;
owner_name
Name of the stored procedure to delete. Example The following example illustrates the DROP PROCEDURE statement:
Authorization Must have DBA privilege or owner of a stored procedure. Related statement CALL, CREATE PROCEDURE
DROP SEQUENCE
The DROP SEQUENCE statement removes a sequence from a schema. The sequence can be in a users schema or another schema may be specified. You must have DBA privileges to remove a sequence in a schema other than your own. Syntax
DROP SEQUENCE
schema_name.
sequence_name
schema_name
Specifies the schema name that contains the sequence. If this is not specified, OpenEdge SQL drops the sequence, if present, from the current schema.
sequence_name
Specifies the sequence to be dropped. Example The following is an example of the DROP SEQUENCE statement:
32
DROP SYNONYM
DROP SYNONYM
Drops the specified synonym. Syntax
DROP
PUBLIC
SYNONYM synonym ;
PUBLIC
Specifies that the synonym was created with the PUBLIC argument.
SYNONYM synonym
Name for the synonym. Example The following is an example of the DROP SYNONYM statement:
Notes
If DROP SYNONYM specifies PUBLIC and the synonym was not a public synonym, SQL generates the base table not found error. If DROP SYNONYM does not specify PUBLIC and the synonym was created with the PUBLIC argument, SQL generates the base table not found error.
Authorization Must have DBA privilege or ownership of the synonym (for DROP SYNONYM). Related statement CREATE SYNONYM
DROP TABLE
Deletes the specified table. Syntax
DROP TABLE
owner_name.]table_name ;
owner_name
Names the table to drop. Example The following is an example of the DROP TABLE statement: 33
DROP TRIGGER
Notes
If owner_name is specified and is different from the name of the user executing the statement, then the user must have DBA privileges. When a table is dropped, the indexes on the table and the privileges associated with the table are dropped automatically. Views dependent on the dropped table are not automatically dropped, but become invalid. If the table is part of another table's referential constraint (if the table is named in another tables REFERENCES clause), the DROP TABLE statement fails. You must DROP the referring table first.
Authorization Must have DBA privilege or ownership of the table. Related statement CREATE TABLE
DROP TRIGGER
Deletes a trigger. Syntax
DROP TRIGGER
owner_name.]trigger_name ;
owner_name
Names the trigger to drop. Example The following is an example of the DROP TRIGGRER statement:
Authorization Must have DBA privilege or ownership of the trigger. Related statement CREATE TRIGGER
34
DROP USER
DROP USER
Deletes the specified user. Syntax
DROP USER 'username' ; 'username'
Specifies the user name to delete. The username must be enclosed in quotes. Example In this example, an account with DBA privileges drops the username Jasper:
Authorization Must have DBA privileges. Related statements BEGIN-END DECLARE SECTION, CREATE USER
DROP VIEW
Deletes the view from the database. Syntax
DROP VIEW
owner_name.]view_name ;
owner_name
Names the view to drop. Example The following is an example of the DROP VIEW statement:
Notes
If owner_name is specified and is different from the name of the user executing the statement, then the user must have DBA privileges. When a view is dropped, other views that are dependent on this view are not dropped. The dependent views become invalid.
35
GRANT Authorization Must have DBA privilege or ownership of the view. Related statement CREATE VIEW
GRANT
Grants various privileges to the specified users of the database. There are two forms of the GRANT statement: Grant database-wide privileges, such as system administration (DBA), general creation (RESOURCE), audit administration (AUDIT_ADMIN), audit archive (AUDIT_ARCHIVE), or audit insert (AUDIT_INSERT). Grant various privileges on specific tables and views. Privilege definitions are stored in the system tables SYSDBAUTH, SYSTABAUTH, and SYSCOLAUTH for the database, tables, and columns, respectively. You must use separate commands to grant DBA or RESOURCE privileges with any of the privileges. Using the same command to grant a user with DBA or RESOURCE privileges and any of the AUDIT privileges results in an error.
AUDIT
Note:
Syntax
GRANT
TO username
, username
...
[
Examples
];
In this example, audit administration and audit archive privileges are granted to bsmith:
Because these privileges are granted to bsmith WITH GRANT OPTION, bsmith may now grant these two privileges to other users. This is the syntax to grant privileges on specific tables and views: Syntax
GRANT { privilege ON table_name TO
[,
privilege username
]
,
... |
ALL
PRIVILEGES]
username
[,
... |
PUBLIC
GRANT Syntax
SELECT
INSERT
DELETE
INDEX
| |
UPDATE
( column , column ,
REFERENCES
( column ,
[,user_name]...
Allows specified user to modify data for the sequence. In this example, the sequence generator grants user slsadmin the ability to modify the customer number sequence:
GRANT UPDATE ON SEQUENCE pub.customer_sequence TO slsadmin;
The following syntax is a variation on the GRANT statement that enables the user to execute stored Java procedures: Syntax
GRANT EXECUTE ON StoredJavaProcedureName () TO
username
[,
username
Allows the specified users to create, access, modify, or delete any database object, and to grant other users any privileges.
TO username
, username
...
Grants the specified privileges on the table or view to the specified list of users.
37
GRANT
SELECT
Allows the specified users to read data from the table or view.
INSERT
Allows the specified users to add new rows to the table or view.
DELETE
Allows the specified users to delete rows from the table or view.
INDEX
column
column
...
Allows the specified users to modify existing rows in the table or view. If followed by a column list, the users can modify values only in the columns named.
REFERENCES
( column
column
...
Allows the specified users to refer to the table from other tables constraint definitions. If followed by a column list, constraint definitions can refer only to the columns named. For more detail on constraint definitions, see the Column constraints and Table constraints entries of this section.
ALL
Grants the specified privileges on the table or view to any user with access to the system.
WITH GRANT OPTION
Allows the specified users to grant their privileges or a subset of their privileges to other users. The following example illustrates the GRANT statement:
If the username specified in a RESOURCE or DBA GRANT operation does not already exist, the GRANT statement creates a row in the SYSDBAUTH system table for the new username. This row is not deleted by a subsequent REVOKE operation. Authorization Must have the DBA privilege, ownership of the table, or all the specified privileges on the table (granted with the WITH GRANT OPTION clause). Must have the DBA privilege or AUDIT_ADMIN WITH GRANT privilege to grant auditing privileges. 38
INSERT
Inserts new rows into the specified table or view that will contain either the explicitly specified values or the values returned by the query expression. Syntax
INSERT INTO
[ {
Examples
( column_name VALUES (
owner_name.]{table_name|view_name
INSERT INTO customer (cust_no, name, street, city, state) VALUES (1001, 'RALPH', '#10 Columbia Street', 'New York', 'NY') ; INSERT INTO neworders (order_no, product, qty) SELECT order_no, product, qty FROM orders WHERE order_date = SYSDATE ;
Notes
If the optional list of column names is specified, then only the values for those columns are required. The rest of the columns of the inserted row will contain NULL values, provided that the table definition allows NULL values and there is no DEFAULT clause for the columns. If a DEFAULT clause is specified for a column and the column name is not present in the optional column list, then the column is given the default value. If the optional list is not specified, then the column values must be either explicitly specified or returned by the query expression. The order of the values should be the same as the order in which the columns are declared in the declaration of the table or view. The VALUES (...) form for specifying the column values inserts one row into the table. The query expression form inserts all the rows from the query results. A SELECT statement utilizing a NOLOCK hint can be used within an INSERT statement. For example:
PUB.ARCHIVE_CUST
WHERE ...
WITH (NOLOCK);
For more information using the NOLOCK hint in a SELECT statement, see SELECT section on page 45. can be used if If the table contains a foreign key and there is no corresponding primary key that matches the values of the foreign key in the record being inserted, then the insert operation is rejected. 39
LOCK TABLE Authorization Must have DBA privilege, ownership of the table, INSERT privilege on the table, or SELECT privilege on all the tables or views referred to in the query_expression, if a query_expression is specified. Related statements REVOKE
LOCK TABLE
Explicitly locks one or more specified tables for shared or exclusive access. Syntax
LOCK TABLE table_name IN
, table_name
...
SHARE
EXCLUSIVE
MODE ;
table_name
The table in the database that you want to lock explicitly. You can specify one table or a comma-separated list of tables.
SHARE MODE
Allows all transactions to read the tables. Prohibits all other transactions from modifying the tables. After you acquire an explicit lock on a table in SHARE MODE, any SELECT statements in your transaction can read rows and do not implicitly acquire individual record locks. Any INSERT, UPDATE, and DELETE statements do acquire record locks.
EXCLUSIVE MODE
Allows the current transaction to read and modify the tables, and prohibits any other transactions from reading or modifying the tables. After you acquire an explicit lock on a table in EXCLUSIVE MODE, you can SELECT, INSERT, UPDATE, and DELETE rows, and your transaction does not implicitly acquire individual record locks for these operations. Examples Unless another transaction holds an EXCLUSIVE lock on the teratab and megatab tables, the
SHARE MODE example explicitly locks the tables. The shared lock allows all transactions to read
the tables. Only the current transaction can modify the tables, as shown in the following example:
Unless another transaction holds a lock on the teratab table, the EXCLUSIVE MODE example locks the teratab table for exclusive use by the current transaction. No other transactions can read or modify the teratab table, as shown in the following example:
40
LOCK TABLE Without a table lock, the first SELECT statement in the following example could exceed the limits of the record lock table, while the LOCK TABLE statement prevents the subsequent SELECT statement from consuming the record lock table:
-- Without a table lock, this SELECT statement creates an -- entry in the record lock table for every row in teratab. SELECT COUNT (*) FROM teratab ; -- The LOCK TABLE IN SHARE MODE operation preserves the -- record lock table resource. LOCK TABLE teratab IN SHARE MODE ; SELECT COUNT (*) FROM teratab ;
Notes
The LOCK TABLE statement might encounter a locking conflict with another transaction. The SHARE MODE option detects a locking conflict if another transaction: Locked the table in EXCLUSIVE MODE and has not issued a COMMIT or ROLLBACK Inserted, updated, or deleted rows in the table and has not issued a COMMIT or
ROLLBACK
The EXCLUSIVE MODE option detects a locking conflict if another transaction: Locked the table in SHARE MODE or EXCLUSIVE MODE and has not issued a COMMIT or
ROLLBACK
Read from, inserted, updated, or deleted rows and has not issued a COMMIT or
ROLLBACK
When there is a locking conflict, the transaction is suspended and the database returns an error. You might configure the time at which the transaction is suspended. The default is five seconds. You can use explicit table locking to improve the performance of a single transaction, at the cost of decreasing the concurrency of the system and potentially blocking other transactions. It is more efficient to lock a table explicitly if you know that the transaction will be updating a substantial part of a table. You gain efficiency by decreasing the overhead of the implicit locking mechanism, and by decreasing any potential wait time for acquiring individual record locks on the table. You can use explicit table locking to minimize potential deadlocks in situations where a transaction is modifying a substantial part of a table. Before making a choice between explicit or implicit locking, compare the benefits of table locking with the disadvantages of losing concurrency. The database releases explicit and implicit locks only when the transaction ends with a or ROLLBACK operation.
COMMIT
41
REVOKE
Revokes various privileges from the specified users of the database. There are two forms of the REVOKE statement: Revoke database-wide privileges, either system administration (DBA), general creation (RESOURCE), audit administration (AUDIT_ADMIN), audit archive (AUDIT_ARCHIVE), or audit insert (AUDIT_INSERT) Revoke various privileges on specific tables and views
Syntax
REVOKE FROM
{ {
, username
... }
[ [
RESTRICT
GRANTED BY
] ANY_USER ];
CASCADE
RESOURCE
Revokes from the specified users the privilege to issue CREATE statements.
DBA
Revokes from the specified users the privilege to create, access, modify, or delete any database object, and revokes the privilege to grant other users any privileges.
AUDIT_ADMIN
Revokes from the specified users the privilege to administrate and maintain a database auditing system.
AUDIT_ARCHIVE
Revokes from the specified users the privilege to read and delete audit records.
AUDIT_INSERT
Revokes from the specified users the privilege to insert application audit records.
FROM username
username
...
Revokes the specified privileges on the table or view from the specified list of users.
RESTRICT
CASCADE
Prompts SQL to check to see if the privilege being revoked was passed on to other users. This is possible only if the original privilege included the WITH GRANT OPTION clause. If so, the REVOKE statement fails and generates an error. If the privilege was not passed on, the REVOKE statement succeeds.
42
REVOKE If the REVOKE statement specifies CASCADE, revoking the access privileges from a user also revokes the privileges from all users who received the privilege from that user. If the REVOKE statement specifies neither RESTRICT nor CASCADE, the behavior is the same as for CASCADE. Note is not supported for AUDIT_ADMIN, AUDIT_ARCHIVE, and AUDIT_INSERT privileges. The only user who can revoke an audit privilege is the user who granted it.
GRANTED BY ANY_USER CASCADE
A DBA can use this phrase to revoke all access privileges to a table for a specified user, even if the user was the creator of the table. This phrase is only available to those users with DBA privileges.
Example
This is the syntax to revoke privileges on specific tables and views: Syntax
REVOKE
[ {
] ]
; ,
... | ]
,
ALL
PRIVILEGES
] }
, username
... |
PUBLIC
RESTRICT
CASCADE
Revokes the GRANT option for the privilege from the specified users. The actual privilege itself is not revoked. If specified with RESTRICT, and the privilege is passed on to other users, the REVOKE statement fails and generates an error. Otherwise, GRANT OPTION FOR implicitly revokes any privilege the user might have given to other users.
privilege
SELECT
INSERT
DELETE
INDEX ;
| |
privilege
UPDATE
( column , column ,
REFERENCES
( column ,
, privilege
... |
PRIVILEGES
List of privileges to be revoked. See the description in the GRANT statement. Revoking RESOURCE and DBA privileges can only be done by the administrator or a user with DBA privileges. 43
ROLLBACK If more than one user grants access to the same table to a user, then all the grantors must perform a revoke for the user to lose access to the table. Using the keyword ALL revokes all the privileges granted on the table or view.
FROM PUBLIC
Revokes the specified privileges on the table or view from any user with access to the system.
RESTRICT
CASCADE
Prompts SQL to check to see if the privilege being revoked was passed on to other users. This is possible only if the original privilege included the WITH GRANT OPTION clause. If so, the REVOKE statement fails and generates an error. If the privilege was not passed on, the REVOKE statement succeeds. If the REVOKE statement specifies CASCADE, revoking the access privileges from a user also revokes the privileges from all users who received the privilege from that user. If the REVOKE statement specifies neither RESTRICT nor CASCADE, the behavior is the same as for CASCADE. Example In this example, REVOKE is used on INSERT and DELETE privileges:
REVOKE INSERT ON customer FROM dbuser1 ; REVOKE DELETE ON cust_view FROM dbuser2 ;
If the username specified in a GRANT DBA or GRANT RESOURCE operation does not already exist, the GRANT statement creates a row in the SYSDBAUTH system table for the new username. This row is not deleted by a subsequent REVOKE operation. Authorization Must have the DBA privilege or ownership of the table (to revoke privileges on a table). To revoke audit privileges, the user must have the DBA privilege or AUDIT ADMINISTRATION WITH GRANT privilege and be the user who granted the audit privilege. Related statement GRANT
ROLLBACK
Ends the current transaction and undoes any database changes performed during the transaction. Syntax
ROLLBACK
WORK
Notes 44
Under certain circumstances, SQL marks a transaction for abort but does not actually roll it back immediately. Without an explicit ROLLBACK, any subsequent updates do not take
SELECT effect. A COMMIT statement causes SQL to recognize the transaction as marked for abort and instead implicitly rolls back the transaction. SQL marks a transaction for abort in the event of a hardware or software system failure. This transaction is rolled back during recovery.
SELECT
Selects the specified column values from one or more rows contained in the tables or views specified in the query expression. The selection of rows is restricted by the WHERE clause. The temporary table derived through the clauses of a select statement is called a result table. Syntax
SELECT
ALL
DISTINCT
] [ TOP
| { table_name | alias.} * [ , { table_name.| alias.} * ] ... | expr [ [ AS ] [ ] column_title [ ] ] [, expr [ [ AS ] [ ] column_title [ ] ] ] ... [,
table_ref NO REORDER
}
FROM table_ref
] ... [ { [ WHERE search_condition ] [ GROUP BY [ table.]column_name [, [ [ HAVING search_condition ] ; [ORDER BY ordering_condition ] [WITH locking_hints ] [FOR UPDATE update_condition ]
table.]column_name ]
column_list
SELECT
GROUP BY grouping_condition
See the FOR UPDATE clause section on page 56. Authorization Must have DBA privilege or SELECT permission on all the tables or views referred to in the query_expression. Related statements INSERT, DELETE
COLUMN_LIST clause
Specifies which columns to retrieve by the SELECT statement. Syntax
| DISTINCT ] { * | { table_name | alias.}* [ , { table_name.| alias.} * ] ... | expr [ [ AS ] [ ' ] column_title [ ' ] ] [, expr [ [ AS ] [ ' ] column_alias [ ' ] ] ] ... | [ table| alias.]column_name , ... ]
ALL
} [
ALL
DISTINCT
Indicates whether a result table omits duplicate rows. ALL is the default and specifies that the result table includes all rows. DISTINCT specifies that a table omits duplicate rows.
*
| {
table_name.
alias.
Specifies that the result table includes all columns from all tables named in the FROM clause.
46
SELECT
* expr
[ [
AS
] [
'
column_alias
'
] ]
Specifies a list of expressions, called a select list, whose results will form columns of the result table. Typically, the expression is a column name from a table named in the FROM clause. The expression can also be any supported mathematical expression, scalar function, or aggregate function that returns a value. The optional column_alias argument specifies a new heading for the associated column in the result table. You can also use the column_title in an ORDER BY clause. Enclose the new title in single or double quotation marks if it contains spaces or other special characters, including hyphens. Note: A table alias cannot be used to qualify a column alias. A column alias can only be used without a qualifier because it is not a part of any table definition.
table
alias.]column_name ,
... ]
Specifies a list columns from a particular table or alias. Examples Both these statements return all the columns in the customer table to the select list:
The table_name.* syntax is useful when the select list refers to columns in multiple tables and you want to specify all the columns in one of those tables. For example:
The following example illustrates using the column_alias option to change the name of the column:
47
SELECT
-- Illustrate optional 'column_title' syntax SELECT FirstName AS 'First Name', LastName AS 'Last Name', state AS 'New England State' FROM Employee WHERE state = 'NH' OR state = 'ME' OR state = 'MA' OR state = 'VT' OR state = 'CT' OR state = 'RI'; First Name ---------------Justine Andy Marcy Larry John Mark Stacey Scott Meredith Heather Last Name ---------------Smith Davis Adams Dawsen Burton Hall Smith Abbott White White New England State -----------------MA MA MA MA NH NH MA MA NH NH
You must qualify a column name if it occurs in more than one table specified in the FROM clause, as shown:
-- Table name qualifier required -- Customer table has city and state columns -- Billto table has city and state columns SELECT Customer.CustNum, Customer.City AS 'Customer City', Customer.State AS 'Customer State', Billto.City AS 'Bill City', Billto.State AS 'Bill State' FROM Customer, Billto WHERE Customer.City = 'Clinton'; CustNum Customer City Customer State Bill City Bill State -------- ---------------- ---------------- ------------------------------1272 Clinton MS Montgomery AL 1272 Clinton MS Atlanta GA 1421 Clinton SC Montgomery AL 1421 Clinton SC Atlanta GA 1489 Clinton OK Montgomery AL 1489 Clinton OK Atlanta GA
When there is a conflict between a SELECT list alias and an actual database column, OpenEdge SQL interprets the reference as the database column. Note the following example:
SELECT substring (state, 1, 2) state, sum (balance) FROM pub.customer GROUP BY state;
48
SELECT In the above query, state is ambiguous because it can refer to either database column pub.customer.state or the result of the substring scalar function in the SELECT list. The ANSI standard requires that state refers unambiguously to the database column, therefore, the query groups the result by the database column. The same principle holds true for ambiguous references that appear in WHERE, ON, and HAVING clauses.
TOP clause
Limits the rows returned by an OpenEdge SQL query at the statement level. Syntax
TOP n
When the TOP clause is specified, the OpenEdge SQL server returns the maximum number of rows specified in the clause. The maximum number allowed for the TOP clause is 2,147,483,647.
Example
In the following example, the SELECT statement returns the names of the five customers with the highest account balance:
The TOP clause is only allowed in a top-level SELECT statement. Therefore, the TOP clause cannot be used in the following instances: As part of a subquery When derived tables are used in the query Within the CREATE TABLE, CREATE VIEW, UPDATE, and INSERT statements In queries used with set operators such as UNION, INTERSECT, and MINUS
In instances when the server performs aggregation on the result set (i.e., through an aggregate function such as SUM or MAX, a GROUP BY clause, or the DISTINCT keyword) the TOP clause should be interpreted as being applied last. When there is no aggregation in the SELECT statement and the result set is also sorted, then SQL will optimize sorting in order to increase query performance.
SELECT TOP
is the functional equivalent of the Oracle ROWNUM functionality. Note that SELECT
TOP is defined simply in terms of a limit on the result set size, and the optimizer determines how
to use this limit for best data access. Thus, SELECT TOP does not have all the "procedural rules" used to define the meaning of the Oracle ROWNUM phrase.
49
SELECT
FROM clause
Specifies one or more table references. Each table reference resolves to one table (either a table stored in the database or a virtual table resulting from processing the table reference) whose rows the query expression uses to create the result table. Syntax
FROM table_ref
[,
table_ref
] ... [ {
NO REORDER
} ]
table_ref
There are three forms of table references: A direct reference to a table, view, or synonym A derived table specified by a query expression in the FROM clause A joined table that combines rows and columns from multiple tables
If there are multiple table references, SQL joins the tables to form an intermediate result table that is used as the basis for evaluating all other clauses in the query expression. That intermediate result table is the Cartesian product of rows in the tables in the FROM clause, formed by concatenating every row of every table with all other rows in all tables, as shown in the following syntax: Syntax
table_name
AS
] [
alias
( column_alias alias
[ ... ]
| ( query_expression ) [ AS ] | [ ( ] joined_table [ ) ]
FROM table_name
(column_alias
]] [ ... ]
AS
] [
alias
( column_alias
[ ... ]
] ]
Explicitly names a table. The name can be a table name, a view name, or a synonym.
alias
A name used to qualify column names in other parts of the query expression. Aliases are also called correlation names. If you specify an alias, you must use it, and not the table name, to qualify column names that refer to the table. Query expressions that join a table with itself must use aliases to distinguish between references to column names. Similar to table aliases, the column_alias provides an alternative name to use in column references elsewhere in the query expression. If you specify column aliases, you must specify them for all the columns in table_name. Also, if you specify column aliases in the FROM clause, you must use them, and not the column names, in references to the columns.
FROM ( query_expression )
AS
] [
alias
( column_alias
[ ... ]
] ]
Specifies a derived table through a query expression. With derived tables, you must specify an alias to identify the derived table.
50
SELECT Derived tables can also specify column aliases. Column aliases provide alternative names to use in column references elsewhere in the query expression. If you specify column aliases, you must specify them for all the columns in the result table of the query expression. Also, if you specify column aliases in the FROM clause, you must use them, and not the column names, in references to the columns.
FROM
joined_table
Combines data from two table references by specifying a join condition, as shown in the following syntax: Syntax
{ }
] ]
JOIN
The syntax currently allowed in the FROM clause supports only a subset of possible join conditions:
CROSS JOIN specifies a Cartesian product of rows in the two tables. Every row in one table is joined to every row in the other table. INNER JOIN
specifies an inner join using the supplied search condition. specifies a left outer join using the supplied search condition.
You can also specify these and other join conditions in the WHERE clause of a query expression.
NO REORDER
Disables join order optimization for the FROM clause. Use NO REORDER when you choose to override the join order chosen by the optimizer. The braces are part of the syntax for this optional clause.
[ WITH ( NOLOCK ) ]
Allows a dirty read to occur in the event records are locked by another user. Example For customers with orders, retrieve their names and order info, as shown in the following example:
51
SELECT
WHERE clause
Specifies a search condition that applies conditions to restrict the number of rows in the result table. If the query expression does not specify a WHERE clause, the result table includes all the rows of the specified table reference in the FROM clause. Syntax
WHERE search_condition
search_condition
Applied to each row of the result table set of the FROM clause. Only rows that satisfy the conditions become part of the result table. If the result of the search_condition is NULL for a row, the row is not selected. Search conditions can specify different conditions for joining two or more tables. Example For customers with orders, retrieve their names and order info:
GROUP BY clause
Specifies grouping of rows in the result table. The results may be grouped by column, alias or expression. Grouping by column The result set of a query may be ordered by one or more columns specified in the GROUP BY clause. Syntax
GROUP BY
table_name.]column_name
...
Notes
For the first column specified in the GROUP BY clause, SQL arranges rows of the result table into groups whose rows all have the same values for the specified column. If you specify a second GROUP BY column, SQL groups rows in each main group by values of the second column. SQL groups rows for values in additional GROUP BY columns in a similar fashion. All columns named in the GROUP BY clause must also be in the select list of the query expression. Conversely, columns in the select list must also be in the GROUP BY clause or be part of an aggregate function.
Example
This example retrieves name and order info for customers with orders:
52
SELECT
Grouping by alias The GROUP BY clause orders the result set according to an alias specified in the SELECT statement. Syntax
GROUP BY
alias
] ...
Note
In this instance, the alias may be used as a simple column reference to a database table, or an actual expression composed of arithmetic expressions, character operators, date operators, or scalar functions. The alias is essentially an alternate name. In the following example, the GROUP BY clause refers to the CityState phrase of the SELECT statement:
Example
SELECT CONCAT (State, City) AS "CityState", COUNT (city) FROM Pub.Customer GROUP BY "CityState";
Grouping by expression The GROUP BY clause orders the result set according to an expression used in the SELECT statement. Syntax
GROUP BY
expression
] ...
Note
The GROUP BY clause can contain any scalar expression which produces a value that is used as a grouping key. An individual column, when it is part of a larger expression in a GROUP BY list, cannot by itself be referenced in the SELECT list. Only the entire expression, which is the grouping key, can be used in the statements SELECT list. Note that a GROUP BY expression cannot contain an aggregate expression such as SUM. The GROUP BY clause does not support set differencing operations such as MINUS and INTERSECT.
Example
In the following example, the GROUP BY clause refers to the concatenation expression used in the SELECT statement:
SELECT CONCAT (State, City), COUNT (city) FROM Pub.Customer GROUP BY CONCAT (State, City);
53
SELECT
HAVING clause
Allows you to set conditions on the groups returned by the GROUP BY clause. If the HAVING clause is used without the GROUP BY clause, the implicit group against which the search condition is evaluated is all the rows returned by the WHERE clause. Syntax
HAVING search_condition
Note
A condition of the HAVING clause can compare one aggregate function value with another aggregate function value or a constant. The HAVING clause in the following example compares the value of an aggregate function (COUNT (*)) to a constant (10):
Example
SELECT CustNum, COUNT(*) FROM Order WHERE OrderDate < TO_DATE ('3/31/2004') GROUP BY CustNum HAVING COUNT (*) > 10 ;
The query returns the customer number and number of orders for all customers who had more than 10 orders before March 31.
ORDER BY clause
Allows ordering of the rows selected by the SELECT statement. Unless an ORDER BY clause is specified, the rows of the result set might be returned in an unpredictable order as determined by the access paths chosen and other decisions made by the query optimizer. The decisions made will be affected by the statistics generated from table and index data examined by the UPDATE STATISTICS command. Syntax
ORDER BY
expr
posn
[
expr
expr
posn
Expression of one or more columns of the tables specified in the FROM clause of the SELECT statement.
posn
DESC
Indicates whether to order by ascending order (ASC) or descending order. The default is ASC. The following examples demonstrates the ORDER BY clause in the SELECT statement:
54
SELECT Example
-- Produce a list of customers sorted by name. SELECT Name, Address, City, State, PostalCode FROM Customer ORDER BY Name ; -- Produce a merged list of customers and suppliers. SELECT Name, Address, State, PostalCode FROM Customer UNION SELECT Name, Address, State, PostalCode FROM Supplier ORDER BY 1;
Notes
The ORDER BY clause, if specified, should follow all other clauses of the SELECT statement. The selected rows are ordered on the basis of the first expr or posn. If the values are the same, then the second expr or posn is used in the ordering. A query expression can be followed by an optional ORDER BY clause. If the query expression contains set operators, then the ORDER BY clause can specify only the positions.
WITH clause
Enables table-level locking when a finer control of the types of locks acquired on an object is required. These locking hints override the current transaction isolation level for the session. The locking hint clause, such as for READPAST, can only be specified in the main SELECT statement, but not in the subquery SELECT statement in the search condition of the WHERE clause. Syntax
WAIT
timeout | NOWAIT
]) ]
search_condition
The READPAST locking hint skips locked rows. This option causes a transaction to skip rows locked by other transactions that would ordinarily appear in the result set, rather than block the transaction waiting for the other transactions to release their locks on these rows. The READPAST lock hint applies only to transactions operating at READ COMMITTED isolation and will read only past row-level locks. Applies only to the SELECT statement. The NOLOCK locking hint ensures records are not locked during the execution of a SELECT statement when the transaction isolation level is set to READ COMMITTED. When NOLOCK is invoked, a dirty read is possible. This locking hint only works with the SELECT statement.
WAIT
timeout Override the default lock-wait time out. The timeout value is in seconds and can be 0 or any positive number.
NOWAIT
Causes the SELECT statement to skip (read past) the row immediately if a lock cannot be acquired on a row in the selection set because of the lock held by some other transaction. 55
SET CATALOG The default behavior is for the transaction to wait until it obtains the required lock or until it times out waiting for the lock. The following example demonstrates the WITH clause in the SELECT statement: Example
SELECT * FROM Customer WHERE CustNum < 100 ORDER BY CustNum FOR UPDATE WITH (READPAST WAIT 1);
OF
table.]column_name ,
... ] [
NOWAIT
OF
table.]column_name ,
...
Causes the SELECT statement to return immediately with an error if a lock cannot be acquired on a row in the selection set because of the lock held by some other transaction. The default behavior is for the transaction to wait until it obtains the required lock or until it times out waiting for the lock. Note If you specify FOR UPDATE, the database acquires exclusive locks on all the rows satisfying the SELECT statement. The database does not acquire row level locks if there is an exclusive lock on the table. See the LOCK TABLE statement for information on table locking.
SET CATALOG
Changes the default catalog name to be used for schema, table, and column references. The default catalog name is initially the name of the primary database. Syntax
SET CATALOG catalog_name;
catalog_name
Catalog name to be used as an alias for the database in schema, table and column references. This must be in the form of an SQL identifier of up to 32 bytes in length. Example In this example, the auxiliary database connection identified by the catalog named mydb1 is specified as the default catalog:
56
SET PRO_CONNECT LOG Notes The SET CATALOG statement is used to specify the default database catalog name to be used for schema, table, and column references. The primary database connection is automatically given a catalog name which is the name of the primary database. For example, if the primary database is at /usr/progress/sports2000, then the catalog name for the primary database is sports2000. The SET CATALOG statement may be used to set the default catalog to an auxiliary database catalog or to the primary database catalog. The specified catalog must identify a current catalog name. If an auxiliary database catalog is set as the default catalog, disconnecting from the auxiliary catalog will not change the name of the default catalog. Thus setting the default catalog to an auxiliary database may cause failures of statements when the default catalog is not set to an active catalog. In other words, shutting down an auxiliary database identified as the default catalog will cause any query using a three-part specification to fail. The failure produces an error indicating that the catalog is not connected.
Authorization Any user is allowed to execute this statement. SQL Compliance Progress Software Corporation specific extension. Related statements CONNECT AS CATALOG, DISCONNECT CATALOG
ON
OFF
][
WITH
({
STATEMENT, QUERY_PLAN
} ) ];
ON
57
Indicates that query plan information is written to the log file. Notes When logging is set ON, the current SQL connection begins logging to a file named as
SQL_server_<server-id>_<ddmmmyyyy>_<hhmmss>.log.
For example: SQL_server_1_05MAY2005_112609.log The server-id corresponds to the server ID shown in database_name.lg. Logging files are located in the servers work directory. The work directory corresponds to the value of the WRKDIR environment variable on UNIX systems and the applicable registry settings in Windows systems. The maximum size of each logging file is 500 MB. When reaches 500 MB, the server logs a message indicating the file was closed due to reaching the maximum size. After this message is written, all logging stops, logging is set to the OFF state, and SQL_server_<server-id>_<ddmmmyyyy>_<hhmmss>.log automatically closes.
SQL_server_<server-id>_<ddmmmyyyy>_<hhmmss>.log
When logging commences to a new file, the file contents begin with information about the SQL Server environment, including: Environment variable settings Parameter values passed to the server at startup Logging control values (such as size limits) The SQL Server process ID
Each section of information written to the log file begins with the string
DDMMMYYYY HH:MM:SS <user-id>:
Indicates the maximum number of seconds during which a query should execute before it is automatically cancelled by the SQL server. Notes The number of seconds specified is the maximum time allowed for the execution of the following protocol messages: 58 Query statement prepare
The value specified by n applies to all subsequent protocol messages of these types until the timeout value is cleared. This may be accomplished simply by specifying a value of 0 on subsequent execution of the statement.
Example
Statement stmt = connection.createStatement(); String MySetQueryTimeout; String MyClearQueryTimeout; MySetTimeout = SET PRO_CONNECT QUERY_TIMEOUT 30; MyClearTimeout = SET PRO_CONNECT QUERY_TIMEOUT 0; // Set SQL Server timeout for query execute and fetch stmt.executeUpdate( MySetQueryTimeout ); // Add code here to perform queries // Clear SQL Server timeout for query execute and fetch stmt.executeUpdate( MyClearQueryTimeout );
Indicates the maximum number of seconds during which a query should execute before it is automatically cancelled by the SQL server. Setting an n value of 0 disables a previously set query timeout. Notes Execution of this command is restriced to DBAs. Any value set with this command is in effect for the duration that the database is up and running. Should a query timeout value be set for an individual connection via the command SET PRO_CONNECT QUERY_TIMEOUT the lower of the timeout values for the connection and the server takes precedence.
59
Statement stmt = connection.createStatement(); String MySetQueryTimeout; String MyClearQueryTimeout; MySetTimeout = SET PRO_SERVER QUERY_TIMEOUT 30; MyClearTimeout = SET PRO_SERVER QUERY_TIMEOUT 0; // Set SQL Server timeout for query execute and fetch stmt.executeUpdate( MySetQueryTimeout ); // Add code here to perform queries // Clear SQL Server timeout for query execute and fetch stmt.executeUpdate( MyClearQueryTimeout );
ON
OFF
] [
WITH
( {
STATEMENT, QUERY_PLAN
} ) ];
ON
Indicates that query plan information is written to the log file. Notes When logging is set ON, each SQL Server begins logging to a file named as
SQL_server_<server-id>_<ddmmmyyyy>_<hhmmss>.log
For example: SQL_server_1_05MAY2005_112609.log The server-id corresponds to the server ID shown in database_name.lg. Logging files are located in the servers work directory. The work directory corresponds to the value of the WRKDIR environment variable on UNIX systems and the applicable registry settings in Windows systems. The maximum size of each logging file is 500 MB. When SQL_server_<server-id>_<ddmmmyyyy>_<hhmmss>.log reaches 500 MB, the server logs a message indicating the file was closed due to reaching the maximum size. After this message is written, all logging stops, logging is set to the OFF state, and SQL_server_<server-id>_<ddmmmyyyy>_<hhmmss>.log automatically closes.
60
SET SCHEMA When logging commences to a new file, the file contents begin with information about the SQL Server environment, including: Environment variable settings Parameter values passed to the server at startup Logging control values (such as size limits) The SQL Server process ID.
Each section of information written to the log file begins with the string
DDMMMYYYY HH:MM:SS <user-id>:
SET SCHEMA
Sets the default owner, also known as schema, for unqualified table references. Syntax
SET SCHEMA
'string_literal'
USER
'string_literal'
Specifies the name for the default owner as a string literal, enclosed in single or double quotes.
?
Indicates a parameter marker to contain the default owner. The actual replacement value for the owner name is supplied in a subsequent SQL operation.
USER
Directs the database to set the default owner back to the username that established the session. Example This example sets the default schema name to White:
Subsequent SQL statements with unqualified table references will use the owner name White. The SELECT statement in this example returns all rows in the White.customer table. The username establishing the original session is still the current user. Notes For authorization purposes, invoking SET SCHEMA does not change the username associated with the current session.
61
SET TRANSACTION ISOLATION LEVEL You can set the default schema name to the username associated with the session by using a SET SCHEMA USER statement.
Authorization None
isolation_level_name
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
Also known as a dirty read. When this isolation level is used, a transaction can read uncommitted data that later might be rolled back. The standard requires that a transaction that uses this isolation level can only fetch data but cannot update, delete, or insert data.
READ COMMITTED
Dirty reads are not possible with this isolation level. However, if the same row is repeatedly read during the same transaction, its contents can be changed or the entire row can be deleted by other transactions.
REPEATABLE READ
This isolation level guarantees that a transaction can read the same row many times and it will remain intact. However, if a query with the same search criteria (the same WHERE clause) is executed more than once, each execution can return different sets of rows. This can happen because other transactions are allowed to insert new rows that satisfy the search criteria or update some rows in such a way that they now satisfy the search criteria.
SERIALIZABLE
This isolation level guarantees that none of the above happens. Transactions that use this level will be completely isolated from other transactions. Notes See the LOCK TABLE for information on record locking schemes used by each isolation level.
62
SHOW CATALOGS For more information on transactions, see OpenEdge Data Management: SQL Development.
SHOW CATALOGS
Returns a list of available catalog information with catalog name, catalog type (primary or auxiliary), and catalog status (default or not default). Syntax
SHOW CATALOGS
ALL
| {
PRO_NAME
PRO_TYPE
PRO_STATUS
[
ALL
, PRO_NAME
PRO_TYPE
PRO_STATUS
List of catalog statuses (default or notdefault) Example In this example, the names of the currently available catalogs are returned.
Notes
This statement is useful for obtaining the catalog names of databases currently connected for the user, for identifying the catalog name of the primary database (automatically connected) and the current default catalog. The primary database connection is automatically given a catalog name which is the name of the primary database. For example, if the database is at /usr/progress/sports2000, then the catalog name for the primary database is sports2000. Three columns of information are returned by the SHOW CATALOG statement. These are the catalog name, catalog type (primary or auxiliary) and status (default or notdefault).
63
SHOW ENCRYPT ON Authorization Any user is allowed to execute this statement. SQL Compliance Progress Software Corporation specific extension. Related statements CONNECT AS CATALOG, DISCONNECT CATALOG, SET CATALOG
SHOW ENCRYPT ON
The SHOW ENCRYPT statement provides encryption policy information on the primary database. It can be used only by security administrators or DBAs. Syntax
SHOW ENCRYPT ON
{ | |
ALL
|[
TABLE TABLE
| INDEX | LOB ] tablename [ WITH INDEX| WITH LOB] tablename ON INDEX indexname } ;
TABLE
When run, the statement returns a result set with eight columns: Notes Database object type (AREA, TABLE, INDEX, LOB) Database object name Objects table name (blank for area) Database object name (blank for area) Database object identification Object policy state (CURRENT or PREVIOUS) Object policy cipher name Object policy version number Only active policies are returned by the statement. The only option which shows Type I area encryption information is the SQL statement
SHOW ENCRYPTION ON ALL. Other options on SHOW ENCRYPT show encryption information
only for Type II area database objects. Authorization Security Administrator or DBA.
64
Table constraints SQL Compliance Progress Software Corporation specific extension. Related statements ALTER TABLE, CREATE INDEX, CREATE TABLE
Table constraints
Specifies a constraint for a table that restricts the values that the table can store. INSERT, UPDATE, or DELETE statements that violate the constraint fail. SQL returns a constraint violation error. Table constraints have syntax and behavior similar to column constraints. Note the following differences: The definitions of the table constraints are separated from the column definitions by commas. Table constraint definitions can include more than one column, and SQL evaluates the constraint based on the combination of values stored in all the columns.
Syntax
CONSTRAINT constraint_name PRIMARY KEY ( column
| | |
( column
... ]
CHECK ( search_condition )
CONSTRAINT constraint_name
Allows you to assign a name that you choose to the table constraint. While this specification is optional, this facilitates making changes to the table definition, since the name you specify is in your source CREATE TABLE statement. If you do not specify a constraint_name, the database assigns a name. These names can be long and unwieldy, and you must query system tables to determine the name.
PRIMARY KEY ( column
... ]
Defines the column list as the primary key for the table. There can be at most one primary key for a table. All the columns that make up a table level primary key must be defined as NOT NULL, or the CREATE TABLE statement fails. The combination of values in the columns that make up the primary key must be unique for each row in the table. Other tables can name primary keys in their REFERENCES clauses. If they do, SQL restricts operations on the table containing the primary key in the following ways:
DROP TABLE
65
Table constraints
DELETE and UPDATE statements that modify values in the combination of columns that match a foreign keys value also fail column
UNIQUE (
... ]
Defines the column list as a unique, or candidate, key for the table. Unique key table-level constraints have the same rules as primary key table-level constraints, except that you can specify more than one UNIQUE table-level constraint in a table definition.
FOREIGN KEY ( column
( column
[, ... ] ... ] ) ]
) REFERENCES
owner_name.]table_name
Defines the first column list as a foreign key and, in the REFERENCES clause, specifies a matching primary or unique key in another table. A foreign key and its matching primary or unique key specify a referential constraint. The combination of values stored in the columns that make up a foreign key must either: Have at least one of the column values be null. Be equal to some corresponding combination of values in the matching unique or primary key.
You can omit the column list in the REFERENCES clause if the table specified in the REFERENCES clause has a primary key and you want the primary key to be the matching key for the constraint.
CHECK (search_condition)
Specifies a table level check constraint. The syntax for table level and column level check constraints is identical. Table level check constraints must be separated by commas from surrounding column definitions. SQL restricts the form of the search condition. The search condition must not: Examples Refer to any column other than columns that precede it in the table definition Contain aggregate functions, subqueries, or parameter references
In the following example, which shows creation of a table level primary key, note that its definition is separated from the column definitions by a comma:
CREATE TABLE SupplierItem ( SuppNum INTEGER NOT NULL, ItemNum INTEGER NOT NULL, Quantity INTEGER NOT NULL DEFAULT 0, PRIMARY KEY (SuppNum, ItemNum)) ;
The following example shows how to create a table with two UNIQUE table level constraints:
66
Table constraints
CREATE TABLE OrderItem ( OrderNum INTEGER NOT NULL, ItemNum INTEGER NOT NULL, Quantity INTEGER NOT NULL, Price INTEGER NOT NULL, UNIQUE (OrderNum, ItemNum), UNIQUE (Quantity, Price));
The following example defines the combination of columns student_courses.teacher and student_courses.course_title as a foreign key that references the primary key of the courses table:
CREATE TABLE Courses ( Instructor CHAR (20) NOT NULL, CourseTitle CHAR (30) NOT NULL, PRIMARY KEY (Instructor, CourseTitle)); CREATE TABLE StudentCourses ( StudentID INTEGER, Instructor CHAR (20), CourseTitle CHAR (30), FOREIGN KEY (Instructor, CourseTitle) REFERENCES Courses);
Note that this REFERENCES clause does not specify column names because the foreign key refers to the primary key of the courses table. SQL evaluates the referential constraint to see if it satisfies the following search condition:
(StudentCourses.Ieacher IS NULL OR StudentCourses.CourseTitle IS NULL) OR EXISTS (SELECT * FROM StudentCourses WHERE (StudentCourses.Instructor = Courses.Instructor AND StudentCourses.CourseTitle = Courses.CourseTitle) )
Note:
INSERT, UPDATE,
or DELETE statements that cause the search condition to be false violate the constraint, fail, and generate an error.
In the following example, which creates a table with two column level check constraints and one table level check constraint, each constraint is defined with a name:
CREATE TABLE supplier ( SuppNum INTEGER NOT NULL, Name CHAR (30), Status SMALLINT CONSTRAINT StatusCheckCon CHECK (Supplier.Status BETWEEN 1 AND 100 ), City CHAR (20) CONSTRAINT CityCheckCon CHECK (Supplier.City IN ('New York', 'Boston', 'Chicago')), CONSTRAINT SuppTabCheckCon CHECK (Supplier.City <> 'Chicago' OR Supplier.Status = 20)) ;
67
UPDATE
UPDATE
Updates the rows and columns of the specified table with the given values for rows that satisfy the search_condition. Syntax
UPDATE table_name SET assignment
[,
assignment
...
WHERE search_condition
assignment:
expr
NULL
| |
Notes
( column ( column
[, [,
column column
} ] ]
, ,
... ...
) = ( expr
[,
expr
) = ( query_expression )
If you specify the optional WHERE clause, only rows that satisfy the search_condition are updated. If you do not specify a WHERE clause, all rows of the table are updated. If the expressions in the SET clause are dependent on the columns of the target table, the expressions are evaluated for each row of the table. If a query expression is specified on the right-hand side of an assignment, the number of expressions in the first SELECT clause of the query expression must be the same as the number of columns listed on the left-hand side of the assignment. If a query expression is specified on the right-hand side of an assignment, the query expression must return one row. If a table has check constraints and if the columns to be updated are part of a check expression, then the check expression is evaluated. If the result of the evaluation is FALSE, the UPDATE statement fails. If a table has primary or candidate keys and if the columns to be updated are part of the primary or candidate key, SQL checks to determine if there is a corresponding row in the referencing table. If there is a corresponding row the UPDATE operation fails. Column names in the SET clause do not need a table_name qualifier. Since an UPDATE statement affects a single table, columns in the SET clause are implicitly qualified to the table_name identified in the UPDATE clause.
68
Update Orderline SET (Itemnum) = (Select Itemnum FROM Item WHERE Itemname = 'Tennis balls') WHERE Ordernum = 20;
UPDATE OrderLine SET (ItemNum, Price) = (SELECT ItemNum, Price * 3 FROM Item WHERE ItemName = 'gloves') WHERE OrderNum = 21 ;
Authorization Must have DBA privilege or UPDATE privileges on all the specified columns of the target table, and SELECT privilege on all the other tables referred to in the statement. Related statements SELECT, OPEN, FETCH
UPDATE STATISTICS
Queries data tables and updates the following statistics: Syntax
UPDATE (
Table cardinality Index statistics Column data distribution for columns that are index components Column data distribution for columns that are not index components
TABLE | INDEX |
ALL
]
;
COLUMN
STATISTICS
[
Examples
AND
])
...
FOR table_name
The following example shows default commands for table cardinality and data distribution for index component columns:
69
UPDATE STATISTICS
The following example shows commands for updating column statistics for index columns only:
The following example shows commands for updating statistics for all columns:
The following example shows commands to obtain table cardinality and new index statistics and column statistics for all columns:
UPDATE TABLE STATISTICS AND INDEX STATISTICS AND ALL COLUMN STATISTICS FOR Customer;
Notes
All statistics are obtained online. Obtaining statistics does not require an exclusive lock on the schema or any table locks. Rows written to statistics tables will be exclusively locked, as in every transaction performing updates. Therefore, statistics can be obtained while normal database operations continue. Specifying TABLE STATISTICS obtains table cardinality only. Table cardinalities are stored in the SYSTABLSTAT system catalog table. Specifying INDEX STATISTICS obtains statistics on the number of unique values in each index. Index statistics are stored in the SYSIDXSTAT system catalog table. Specifying COLUMN STATISTICS (without ALL) obtains statistics on the data distribution of values for each column that is an index key component. Specifying ALL COLUMN STATISTICS obtains statistics on the data distribution of values for all columns. The STATISTICS phrase can be repeated so that up to three statistics can be requested by a single UPDATE STATISTICS statement.
70
UPDATE STATISTICS By default, for the simple statement UPDATE STATISTICS, where the type of statistics is not specified, SQL will obtain table and index column statistics. This is equivalent to the statement UPDATE TABLE STATISTICS AND COLUMN STATISTICS. A table containing LONG data types can get table, index, and/or column statistics. The columns that are LONG data types cannot get statistics. Obtaining table statistics runs in time proportional to the tables primary index. Obtaining column statistics runs in time proportional to the tables primary index, plus an additional amount proportional to the number of columns in the table. Obtaining index statistics runs in time proportional to the total size for all indexes for the table. Table statistics are often the most useful statistic, as they influence join order substantially. Index statistics are important when a table has five or more indexes. This is especially true if some of the indexes are similar to one another. Column statistics are the most useful when applications use range predicates, such as and the operators <, <=, > and >=.
BETWEEN
71
UPDATE STATISTICS
72
This section provides detailed information on each SQL function. A description for each function provides the following information: A definition of the function The syntax of the functions proper usage A code sample that shows how the function works Any associated notes
Aggregate functions
Aggregate functions calculate a single value for a collection of rows in a result table. If the function is in a statement with a GROUP BY clause, it returns a value for each group in the result table. Aggregate functions are also called set or statistical functions. Aggregate functions cannot be nested. The aggregate functions are:
AVG COUNT MAX MIN SUM
ABS
Scalar functions
Scalar functions calculate a value based on another single value. Scalar functions are also called value functions and can be nested.
ABS
Computes the absolute value of expression. Syntax
ABS ( expression )
Example
SELECT ABS (MONTHS_BETWEEN (SYSDATE, order_date)) FROM orders WHERE ABS (MONTHS_BETWEEN (SYSDATE, order_date)) > 3 ;
Notes
REAL,
The argument to the function must be of type TINYINT, SMALLINT, INTEGER, NUMERIC, or FLOAT.
The result is of type NUMERIC. If the argument expression evaluates to NULL, the result is NULL.
ACOS
Returns the arccosine of expression. Syntax
ACOS ( expression )
Example
In this example, which illustrates two ways to use the ACOS function, the first SELECT statement returns the arcosine in radians, and the second returns the arcosine in degrees:
74
ADD_MONTHS
select acos (.5) 'Arccosine in radians' from syscalctable; ARCCOSINE IN RADIANS -------------------1.047197551196598 1 record selected
select acos (.5) * (180/ pi()) 'Arccosine in degrees' from syscalctable; ARCCOSINE IN DEGREES -------------------59.999999999999993 1 record selected
Notes
ACOS
takes the ratio (expression) of two sides of a right triangle and returns the corresponding angle. The ratio is the length of the side adjacent to the angle divided by the length of the hypotenuse. The result is expressed in radians and is in the range -Pi/2 to Pi/2 radians. To convert degrees to radians, multiply degrees by Pi/180. To convert radians to degrees, multiply radians by 180/Pi. The expression must be in the range -1 to 1. The expression must evaluate to an approximate numeric data type.
ADD_MONTHS
Adds to the date value specified by the date_expression, the given number of months specified by integer_expression, and returns the resultant date value. Syntax
ADD_MONTHS ( date_expression , integer_expression )
Example
Notes
The first argument must be of DATE type. The second argument to the function must be of NUMERIC type. The result is of type DATE.
75
ASCII
Returns the ASCII value of the first character of the given character expression. Syntax
ASCII ( char_expression )
Example
Notes
The argument to the function must be of type CHARACTER. The result is of type INTEGER. If the argument char_expression evaluates to NULL, the result is NULL. The ASCII function is character-set dependent and supports multi-byte characters. The function returns the character encoding integer value of the first character of char_expression in the current character set. If char_expression is a literal string, the result is determined by the character set of the SQL client. If char_expression is a column in the database, the character set of the database determines the result.
ASIN
Returns the arcsine of expression. Syntax
ASIN ( expression )
Example
In the following example, which shows how to use the ASIN function, the first SELECT statement returns the arcsine in degrees, and the second returns the arcsine in radians:
76
ATAN
SELECT ASIN (1) * (180/ pi()) 'Arcsine in degrees' FROM SYSPROGRESS.SYSCALCTABLE; ARCSINE IN DEGREES ------------------90.000000000000000 1 record selected
SELECT ASIN (1) 'Arcsine in radians' FROM SYSPROGRESS.SYSCALCTABLE; ARCSINE IN RADIANS -----------------1.570796326794897 1 record selected
ASIN takes the ratio (expression) of two sides of a right triangle and returns the corresponding
angle. The ratio is the length of the side opposite the angle divided by the length of the hypotenuse. The result is expressed in radians and is in the range -pi/2 to pi/2 radians. To convert degrees to radians, multiply degrees by pi/180. To convert radians to degrees, multiply radians by 180/pi. Notes The expression must be in the range -1 to 1. The expression must evaluate to an approximate numeric data type.
ATAN
Returns the arctangent of expression. Syntax
ATAN ( expression )
Example
The following example illustrates two ways to use the ATAN function:
77
ATAN2
select atan (1) * (180/ pi()) 'Arctangent in degrees' from syscalctable; ARCTANGENT IN DEGREES ----------------------45.000000000000000 1 record selected
select atan (1) 'Arctangent in radians' from syscalctable; ARCTANGENT IN RADIANS ----------------------0.785398163397448 1 record selected
ATAN takes the ratio (expression) of two sides of a right triangle and returns the corresponding
angle. The ratio is the length of the side opposite the angle divided by the length of the side adjacent to the angle. The result is expressed in radians and is in the range -Pi/2 to Pi/2 radians. To convert degrees to radians, multiply degrees by Pi/180. To convert radians to degrees, multiply radians by 180/Pi. Notes The expression must be in the range -1 to 1. The expression must evaluate to an approximate numeric data type.
ATAN2
Returns the arctangent of the x and y coordinates specified by expression1 and expression2. Syntax
ATAN2 ( expression1 , expression2 )
Example
The following example illustrates two ways to use the ATAN2 function:
78
AVG
select atan2 (1,1) * (180/ pi()) 'Arctangent in degrees' from syscalctable; ARCTANGENT IN DEGREES ----------------------45.000000000000000 1 record selected
select atan2 (1,1) 'Arctangent in radians' from syscalctable; ARCTANGENT IN RADIANS ----------------------0.785398163397448 1 record selected
Notes
ATAN2 takes the ratio of two sides of a right triangle and returns the corresponding angle. The ratio is the length of the side opposite the angle divided by the length of the side adjacent to the angle. expression1
and expression2 specify the x and y coordinates of the end of the hypotenuse opposite the angle.
The result is expressed in radians and is in the range -pi/2 to pi/2 radians. To convert degrees to radians, multiply degrees by pi/180. To convert radians to degrees, multiply radians by 180/pi. Both expression1 and expression2 must evaluate to approximate numeric data types.
AVG
Computes the average of a collection of values. The keyword DISTINCT specifies that the duplicate values are to be eliminated before computing the average. Syntax
AVG (
{ [
ALL
expression
} | {
DISTINCT column_ref
Example
Notes
NULL values are eliminated before the average value is computed. If all the values are NULL, the result is NULL.
79
CASE The argument to the function must be of type SMALLINT, INTEGER, NUMERIC, REAL, or
FLOAT.
CASE
Specifies a series of search conditions and associated result expressions. The general form is called a searched case expression. SQL returns the value specified by the first result expression whose associated search condition evaluates as true. If none of the search conditions evaluates as true, the CASE expression returns a NULL value, or the value of some other default expression if the CASE expression includes the ELSE clause.
CASE
also supports syntax for a shorthand notation, called a simple case expression, for evaluating whether one expression is equal to a series of other expressions.
Syntax
searched_case_expr
simple_case_expr
searched_case_expr
Syntax
CASE WHEN search_condition THEN
result_expr
NULL
NULL
Syntax
CASE primary_expr WHEN expr THEN
result_expr
NULL
NULL
Specifies a searched case expression. It must be followed by one or more WHEN-THEN clauses, each specifying a search condition and corresponding expression.
WHEN search_condition THEN
result_expr
NULL
Specifies a search condition and corresponding expression. SQL evaluates search_condition. If search_condition evaluates as true, CASE returns the value specified by result_expr, or NULL, if the clause specifies THEN NULL. If search_condition evaluates as false, SQL evaluates the next WHEN-THEN clause, if any, or the ELSE clause, if it is specified. 80
CASE
CASE primary_expr
Specifies a simple case expression. In a simple case expression, one or more WHEN-THEN clauses specify two expressions.
WHEN expr THEN
result_expr
NULL
Prompts SQL to evaluate expr and compare it with primary_expr specified in the CASE clause. If they are equal, CASE returns the value specified by result_expr (or NULL, if the clause specifies THEN NULL). If expr is not equal to primary_expr, SQL evaluates the next WHEN-THEN clause, if any, or the ELSE clause, if it is specified.
ELSE
expr
NULL
Specifies an optional expression whose value SQL returns if none of the conditions specified in WHEN-THEN clauses are satisfied. If the CASE expression omits the ELSE clause, it is the same as specifying ELSE NULL. Examples A simple case expression can always be expressed as a searched case expression. This example illustrates a simple case expression:
CASE primary_expr WHEN expr1 THEN result_expr1 WHEN expr2 THEN result_expr2 ELSE expr3 END
The simple case expression in the preceding CASE example is equivalent to the following searched case expression:
CASE WHEN primary_expr = expr1 THEN result_expr1 WHEN primary_expr = expr2 THEN result_expr2 ELSE expr3 END
The following example shows a searched case expression that assigns a label denoting suppliers as 'In Mass' if the state column value is 'MA':
81
CAST
SELECT name, city, CASE WHEN state = 'MA' THEN 'In Mass' ELSE 'Not in Mass' END FROM supplier; Name ---------------GolfWorld Suppl Pool Swimming S Nordic Ski Whol Champion Soccer ABC Sports Supp Seasonal Sports Tennis Supplies Boating Supplie Aerobic Supplie Sports Unlimite City ---------------Boston Valkeala Hingham Harrow Boston Bedford Boston Jacksonville Newport Beach Irving searched_case(State,MA,In Mass,) -------------------------------In Mass Not in Mass In Mass Not in Mass In Mass In Mass In Mass Not in Mass Not in Mass Not in Mass
SELECT name, city, CASE state WHEN 'MA' THEN 'In Mass' ELSE 'Not in Mass' END FROM supplier; Name ---------------GolfWorld Suppl Pool Swimming S Nordic Ski Whol Champion Soccer ABC Sports Supp Seasonal Sports Tennis Supplies Boating Supplie Aerobic Supplie Sports Unlimite City ---------------Boston Valkeala Hingham Harrow Boston Bedford Boston Jacksonville Newport Beach Irving simple_case(State,MA,In Mass,) -----------------------------In Mass Not in Mass In Mass Not in Mass In Mass In Mass In Mass Not in Mass Not in Mass Not in Mass
Notes
This function is not allowed in a GROUP BY clause. Arguments to this function cannot be query expressions.
CAST
Converts an expression to another data type. The first argument is the expression to be converted. The second argument is the target data type. The length option for the data_type argument specifies the length for conversions to CHAR and VARCHAR data types. If omitted, the default is 1 byte. 82
CEILING If the expression evaluates to NULL, the result of the function is null. Specifying NULL with the CAST function is useful for set operations, such as UNION, that require two tables to have the same structure. CAST NULL allows you to specify a column of the correct data type, so a table with a similar structure to another, but with fewer columns, can be in a union operation with the other table. The CAST function provides a data-type-conversion mechanism compatible with the SQL standard. Use the CONVERT function, enclosed in the ODBC escape clause { fn }, to specify ODBC-compliant syntax for data type conversion. See CONVERT (ODBC compatible) section on page 86 for more information. Syntax
CAST (
expression
NULL
AS data_type
( length )] )
Example
The following SQL example uses CAST to convert an integer field from a catalog table to a CHARACTER data type:
SELECT CAST(fld AS CHAR(25)), fld FROM sysprogress.syscalctable; CONVERT(CHARACTER(25),FLD) -------------------------100 1 record selected FLD --100
CEILING
Returns the smallest integer greater than or equal to expression. Syntax
CEILING ( expression )
Example
Note
The expression must evaluate to a numeric data type. Compatibility ODBC compatible
83
CHAR
CHAR
Returns a character string with the first character having an ASCII value equal to the argument expression. CHAR is identical to CHR but provides ODBC-compatible syntax. Syntax
CHAR ( integer_expression )
Example
Notes
The argument to the function must be of type INTEGER, TINYINT, or SMALLINT. The result is of type CHARACTER. If the argument integer_expression evaluates to NULL, the result is NULL. The CHAR and CHR functions are character-set dependent and support single-byte and multi-byte characters. If integer_expression is a valid character encoding integer value in the current SQL server character set, the function returns the correct character. If it is not a valid character, the function returns a NULL value.
CHR
Returns a character string with the first character having an ASCII value equal to the argument expression. Syntax
CHR ( integer_expression )
Example
This example illustrates the CHR function and the SUBSTR (substring) function:
Notes
The argument to the function must be of type INTEGER, TINYINT, or SMALLINT. The result is of type CHARACTER. If the argument integer_expression evaluates to NULL, the result is NULL.
84
COALESCE The CHR and CHAR functions are character-set dependent, and support multi-byte characters. If integer_expression is a valid character encoding integer value in the current SQL server character set, the function returns the correct character. If it is not a valid character the function returns a NULL value.
COALESCE
Specifies a series of expressions and returns the first expression whose value is not NULL. If all the expressions evaluate as null, COALESCE returns a NULL value. Syntax
COALESCE ( expression1, expression2
[... ] )
The COALESCE syntax is shorthand notation for a common case that can also be represented in a CASE expression. The following two formulations are equivalent:
CASE WHEN expression1 IS NOT NULL THEN expression1 WHEN expression2 IS NOT NULL THEN expression2 ELSE expression3 END
Example
Notes
This function is not allowed in a GROUP BY clause. Arguments to this function cannot be query expressions.
CONCAT
Returns a concatenated character string formed by concatenating two arguments.
85
Example
Notes
Both of the arguments must be of type CHARACTER or VARCHAR. The result is of type VARCHAR. If any of the argument expressions evaluate to NULL, the result is NULL. The two char_expression expressions and the result of the CONCAT function can contain multi-byte characters.
SQL_BINARY
SQL_BIT
SQL_CHAR
SQL_DATE
SQL_DECIMAL
| | |
SQL_FLOAT
| |
SQL_TIME
SQL_VARCHAR
86
Example
The following SQL example uses the CONVERT function to convert an INTEGER field from a system table to a character string:
SELECT CONVERT('CHAR', fld), fld FROM sysprogress.syscalctable; CONVERT(CHAR,FLD) ----------------100 1 record selected FLD --100
SELECT CONVERT('CHAR(35)', fld), fld FROM sysprogress.syscalctable; CONVERT(CHAR(35),FLD) --------------------100 1 record selected FLD --100
Note
When data_type is CHARACTER( length ) or VARCHAR( length ), the length specification represents the number of characters. The converted result can contain multi-byte characters. Compatibility Progress extension
COS
Returns the cosine of expression. Syntax
COS ( expression )
Example
COUNT
select cos(45 * pi()/180) 'Cosine of 45 degrees' from sysprogress.syscalctable; COSINE OF 45 DEG ---------------0.707106781186548 1 record selected
Notes
COS
takes an angle expression and returns the ratio of two sides of a right triangle. The ratio is the length of the side adjacent to the angle divided by the length of the hypotenuse. The expression specifies an angle in radians. The expression must evaluate to an approximate numeric data type. To convert degrees to radians, multiply degrees by Pi/180. To convert radians to degrees, multiply radians by 180/Pi.
COUNT
Computes either the number of rows in a group of rows or the number of non-NULL values in a group of values. Syntax
COUNT (
{ [
ALL
expression
} | {
DISTINCT column_ref
} |
* )
Example
Notes
The keyword DISTINCT specifies that the duplicate values are to be eliminated before computing the count. If the argument to COUNT function is *, then the function computes the count of the number of rows in a group. If the argument to COUNT function is not *, then NULL values are eliminated before the number of rows is computed. The argument column_ref or expression can be of any type. The result of the function is of BIGINT data type. The result is never NULL.
88
CURDATE
CURDATE
Returns the current date as a DATE value. This function takes no arguments. Syntax
CURDATE ( )
Example
INSERT INTO objects (object_owner, object_id, create_date) VALUES (USER, 1001, CURDATE()) ;
Note
SQL statements can refer to CURDATE anywhere they can refer to a DATE expression. Compatibility ODBC compatible
CURTIME
Returns the current time as a TIME value. This function takes no arguments. Syntax
CURTIME ( )
Example
This example illustrates how to use the CURTIME function to INSERT the current time into the create_time column of the objects table:
INSERT INTO objects (object_owner, object_id, create_time) VALUES (USER, 1001, CURTIME()) ;
Note
SQL statements can refer to CURTIME anywhere they can refer to a TIME expression. Compatibility ODBC compatible
CURRVAL
CURRVAL returns the current value of a sequence, and uses the following syntax to reference the
89
DATABASE
schema
Specifies the schema that contains the sequence. To refer to the current value of a sequence in the schema of another user, you must have SELECT object privilege on the sequence.
sequence
Specifies the name of the sequence whose current value you want. Use CURRVAL in: The SELECT list of a SELECT statement not contained in a subquery or view The SELECT list of a subquery in an INSERT statement The VALUES clause of an INSERT statement The SET clause of an UPDATE statement cannot be used in:
CURRVAL
Example
A query of a view A SELECT statement with a GROUP BY clause that references a sequence A SELECT statement with an ORDER BY clause that references a sequence A SELECT statement that is combined with another SELECT statement with the UNION, INTERSECT, or MINUS set operator The WHERE clause of a SELECT or UPDATE statement The DEFAULT value of a column in a CREATE TABLE or ALTER TABLE statement The condition of a CHECK constraint
In the following example, the OpenEdge SQL sequence generator returns the current value of the customer sequence:
SELECT customer_sequence.CURRVAL FROM pub.customer;
DATABASE
Returns the name of the database corresponding to the current connection name. This function takes no arguments, and the trailing parentheses are optional. Syntax
DATABASE
( )
Example
90
DAYNAME
DAYNAME
Returns a character string containing the name of the day (for example, Sunday through Saturday) for the day portion of date_expression. The argument date_expression can be the name of a column, the result of another scalar function, or a date or timestamp literal. Syntax
DAYNAME ( date_expression )
Example
REFERENCE ---------tdfg/101
CUST_NO -------10001
DAYOFMONTH
Returns the day of the month in the argument as a short integer value in the range of 131. The argument date_expression can be the name of a column, the result of another scalar function, or a date or timestamp literal. Syntax
DAYOFMONTH ( date_expression )
Example
91
DAYOFWEEK
Notes
The date_expression argument must be of type DATE. If date_expression is supplied as a date literal, it can be any of the valid date_literal formats where the day specification (DD) precedes the month specification (MM). The result is of type SHORT. If the argument expression evaluates to NULL, the result is NULL.
DAYOFWEEK
Returns the day of the week in the argument as a short integer value in the range of 17. The argument date_expression can be the name of a column, the result of another scalar function, or a date or timestamp literal. Syntax
DAYOFWEEK ( date_expression )
Example
Notes
The argument to the function must be of type DATE. If date_expression is supplied as a date literal, it can be any of the valid date_literal formats where the day specification (DD) precedes the month specification (MM). The result is of type SHORT. If the argument expression evaluates to NULL, the result is NULL.
92
DAYOFYEAR
DAYOFYEAR
Returns the day of the year in the argument as a short integer value in the range of 1366. The argument date_expression can be the name of a column, the result of another scalar function, or a date or timestamp literal. Syntax
DAYOFYEAR ( date_expression )
Example
Notes
The argument to the function must be of type DATE. The result is of type SHORT. If the argument expression evaluates to NULL, the result is NULL.
DB_NAME
Returns the name of the database corresponding to the current connection name. Syntax
DB_NAME ( )
Example
93
DECODE
DECODE
Compares the value of the first argument expression with each search_expression and, if a match is found, returns the corresponding match_expression. If no match is found, then the function returns the default_expression. If a default_expression is not specified and no match is found, then the function returns a NULL value. Syntax
DECODE ( expression, search_expression, match_expression
[ [
Example
...]
SELECT ename, DECODE (deptno, 10, 'ACCOUNTS', 20, 'RESEARCH', 30, 'SALES', 40, 'SUPPORT', 'NOT ASSIGNED' ) FROM employee ;
Notes
Use a simple case expression when SQL-compatible syntax is a requirement. The first argument expression can be of any type. The types of all search_expressions must be compatible with the type of the first argument. The match_expressions can be of any type. The types of all match_expressions must be compatible with the type of the first match_expression. The type of the default_expression must be compatible with the type of the first
match_expression.
The type of the result is the same as that of the first match_expression. If the first argument expression is NULL, then the value of the default_expression is returned, if it is specified. Otherwise NULL is returned.
DEGREES
Returns the number of degrees in an angle specified in radians by expression. Syntax
DEGREES ( expression )
94
Notes
The expression specifies an angle in radians. The expression must evaluate to a numeric data type.
EXP
Returns the exponential value of expression (e raised to the power of expression). Syntax
EXP ( expression )
Example
Note
expression
FLOOR
Returns the largest integer less than or equal to expression. Syntax
FLOOR ( expression )
Example
Note
expression
95
GREATEST
Returns the greatest value among the values of the given expressions. Syntax
GREATEST ( expression , expression
...
Example
SELECT cust_no, last_name, GREATEST (ADD_MONTHS (start_date, 10), SYSDATE) FROM customer ;
Notes
The first argument to the function can be of any type. However, the types of the subsequent arguments must be compatible with that of the first argument. The type of the result is the same as that of the first argument. If any of the argument expressions evaluate to NULL, the result is NULL. When the data type of an expression is either CHARACTER(length) or VARCHAR(length), the expression can contain multi-byte characters. The sort weight for each character is determined by the collation table in the database.
HOUR
Returns the hour in the argument as a short integer value in the range of 023. Syntax
HOUR ( time_expression )
Example
Notes
96
IFNULL The argument must be specified in the format hh:mi:ss. The result is of type SHORT. If the argument expression evaluates to NULL, the result is NULL.
IFNULL
Returns value if expr is NULL. If expr is not NULL, IFNULL returns expr. Syntax
IFNULL( expr, value)
Example
In this example, which illustrates the IFNULL function, the SELECT statement returns three rows with a NULL value in column C1, and two non-NULL values:
SELECT C1, IFNULL(C1, 9999) FROM TEMP ORDER BY C1; C1 -IFNULL(C1,9999) ---------------9999 9999 9999 1 3
1 3
Note
The data type of value must be compatible with the data type of expr. Compatibility ODBC compatible
INITCAP
Returns the result of the argument character expression after converting the first character to uppercase and the subsequent characters to lowercase. Syntax
INITCAP ( char_expression )
Example
97
INSERT Notes The char_expression must be of type CHARACTER. The result is of type CHARACTER. If the argument expression evaluates to NULL, the result is NULL. A char_expression and the result can contain multi-byte characters. The uppercase conversion for the first character and the lowercase conversion for the rest of the characters is based on the case table in the convmap file. The default case table is BASIC.
INSERT
Returns a character string where length number of characters have been deleted from string_exp1 beginning at start_pos, and string_exp2 has been inserted into string_exp1, beginning at start_pos. Syntax
INSERT( string_exp1 , start_pos , length , string_exp2 )
Example
SELECT INSERT(last_name,2,4,'xx') FROM customer WHERE last_name = 'Goldman'; INSERT LAST_NAME,2,4,XX) -----------------------Gxxan 1 record selected
The two letters o and l are deleted from the name Goldman in the last_name column, and the letters xx are inserted into the last_name column, beginning at the fourth character, overlaying the letters d and m. Notes The string_exp can be type fixed-length or variable-length CHARACTER. The start_pos and length can be of data type INTEGER, SMALLINT, or TINYINT. The result string is of the type string_exp1. If any of the argument expressions evaluate to NULL, the result is NULL. If start_pos is negative or zero, the result string evaluates to NULL. If length is negative, the result evaluates to NULL.
98
INSTR
string_exp1
and string_exp2 and the result can contain multi-byte characters. This is determined by the character set of the SQL server. The length argument specifies a number of characters.
INSTR
Searches character string char_expression1 for the character string char_expression2. The search begins at start_pos of char_expression1. If occurrence is specified, then INSTR searches for the nth occurrence, where n is the value of the fourth argument. The position (with respect to the start of char_expression1) is returned if a search is successful. Zero is returned if no match can be found. Syntax
INSTR ( char_expression1 , char_expression2
, start_pos
, occurrence
] ]
Example
SELECT cust_no, last_name FROM customer WHERE INSTR (LOWER (addr), 'heritage') > 0 ;
Notes
The first and second arguments must be CHARACTER data type. The third and fourth arguments, if specified, must be SMALLINT or TINYINT data type. The value for start position in a character string is the ordinal number of the character in the string. The very first character in a string is at position 1, the second character is at position 2, the nth character is at position n. If you do not specify start_pos, a default value of 1 is assumed. If you do not specify occurrence, a default value of 1 is assumed. The result is INTEGER data type. If any of the argument expressions evaluate to NULL, the result is NULL.
A char_expression
99
LAST_DAY
LAST_DAY
Returns the date corresponding to the last day of the month containing the argument date. Syntax
LAST_DAY ( date_expression )
Example
Notes
The argument to the function must be of type DATE. The result is of type DATE. If the argument expression evaluates to NULL, the result is NULL.
LCASE
Returns the result of the argument character expression after converting all the characters to lowercase. LCASE is the same as LOWER but provides ODBC-compatible syntax. Syntax
LCASE ( char_expression )
Example
Notes
The argument to the function must be of type CHARACTER. The result is of type CHARACTER. If the argument expression evaluates to NULL, the result is NULL. A char_expression and the result can contain multi-byte characters. The lowercase conversion is determined by the case table in the convmap file. The default case table is BASIC.
100
LEAST
Returns the lowest value among the values of the given expressions. Syntax
LEAST ( expression , expression,
...
Example
SELECT cust_no, last_name, LEAST (ADD_MONTHS (start_date, 10), SYSDATE) FROM customer ;
Notes
The first argument to the function can be of any type. However, the types of the subsequent arguments must be compatible with that of the first argument. The type of the result is the same as that of the first argument. If any of the argument expressions evaluate to NULL, the result is NULL. When the data type of an expression is either CHARACTER(length) or VARCHAR(length), the expression can contain multi-byte characters. The sort weight for each character is determined by the collation table in the database.
LEFT
Returns the leftmost count of characters of string_exp. Syntax
LEFT ( string_exp , count )
Example
101
LENGTH Notes
string_exp count
If any of the arguments of the expression evaluate to NULL, the result is NULL. If the count is negative, the result evaluates to NULL. The string_exp and the result can contain multi-byte characters. The function returns the number of characters.
LENGTH
Returns the string length of the value of the given character expression. Syntax
LENGTH ( char_expression )
Example
SELECT last_name 'LONG LAST_NAME' FROM customer WHERE LENGTH (last_name) > 5 ;
Notes
The argument to the function must be of type CHARACTER or VARCHAR. The result is of type INTEGER. If the argument expression evaluates to NULL, the result is NULL.
char_expression
LOCATE
Returns the location of the first occurrence of char_expr1 in char_expr2. If the function includes the optional integer argument start_pos, LOCATE begins searching char_expr2 at that position. If the function omits the start_pos argument, LOCATE begins its search at the beginning of char_expr2.
102
LOG10
LOCATE LOCATE
denotes the first character position of a character expression as 1. If the search fails, returns 0. If either character expression is NULL, LOCATE returns a NULL value.
Syntax
LOCATE( char_expr1 , char_expr2 ,
start_pos
Example
In the following example, which uses two string literals as character expressions, LOCATE returns a value of 6:
SELECT LOCATE('this', 'test this test', 1) FROM TEST; LOCATE(THIS, -----------6 1 record selected
Note
char_expr1 and char_expr2 can contain multi-byte characters. The start_pos argument specifies the position of a starting character, not a byte position. The search is case sensitive. Character comparisons use the collation table in the database.
LOG10
Returns the base 10 logarithm of expression. Syntax
LOG10 ( expression )
Example
Note
The expression must evaluate to an approximate numeric data type. Compatibility ODBC compatible
LOWER
Returns the result of the argument char_expression after converting all the characters to lowercase.
103
LPAD Syntax
LOWER ( char_expression )
Example
Notes
The argument to the function must be of type CHARACTER. The result is of type CHARACTER. If the argument expression evaluates to NULL, the result is NULL.
LPAD
Pads the character string corresponding to the first argument on the left with the character string corresponding to the third argument. After the padding, the length of the result is length. Syntax
LPAD ( char_expression , length
, pad_expression
Example
SELECT LPAD (last_name, 30) FROM customer ; SELECT LPAD (last_name, 30, '.') FROM customer ;
Notes
The first argument to the function must be of type CHARACTER. The second argument to the function must be of type INTEGER. The third argument, if specified, must be of type CHARACTER. If the third argument is not specified, the default value is a string of length 1 containing one blank. If L1 is the length of the first argument and L2 is the value of the second argument: If L1 is less than L2, the number of characters padded is equal to L2 minus L1. If L1 is equal to L2, no characters are padded and the result string is the same as the first argument. If L1 is greater than L2, the result string is equal to the first argument truncated to the first L2 characters.
104
LTRIM If the argument expression evaluates to NULL, the result is NULL. The char_expression and pad_expression can contain multi-byte characters. The specifies a number of characters.
length
LTRIM
Removes all the leading characters in char_expression that are present in char_set and returns the resulting string. The first character in the result is guaranteed not to be in char_set. If you do not specify the char_set argument, leading blanks are removed. Syntax
LTRIM ( char_expression
, char_set
Example
Notes
The first argument to the function must be of type CHARACTER. The second argument to the function must be of type CHARACTER. The result is of type CHARACTER. If the argument expression evaluates to NULL, the result is NULL. The char_expression, the character set specified by char_set, and the result can contain multi-byte characters.
MAX
Returns the maximum value in a group of values. Syntax
COUNT (
{ [
ALL
expression
} | {
DISTINCT column_ref
} |
* )
Example
105
MIN
SELECT order_date, product, MAX (qty) FROM orders GROUP BY order_date, product ;
Notes
Specifying DISTINCT has no effect on the result. The argument column_ref or expression can be of any type. The result of the function is of the same data type as that of the argument. The result is NULL if the result set is empty or contains only NULL values.
MIN
Returns the minimum value in a group of values. Syntax
MIN (
{ [
ALL
expression
} | {
DISTINCT column_ref
Example
Notes
Specifying DISTINCT has no effect on the result. The argument column_ref or expression can be of any type. The result of the function is of the same data type as that of the argument. The result is NULL if the result set is empty or contains only NULL values.
MINUTE
Returns the minute value in the argument as a short integer in the range of 059. Syntax
MINUTE ( time_expression )
Example
106
MOD Notes The argument to the function must be of type TIME. The argument must be specified in the format HH:MI:SS. The result is of type SHORT. If the argument expression evaluates to NULL, the result is NULL.
MOD
Returns the remainder of expression1 divided by expression2. Syntax
MOD ( expression1 , expression2 )
Example
Notes
Both expression1 and expression2 must evaluate to exact numeric data types. If expression2 evaluates to zero, MOD returns zero.
MONTH
Returns the month in the year specified by the argument as a short integer value in the range of 112. Syntax
MONTH ( date_expression )
Example
Notes
107
MONTHNAME If date_expression is supplied as a time literal, it can be any of the valid date_literal formats where the day specification (DD) precedes the month specification (MM). The result is of type SHORT. If the argument expression evaluates to NULL, the result is NULL.
MONTHNAME
Returns a character string containing the name of the month (for example, January through December) for the month portion of date_expression. The argument date_expression can be the name of a column, the result of another scalar function, or a date or timestamp literal. Syntax
MONTHNAME ( date_expression )
Example
In this example, which illustrates the MONTHNAME function, the query returns all rows where the name of the month in the order_date column is equal to June:
SELECT * FROM orders WHERE order_no =346 and MONTHNAME(order_date)='JUNE'; ORDER_NO ORDER_DATE REFERENCE ------- ---------------346 06/01/2003 87/rd 1 record selected CUST_NO ------10002
MONTHS_BETWEEN
Computes the number of months between two date values corresponding to the first and second arguments. Syntax
MONTHS_BETWEEN ( date_expression, date_expression )
Example
108
NEXT_DAY
Notes
The first and second arguments to the function must be of type DATE. The result is of type INTEGER. The result is negative if the date corresponding to the second argument is greater than that corresponding to the first argument. If any of the argument expressions evaluates to NULL, the result is NULL.
NEXT_DAY
Returns the minimum date that is greater than the date corresponding to the first argument where the day of the week is the same as that specified by the second argument. Syntax
NEXT_DAY ( date_expression, day_of_week )
Example
Notes
The first argument to the function must be of type DATE. The second argument to the function must be of type CHARACTER. The result of the second argument must be a valid day of the week (SUNDAY, MONDAY etc.). The result is of type DATE. If any of the argument expressions evaluate to NULL, the result is NULL.
NEXTVAL
NEXTVAL returns a sequences next value. References to NEXTVAL increment the sequence value
by the defined increment and return the new value. Use the following syntax to reference the next value of a sequence: 109
NOW Syntax
schema.sequence.NEXTVAL
schema
Specifies the schema that contains the sequence. To refer to the next value of a sequence in the schema of another user, you must have SELECT object privilege on the sequence.
sequence
Specifies the name of the sequence whose next value you want.A statement referencing NEXTVAL for a noncycling sequence returns an error after reaching the maximum value. Use NEXTVAL in the:
SELECT SELECT VALUES SET
list of a SELECT statement not contained in a subquery or view list of a subquery in an INSERT statement clause of an INSERT statement
NEXTVAL
Example
A query of a view A SELECT statement with a GROUP BY clause that references a sequence A SELECT statement with an ORDER BY clause that references a sequence A SELECT statement that is combined with another SELECT statement with the UNION, or MINUS set operator The WHERE clause of a SELECT or UPDATE statement The DEFAULT value of a column in a CREATE TABLE or ALTER TABLE statement The condition of a CHECK constraint
INTERSECT,
In the following example, the sequence generator increments the customer sequence and uses its value for a new customer inserted into the table pub.customer:
INSERT INTO pub.customer VALUES (customer_sequence.NEXTVAL,USA,BackCountry Equipment,Sugar Hill Road,12A,Franconia,NH,03242,Dan Egan,603-762-2121,Kirsten Ulmner, 10000.00, 500.00,net 10, 0,contact monthly);
NOW
Returns the current date and time as a TIMESTAMP value. This function takes no arguments. Syntax
NOW ( )
110
NULLIF
Returns a NULL value for expression1 if it is equal to expression2. It is useful for converting values to NULL from applications that use some other representation for missing or unknown data. The NULLIF scalar function is a type of conditional expression. Syntax
NULLIF ( expression1, expression2 )
Example
This example uses the NULLIF scalar function to insert a NULL value into an address column if the host-language variable contains a single space character:
Notes
This function is not allowed in a GROUP BY clause. Arguments to this function cannot be query expressions. The NULLIF expression is shorthand notation for a common case that can also be represented in a CASE expression, as shown:
NVL
Returns the value of the first expression if the first expression value is not NULL. If the first expression value is NULL, the value of the second expression is returned. Syntax
NVL ( expression , expression )
Example
111
PI Notes The NVL function is not ODBC compatible. Use the IFNULL function when ODBC-compatible syntax is required. The first argument to the function can be of any type. The type of the second argument must be compatible with that of the first argument. The type of the result is the same as the first argument.
PI
Returns the constant value of PI as a floating-point value. Syntax
PI ( )
Example
POWER
Returns expression1 raised to the power of expression2. Syntax
POWER ( expression1 , expression2 )
Example
This example illustrates the POWER function, raising 3 to the second power:
Notes
expression1 expression2
must evaluate to a numeric data type. must evaluate to an exact numeric data type.
112
PREFIX
PREFIX
Returns the substring of a character string, starting from the position specified by start_pos and ending before the specified character. Syntax
PREFIX ( char_expression , start_pos , char_expression ) char_expression
Evaluates to a character string, typically a character-string literal or column name. If the expression evaluates to NULL, PREFIX returns NULL.
start_pos
Evaluates to an integer value. PREFIX searches the string specified in the first argument starting at that position. A value of 1 indicates the first character of the string.
char_expression
Evaluates to a single character. PREFIX returns the substring that ends before that character. If PREFIX does not find the character, it returns the substring beginning at start_pos, to the end of the string. If the expression evaluates to more than one character, PREFIX ignores all but the first character. Example The following example shows one way to use the PREFIX function:
create table prefix_table ( colstring varchar(20), colchar char(1) ); insert into prefix_table values ('string.with.dots', '.'); insert into prefix_table values ('string-with-dashes', '-'); select colstring, colchar, prefix(colstring, 1, '.') from prefix_table; COLSTRING --------------------string.with.dots string-with-dashes COLCHAR --------------------. prefix(COLSTRING,1,.) ---------------------string string-with-dashes
select colstring, colchar, prefix(colstring, 1, colchar) from prefix_table; COLSTRING --------------------string.with.dots string-with-dashes COLCHAR --------------------. prefix(COLSTRING,1,COLCHAR) ---------------------------string string
select colstring, colchar, prefix(colstring, 1, 'X') from prefix_table; COLSTRING --------------------string.with.dots string-with-dashes COLCHAR --------------------. prefix(COLSTRING,1,X) ---------------------string.with.dots string-with-dashes
113
PRO_ARR_DESCAPE function Note Each char_expression and the result can contain multi-byte characters. The start_pos argument specifies the character position, not a byte position. Character comparisons are case sensitive and are determined by sort weights in the collation table in the database. Compatibility Progress extension
PRO_ARR_DESCAPE function
Removes escape characters from a single element of a character array. PRO_ARR_DESCAPE scans the char_element looking for the separator character ( ; ) or an escape character ( ~ ). The function removes an escape character when it finds any of these constructs: Syntax
PRO_ARR_DESCAPE( 'char_element' ) ;
Escape character followed by a separator character ( ~; ) Escape character followed by another escape character ( ~~ ) Escape character followed by a NULL terminator ( ~\0 )
char_element
The character representation of an array element, without any leading or trailing separators. Must be data type NVARCHAR, VARCHAR, or CHAR. Examples The following example returns the string 'aa;aa':
PRO_ARR_DESCAPE('aa~;aa') ;
The following example returns the string 'aa~aa'. There is no change, since another special character does not follow the escape character:
PRO_ARR_DESCAPE('aa~aa') ;
PRO_ARR_DESCAPE('aa~;aa') ;
Note
char_element
should not be the name of an array column, since the column contains true separators that would be destroyed by this function.
114
PRO_ARR_ESCAPE function
PRO_ARR_ESCAPE function
Adds required escape characters to a single element of a character array. looking for the separator character ( ; ) or an escape character ( ~ ). The function inserts an additional escape character when it finds any of these constructs: Syntax
PRO_ARR_ESCAPE( 'char_element' ) char_element ; PRO_ARR_ESCAPE scans the char_element
Escape character followed by a separator character ( ~; ) Escape character followed by another escape character ( ~~ ) Escape character followed by a NULL terminator ( ~\0 )
The character representation of an array element, without any leading or trailing separators. Must be data type NVARCHAR, or VARCHAR, or CHAR. Examples The following example returns the string 'aa~;aa':
PRO_ARR_ESCAPE('aa;aa') ;
The following example returns the string 'aa~aa'. There is no change, since another special character does not follow the escape character:
PRO_ARR_ESCAPE('aa~aa') ;
PRO_ARR_ESCAPE(aa~;aa) ;
Notes
char_element char_element
must not be the name of an array column, since the column contains true separators that would be destroyed by this function.
PRO_ELEMENT function
Extracts one or more elements from an array column and returns the NVARCHAR or VARCHAR string between the specified positions, including any internal separator characters and any internal escape characters.
115
QUARTER Syntax
PRO_ELEMENT ( 'array_style_expression', start_position, end_position ) ; array_style_expression
A string of data type VARCHAR or CHAR, with a semicolon ( ; ) separating each element of the array.
start_position
The position in the string marking the beginning of the element PRO_ELEMENT is to extract.
end_position
The position in the string marking the end of the element to be extracted. Examples The following example returns the string 'bb':
PRO_ELEMENT('aa;bb;cc', 2, 2) ;
PRO_ELEMENT('aa;bb;cc', 1, 2) ;
PRO_ELEMENT('aa~;aa;bb;cc', 1, 1) ;
Notes
The array_style_expression must be data type NVARCHAR, VARCHAR, or CHAR. The returned string does not include the leading separator of the first element, or the trailing separator ( ; ) of the last element. Even if you are extracting only one element, the escape characters are included in the result. You must invoke PRO_ARR_DESCAPE to remove any escape characters.
QUARTER
Returns the quarter in the year specified by the argument as a short integer value in the range of 14. Syntax
QUARTER ( date_expression )
Example
In this example, which illustrates the QUARTER function, the query requests all rows in the orders table where the order_date is in the third quarter of the year:
116
RADIANS
Notes
The argument to the function must be of type DATE. If date_expression is supplied as a date literal, it can be any of the valid date_literal formats where the day specification (DD) precedes the month specification (MM). The result is of type SHORT. If the argument expression evaluates to NULL, the result is NULL.
RADIANS
Returns the number of radians in an angle specified in degrees by expression. Syntax
RADIANS ( expression )
Example
Notes
expression expression
RAND
Returns a randomly generated number, using expression as an optional seed value. Syntax
RAND (
expression
Example
This example illustrates the RAND function, supplying an optional seed value of 3:
117
REPEAT
Note
expression
REPEAT
Returns a character string composed of string_exp repeated count times. Syntax
REPEAT ( string_exp , count )
Example
SELECT REPEAT(fld1,3) FROM test100WHERE fld1 = 'Afghanistan'; REPEAT(FLD1,3) ----------------AfghanistanAfghanistanAfghanistan 1 record selected
Notes
The string_exp can be of the type fixed-length or variable-length CHARACTER. The count can be of type INTEGER, SMALLINT, or TINYINT. If any of the arguments of the expression evaluates to a NULL, the result is NULL. If the count is negative or zero, the result evaluates to NULL.
string_exp
REPLACE
Replaces all occurrences of string_exp2 in string_exp1 with string_exp3. Syntax
REPLACE ( string_exp1 , string_exp2 , string_exp3 )
118
RIGHT Example This example illustrates the REPLACE function, replacing the letters mi in the last_name Smith with the letters moo:
SELECT REPLACE ( last_name,'mi','moo' ) FROM customer WHERE last_name = 'Smith'; REPLACE(LAST_NAME,MI,MOO) ------------------------Smooth 1 record selected
Notes
string_exp
If any of the arguments of the expression evaluates to NULL, the result is NULL. If the replacement string is not found in the search string, it returns the original string. Each occurrence of string_exp and the result can contain multi-byte characters. Character comparisons are case sensitive and are determined by sort weights in the collation table in the database.
RIGHT
Returns the rightmost count of characters of string_exp. Syntax
RIGHT ( string_exp , count )
Example
This example illustrates the RIGHT function, selecting the rightmost six letters from the string Afghanistan:
Notes
The string_exp can be fixed-length or variable-length CHARACTER data types. The count can be INTEGER, SMALLINT, or TINYINT data types. If any of the arguments of the expression evaluate to NULL, the result is NULL. If count is negative, the result evaluates to NULL.
119
ROUND
string_exp and the result can contain multi-byte characters. count represents the number of characters.
ROUND
Returns the rounded value of a numeric expression. Syntax
ROUND ( num_expression
[,
rounding_factor
])
Example
In each case the num_expression is 2953861.8320. In the first call the rounding_factor is 2, in the second call the rounding_factor is -2, in the third call the rounding_factor is 0, and in the fourth call no rounding_factor is specified. Notes
num_expression num_expression INTEGER TINYINT SMALLINT NUMBER FLOAT DOUBLE PRECISION
must be numeric or must be convertible to numeric. must be one of these supported data types:
If the data type of num_expression is not a supported type, ROUND returns an error message. The num_expression is rounded to the next higher digit when:
120
ROWID The digit before a negative rounding_factor is 5 or greater The digit after a positive rounding_factor is 5 or greater
The num_expression is rounded to the next lower digit when: The digit before a negative rounding_factor is 4 or less The digit after a positive rounding_factor is 4 or less
is an integer between 32 and +32 inclusive, and indicates the digit position to which you want to round num_expression. Figure 1 illustrates how the digit positions are numbered. In the figure, the num_expression is 2953861.8320.
rounding_factor
2953861 .8320
Position -2 Position 0 Position 2
Figure 1:
If you do not specify a rounding_factor, the function rounds num_expression to digit 0 (the ones place). To round to the right of the decimal point, specify a positive rounding_factor. To round to the left of the decimal, specify a negative rounding_factor.
ROWID
Returns the row identifier of the current row in a table. This function takes no arguments. The ROWID of a row is determined when the row is inserted into the table. Once assigned, the ROWID remains the same for the row until the row is deleted. At any given time, each row in a table is uniquely identified by its ROWID. Using its ROWID is the most efficient way of selecting the row. Syntax
ROWID
Example
This example illustrates the ROWID function, returning all columns from the row in the customers table where the ROWID = 10:
121
RPAD
Note
The ROWID function returns a string of up to 19 characters in length. Compatibility Progress extension
RPAD
Pads the character string corresponding to the first argument on the right with the character string corresponding to the third argument. After the padding, the length of the result is equal to the value of the second argument length. Syntax
RPAD ( char_expression, length
, pad_expression
Example
SELECT RPAD (last_name, 30) FROM customer ; SELECT RPAD (last_name, 30, '.') FROM customer ;
Notes
The first argument to the function must be of type CHARACTER. The second argument to the function must be of type INTEGER. The third argument, if specified, must be of type CHARACTER. If the third argument is not specified, the default value is a string of length 1 containing one blank. If L1 is the length of the first argument and L2 is the value of the second argument: If L1 is less than L2, the number of characters padded is equal to L2 minus L1. If L1 is equal to L2, no characters are padded and the result string is the same as the first argument. If L1 is greater than L2, the result string is equal to the first argument truncated to the first L2 characters.
The result is of type CHARACTER. If the argument expression evaluates to NULL, the result is NULL. and pad_expression can contain multi-byte characters. length represents the number of characters in the result.
char_expression
122
RTRIM
Removes all the trailing characters in char_expression that are present in char_set and returns the resultant string. The last character in the result is guaranteed not to be in char_set. If you do not specify a char_set, trailing blanks are removed. Syntax
RTRIM ( char_expression
, char_set
Example
SELECT RPAD ( RTRIM (addr, ' '), 30, '.') FROM customer ;
Notes
The first argument to the function must be of type CHARACTER. The second argument to the function must be of type CHARACTER. The result is of type CHARACTER. If the argument expression evaluates to NULL, the result is NULL. The char_expression, the character set specified by char_set, and the result can contain multi-byte characters. Character comparisons are case sensitive and are determined by the collation table in the database.
SECOND
Returns the seconds in the argument as a short integer value in the range of 059. Syntax
SECOND ( time_expression )
Example
This example illustrates the SECOND function, requesting all columns from rows in the arrivals table where the in_time column is less than or equal to 40:
123
SIGN Notes The argument to the function must be of type TIME. The argument must be specified in the format HH:MI:SS. The result is of type SHORT. If the argument expression evaluates to NULL, the result is NULL.
SIGN
Returns 1 if expression is positive, -1 if expression is negative, or zero if expression is zero. Syntax
SIGN ( expression )
Example
Note
expression
SIN
Returns the sine of expression. Syntax
SIN ( expression )
Example
select sin(45 * pi()/180) 'Sine of 45 degrees' from MYMATH; SINE OF 45 DEGREES -----------------0.707106781186547 1 record selected
124
SQRT Notes SIN takes an angle (expression) and returns the ratio of two sides of a right triangle. The ratio is the length of the side opposite the angle divided by the length of the hypotenuse.
expression expression
To convert degrees to radians, multiply degrees by Pi/180. To convert radians to degrees, multiply radians by 180/Pi.
SQRT
Returns the square root of expression. Syntax
SQRT ( expression )
Example
This example illustrates the SQRT function, requesting the square root of the value 28:
Notes
SUBSTR
Returns the substring of the character string corresponding to the first argument starting at start_pos and length characters long. If the third argument length is not specified, the substring starting at start_pos up to the end of char_expression is returned. Syntax
SUBSTR ( char_expression, start_pos
, length
Example
125
SUBSTR
SELECT last_name, '(', SUBSTR (phone, 1, 3) , ')', SUBSTR (phone, 4, 3), '-', SUBSTR (phone, 7, 4) FROM customer ;
Notes
The first argument must be of type CHARACTER. It can be any meaningful character value (for example, a literal expression, database column, or parameter). The second argument must be of type INTEGER. It indicates the starting position from which the substring result is extracted. The third argument, if specified, must be of type INTEGER. It indicates the number of characters the substring function will extract. The values for specifying position in the character string start from 1. The first character in a string is at position 1, the second character is at position 2, and so on. The result is of type CHARACTER. If any of the argument expressions evaluate to NULL, the result is NULL.
char_expression
If the value of start_pos is: Smaller than 0, the function returns a Bad argument error Bigger than the actual length of the string value, the function returns an empty zero length substring
If the value of length is: Smaller than 0, the function returns a Bad argument error. Bigger than the actual length of the substring (from start_pos to the end of the literal), the function returns the substring from start_pos to the end of the literal. Bigger than the actual length of the substring (from start_pos up to the end of the columns row data), the function returns the substring from the start_pos to the end of the columns row data. The function returns this, even when the substring result exceeds the columns SQL width. Bigger than 0 and the columns row data exceeds the columns SQL width, the function returns the substring.
If length is not specified, the function returns the substring from start_pos to the end of the literal.
Note
The function returns the end of the columns row data if the length of the substring is not bigger than the columns SQL width. Otherwise, the function returns the substring truncated to the columns SQL width. Compatibility Progress extension
126
, length
Example
SELECT last_name, '(', SUBSTRING (phone, 1, 3) , ')', SUBSTRING (phone, 4, 3), '-', SUBSTRING (phone, 7, 4) FROM customer ;
Notes
The first argument must be of type CHARACTER. It can be any meaningful character value (for example, a literal expression, database column, or parameter). The second argument must be of type INTEGER. It indicates the starting position from which the substring result is extracted. The third argument, if specified, must be of type INTEGER. It indicates the number of characters the substring function will extract. The values for specifying position in the character string start from 1. The first character in a string is at position 1, the second character is at position 2, and so on. The result is of type CHARACTER. If any of the argument expressions evaluate to NULL, the result is NULL.
char_expression
If the value of start_pos is: Smaller than 0, the function returns a Bad argument error Bigger than the actual length of the string value, the function returns an empty zero length substring
If the value of length is: Smaller than 0, the function returns a Bad argument error. Bigger than the actual length of the substring (from start_pos to the end of the literal), the function returns the substring from start_pos to the end of the literal. Bigger than the actual length of the substring (from start_pos up to the end of the columns row data), the function returns the substring from the start_pos to the end of the columns row data. The function returns this, even when the substring result exceeds the columns SQL width.
127
SUFFIX Bigger than 0 and the columns row data exceeds the columns SQL width, the function returns the substring.
If length is not specified, the function returns the substring from start_pos to the end of the literal. The function returns the end of the columns row data if the length of the substring is not bigger than the columns SQL width. Otherwise, the function returns the substring truncated to the columns SQL width.
SUFFIX
Returns the substring of a character string starting after the position specified by start_pos and the second char_expression, to the end of the string. Syntax
SUFFIX (char_expression , start_pos , char_expression ) char_expression
Evaluates to a character string, typically a character-string literal or column name. If the expression evaluates to NULL, SUFFIX returns NULL.
start_pos
Evaluates to an integer value. SUFFIX searches the string specified in the first argument starting at that position. A value of 1 indicates the first character of the string.
char_expression
Evaluates to a single character. SUFFIX returns the substring that begins with that character. If SUFFIX does not find the character after start_pos, it returns NULL. If the expression evaluates to more than one character, SUFFIX ignores all but the first character. Example This example illustrates two ways to use the SUFFIX function:
128
SUM
2 records selected
SELECT C1, C2, SUFFIX(C1, 1, C2) FROM T1; C1 C2 --test.pref pref.test SUFFIX(C1,1,C ------------. pref s t
2 records selected
Note
Each char_expression and the result can contain multi-byte characters. The start_pos argument specifies the character position, not a byte position. Character comparisons are case sensitive and are determined by sort weights in the collation table in the database. Compatibility Progress extension
SUM
Returns the sum of the values in a group. The keyword DISTINCT specifies that the duplicate values are to be eliminated before computing the sum. Syntax
SUM (
{ [ALL]
expression
}| {
DISTINCT column_ref
Example
Notes
The argument column_ref or expression can be of any type. The result of the function is of the same data type as that of the argument except that the result is of type INTEGER when the argument is of type SMALLINT or TINYINT. The result can have a NULL value.
129
SYSDATE
SYSDATE
Returns the current date as a DATE value. This function takes no arguments, and the trailing parentheses are optional. Syntax
SYSDATE
( )
Example
This example illustrates the SYSDATE function, inserting a new row into the objects table, setting the create_date column to the value of the current date:
INSERT INTO objects (object_owner, object_id, create_date) VALUES (USER, 1001, SYSDATE) ;
SYSTIME
Returns the current time as a TIME value to the nearest second. This function takes no arguments, and the trailing parentheses are optional. SQL statements can refer to SYSTIME anywhere they can refer to a TIME expression. Syntax
SYSTIME
( )
Example
This example illustrates the SYSTIME function, inserting a new row into the objects table, setting the create_time column to the value of the current time:
INSERT INTO objects (object_owner, object_id, create_time) VALUES (USER, 1001, SYSTIME) ;
SYSTIMESTAMP
Returns the current date and time as a TIMESTAMP value. This function takes no arguments, and the trailing parentheses are optional. Syntax
SYSTIMESTAMP
( )
130
TAN Example This example illustrates different formats for SYSDATE, SYSTIME, and SYSTIMESTAMP:
TAN
Returns the tangent of expression. Syntax
TAN ( expression )
Example
select tan(45 * pi()/180) 'Tangent of 45 degrees' from MYMATH; TANGENT OF 45 DEGREES --------------------1.000000000000000 1 record selected
Notes
TAN takes an angle (expression) and returns the ratio of two sides of a right triangle. The
ratio is the length of the side opposite the angle divided by the length of the side adjacent to the angle.
expression
TO_CHAR
expression
To convert degrees to radians, multiply degrees by Pi/180. To convert radians to degrees, multiply radians by 180/Pi.
TO_CHAR
Converts the given expression to character form and returns the result. The primary use for TO_CHAR is to format the output of date-time expressions through the format_string argument. Syntax
TO_CHAR ( expresion
, format_string
expression
Converts to character form. It must evaluate to a value of the date or time data type to use the format_string.
format_string
Specifies the format of the output. SQL ignores the format string if the expression argument does not evaluate to a date or time. Notes The first argument to the function can be of any type. The second argument, if specified, must be of type CHARACTER. The result is of type CHARACTER. The format argument can be used only when the type of the first argument is DATE. If any of the argument expressions evaluates to NULL, the result is NULL.
TO_DATE
Converts the given date literal to a date value. Syntax
TO_DATE ( date_literal )
Example
This example illustrates the TO_DATE function, returning all columns from rows in the orders table where the order_date column is earlier or equal to the date 12/31/2003:
132
TO_NUMBER
Notes
The result is of type DATE. Supply the date literal in any valid format.
TO_NUMBER
Converts the given character expression to a number value. Syntax
TO_NUMBER ( char_expression )
Example
This example illustrates the TO_NUMBER function and the SUBSTR function:
Notes
The argument to the function must be of type CHARACTER. The result is of type NUMERIC. If any of the argument expressions evaluates to NULL, the result is NULL.
TO_TIME
Converts the given time literal to a time value. Syntax
TO_TIME ( time_literal )
Example
The following example shows how to use the TO_DATE and the TO_TIME functions:
133
TO_TIMESTAMP
SELECT * FROM orders WHERE order_date < TO_DATE ('05/15/2003') AND order_time < TO_TIME ('12:00:00') ;
Notes
The result is of type TIME. Supply the time literal in any valid format.
TO_TIMESTAMP
Converts the given timestamp literal to a timestamp value. Syntax
TO_TIMESTAMP ( timestamp_lit )
Example
Notes
The result is of type TIME. Supply the timestamp literal in any valid format.
TRANSLATE
Translates each character in char_expression that is in from_set to the corresponding character in to_set. The translated character string is returned as the result. Syntax
TRANSLATE ( char_expression , from_set , to_set )
Example
134
UCASE
SELECT TRANSLATE (customer_name, ' ', '_') "TRANSLATE Example" from customers; TRANSLATE EXAMPLE ----------------Sports_Cars_Inc.__________________________________ Mighty_Bulldozer_Inc._____________________________ Ship_Shapers_Inc._________________________________ Tower_Construction_Inc.___________________________ Chemical_Construction_Inc.________________________ Aerospace_Enterprises_Inc.________________________ Medical_Enterprises_Inc.__________________________ Rail_Builders_Inc.________________________________ Luxury_Cars_Inc.__________________________________ Office_Furniture_Inc._____________________________ 10 records selected
Notes
char_expression, from_set,
For each character in char_expression, TRANSLATE checks for the same character in from_set. If it is in from_set, TRANSLATE translates it to the corresponding character in to_set (if the character is the nth character in from_set, the nth character in to_set). If the character is not in from_set TRANSLATE does not change it. If from_set is longer than to_set, TRANSLATE does not change trailing characters in that do not have a corresponding character in to_set.
from_set
UCASE
Returns the result of the argument character expression after converting all the characters to uppercase. UCASE is identical to UPPER, but provides ODBC-compatible syntax. Syntax
UCASE ( char_expression )
Example
This example illustrates the UCASE function, returning columns from rows in the customer table where the last_name column, after being converted to uppercase, is equal to SMITH:
Notes
UPPER The result is of type CHARACTER. If the argument expression evaluates to NULL, the result is NULL. A char_expression and the result can contain multi-byte characters. The uppercase conversion is determined by the case table in the convmap file. The default case table is BASIC.
UPPER
Returns the result of the argument character expression after converting all the characters to uppercase. Syntax
UPPER ( char_expression )
Example
This example illustrates the UPPER function, returning columns from rows in the customer table where the last_name column, after being converted to uppercase, is equal to SMITH:
Notes
The argument to the function must be of type CHARACTER. The result is of type CHARACTER. If the argument expression evaluates to NULL, the result is NULL. A char_expression and the result can contain multi-byte characters. The uppercase conversion is determined by the case table in the convmap file. The default case table is BASIC.
USER
Returns a character-string identifier for the user of the current transaction, as determined by the host operating system. This function takes no arguments, and the trailing parentheses are optional.
136
WEEK Syntax
USER
( )
Note
SQL statements can refer to USER anywhere they can refer to a character string expression. Compatibility ODBC compatible
WEEK
Returns the week of the year as a short integer value in the range of 153. Syntax
WEEK ( time_expression )
Example
The query returns all columns from rows in the orders table where the order_date is in the fifth week of the year. This example illustrates the WEEK function:
Notes
The argument to the function must be of type DATE. If date_expression is supplied as a date literal, it can be any of the valid date_literal formats where the day specification (DD) precedes the month specification (MM). The result is of type SHORT. If the argument expression evaluates to NULL, the result is NULL.
YEAR
Returns the year as a short integer value in the range of 09999. Syntax
YEAR ( date_expression )
Example
The query returns all columns in rows in the orders table where the year in the order_date column is equal to 2003. This example illustrates the YEAR function:
137
YEAR
Notes
The argument to the function must be of type DATE. If date_expression is supplied as a date literal, it can be any of the valid date_literal formats where the day specification (DD) precedes the month specification (MM). The result is of type SHORT. If the argument expression evaluates to NULL, the result is NULL.
138
This section provides a list of words that have special syntactic meaning to SQL and cannot be used as identifiers for constants, variables, cursors, types, tables, records, subprograms, or packages.
(1 of 4)
(2 of 4)
CHARACTER_LENGTH CHR COALESCE COMMIT CONSTRAINT COUNT CURRENT CURTIME DATE DAYOFYEAR DECIMAL DEFINITION DIFFERENCE DROP ESCAPE EXISTS FILE FOREIGN GREATEST IDENTIFIED INDEXPAGES INOUT INTEGER ISOLATION LCASE LEVEL LOCK LOWER LVARCHAR MIN MOD
140
(3 of 4)
PRO_CLIENT_FIELD _TRIGGER PRO_CRC PRO_DELETE PRO_ENABLE_64BIT _SEQUENCES PRO_FROZEN PRO_LOB_SIZE_TEXT PRO_OVERRIDEABLE PRO_REPL_WRITE PRO_SA_INITIAL PRO_SQL_WIDTH PRO_VALEXP PRO_WRITE RADIANS REAL RENAME RESTRICT RIGHT
141
(4 of 4)
SQL_LONGVARBINARY SQL_SMALLINT SQL_TSI_DAY SQL_TSI_MONTH SQL_TSI_YEAR STATEMENT STORE_IN_SQLENG SUM SYSTIME TABLE TIMESTAMP TO TO_NUMBER TRANSACTION UCASE UPDATE USER_NAME VARBINARY WAIT WITH
142
This section provides information on error messages generated by the various components of OpenEdge SQL. Error message information includes: Error code SQLSTATE value Class condition Subclass message
Overview
In addition to the OpenEdge-specific error codes, error conditions have an associated SQLSTATE value. SQLSTATE is a five-character status parameter whose value indicates the condition status returned by the most recent SQL statement. The first two characters of the SQLSTATE value specify the class code and the last three characters specify the subclass code: Class codes of ah and 04 are reserved by the SQL standard. For those class codes only, subclass codes of ah and 04 are also reserved by the standard. Subclasses S and T and class IM are reserved by the ODBC standard. Class codes of iz and 59 are specific to database implementations such as OpenEdge SQL. All subclass codes in those classes are implementation defined except as noted for ODBC.
Error code 00000 100L 10002 10012 10013 10100 10101 10102 10104 10107 10108 10301 10400 10920 11100 11102 11103 11104 11105 11109 11111
Class condition Successful completion No data Data exception Flag Data Exception Cardinality violation OpenEdge/SQL MM error Integrity constraint OpenEdge/SQL rss error Flag OpenEdge/SQL rds error OpenEdge/SQL rss error Data exception Data exception OpenEdge/SQL rds error OpenEdge/SQL rds error OpenEdge/SQL rds error OpenEdge/SQL rds error OpenEdge/SQL rds error OpenEdge/SQL rds error OpenEdge/SQL rds error
Subclass message ***status okay. **sql not found. Tuple not found for the Specified TID. ETPL_SCAN_EOP. No more records to be fetched. Too many fields exist. No more records exist. Duplicate primary/index key value. Specified index method is not supported. EIX_SCAN_EOP flag is set. Duplicate record specified. Table is locked and LCK_NOWAIT. Invalid file size for alter log statement. Already existing value specified. Invalid transaction id. TDS area specified is not found. TDS not found for binding. Transaction aborted. Transaction error. Invalid transaction handle. Invalid isolation level.
144
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value M0M00 M0M01 22701 70702 70703 22704 70705 70706 70707 70708 70709 70710 70711 70712 70713 70714 70715 70716 70717 70718 70719 70720 70721 70722 70723 70724 70725 (2 of 16)
Error code 11300 11301 16001 16002 16003 16004 16005 16006 16007 16008 16009 16010 16011 16012 16020 16021 16022 16023 16024 16025 16026 16027 16028 16030 16031 16032 16033
Class condition OpenEdge/SQL rss error OpenEdge/SQL rss error Data exception OpenEdge SQLMM error OpenEdge SQLMM error Data exception OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error
Subclass message Specified INFO type is not supported. Specified index type is not supported. MM No data block. MM Bad swap block. MM No cache block. MM Invalid row number. MM Invalid cache block. MM Bad swap file. MM Row too big. MM Array initialized. MM Invalid chunk number. MM Cannot create table. MM Cannot alter table. MM Cannot drop table. MM TPL ctor error. MM Insertion error. MM Deletion error. MM Updation error. MM Fetching error. MM Sorting error. MM Printing error. MM TPLSCAN ctor error. MM Scan fetching error. MM Cant create index. MM Cant drop index. MM IXSCAN ctor error. MM IX ctor error. 145
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value 70726 70727 70728 70729 70730 70731 40000 70732 70733 70734 70735 70736 70737 50501 50502 50503 2a504 28505 22506 22507 22508 22509 22510 22511 22512 22513 22514 (3 of 16)
Error code 16034 16035 16036 16037 16040 16041 16042 16043 16044 16045 16050 16051 16054 20000 20001 20002 20003 20004 20005 20006 20007 20008 20009 20010 20011 20012 20013
Class condition OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error Transaction rollback OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL MM error OpenEdge SQL rds error OpenEdge SQL rds error OpenEdge SQL rds error Syntax error Invalid auth specs Data exception Data exception Data exception Data exception Data exception Data exception Data exception Data exception Data exception
Subclass message MM IX deletion error. MM IX appending error. MM IX insertion error. MM IX scan fetching error. MM Begin transaction. MM Commit transaction. ***MM Rollback transaction. MM Mark point. MM Rollback savepoint. MM Set & Get isolation. MM TID to char. MM Char to TID. MM Bad value list size to indirect sort. SQL internal error. Memory allocation failure. Open database failed. Syntax error. User not found. Table/View/Synonym not found. Column not found/specified. No columns in table. Inconsistent types. Column ambiguously specified. Duplicate column specification. Invalid length. Invalid precision. Invalid scale.
146
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value 22515 22516 22517 22518 22519 50520 42521 42522 42523 42524 0a000 42526 50527 42528 50529 50530 22531 50532 50533 22534 50535 (4 of 16)
Error code 20014 20015 20016 20017 20018 20019 20020 20021 20022 20023 20024 20025 20026 20027 20028 20029 20030 20031 20032 20033 20034
Class condition Data exception Data exception Data exception Data exception Data exception OpenEdge SQL rds error Access rule violation Access rule violation Access rule violation Access rule violation Feature not supported Access rule violation OpenEdge SQL rds error Access rule violation OpenEdge SQL rds error OpenEdge SQL rds error Data exception OpenEdge SQL rds error OpenEdge SQL rds error Data exception OpenEdge SQL rds error
Subclass message Missing input parameters. Subquery returns multiple rows. Null value supplied for a mandatory (not null) column. Too many values specified. Too few values specified. Cannot modify table referred to in subquery. Bad column specification for group by clause. Non-group-by expression in having clause. Non-group-by expression in select clause. Aggregate function not allowed here. Sorry, operation not yet implemented. Aggregate functions nested. Too many table references. Bad field specification in order by clause. An index with the same name already exists. Index referenced not found. Table space with same name already exists. Cluster with same name already exists. No cluster with this name. Table space not found. Bad free <specification_name> specification.
147
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value 50536 07537 24538 24539 24540 24541 22542 2a543 50544 50545 08546 50547 42548 42549 22550 21551 21552 22553 08554 08555 08556 28557 28558 40559 (5 of 16)
Error code 20035 20036 20037 20038 20039 20040 20041 20042 20043 20044 20045 20046 20047 20048 20049 20050 20051 20052 20053 20054 20055 20056 20057 20058
Class condition OpenEdge SQL rds error Dynamic sql error Invalid cursor state Invalid cursor state Invalid cursor state Invalid cursor state Data exception Syntax error OpenEdge SQL rds error OpenEdge SQL rds error Connection exception OpenEdge SQL rds error Access rule violation Access rule violation Data exception Cardinality violation Cardinality violation Data exception Connection exception Connection exception Connection exception Invalid auth specs Invalid auth specs Transaction rollback
Subclass message At least column spec or null clause should be specified. Not prepared. Executing select statement. Cursor not closed. Open for nonselect statement. Cursor not opened. Table/View/Synonym already exists. Distinct specified more than once in query. Tuple size too high. Array size too high. File does not exist or not accessible. Field value not null for some tuples. Granting to self not allowed. Revoking for self not allowed. Keyword used for a name. Too many fields specified. Too many indexes on this table. Overflow error. Database not opened. Database not specified or improperly specified. Database not specified or database not started. No DBA access rights. No RESOURCE privileges. Executing SQL statement for an aborted transaction.
148
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value 22560 22561 22562 42563 50564 08565 26000 33567 08568 42569 33570 33571 42572 50573 2a574 2a575 21576 21577 42578 42579 50580 44581 (6 of 16)
Error code 20059 20060 20061 20062 20063 20064 20065 20066 20067 20068 20069 20070 20071 20072 20073 20074 20075 20076 20077 20078 20079 20080
Class condition Data exception Data exception Data exception Syntax error OpenEdge SQL rds error Connection exception Invalid SQL statement name Invalid SQL descriptor name Connection exception Syntax error Invalid SQL descriptor name Invalid SQL descriptor name Access rule violation OpenEdge SQL rds error Access rule violation Access rule violation Cardinality violation Cardinality violation Access rule violation Access rule violation OpenEdge SQL rds error Check option violation
Subclass message No files in the table space. Table not empty. Input parameter size too high. Full pathname not specified. Duplicate file specification. Invalid attach type. Invalid statement type. Invalid sqlda. More than one database cannot be attached locally. Bad arguments. SQLDA size not enough. SQLDA buffer length too high. Specified operation not allowed on the view. Server is not allocated. View query specification for view too long. View column list must be specified as expressions are given. Number of columns in column list is less than in select list. Number of columns in column list is more than in select list. Check option specified for noninsertable view. Given SQL statement is not allowed on the view. More tables cannot be created. View check option violation.
149
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value 22582 (7 of 16)
Subclass message Number of expressions projected on either side of set-op do not match. Column names not allowed in order by clause for this statement. Outerjoin specified on a complex predicate. Outerjoin specified on a sub-query. Invalid Outerjoin specification. Duplicate table constraint specification. Column count mismatch. Invalid user name. System date retrieval failed. Table column list must be specified as expressions are given. Query statement too long. No tuples selected by the subquery for update. Synonym already exists. Database link with same name already exists. Database link not found. Connect String not specified/incorrect. Specified operation not allowed on a remote table. More than one row selected by the query. Cursor not positioned on a valid row. Subquery not allowed here. No references for the table.
20082 20083 20084 20085 20086 20087 20088 20089 20090 20091 20092 20093 20094 20095 20096 20097 20098 20099 20100 20101
42583 42584 42585 42586 42587 21588 28589 22590 42591 2a592 2d593 22594 hz595 hz596 08597 hz598 22599 24000 4250a 2350b
Access rule violation Access rule violation Access rule violation Access rule violation Access rule violation Cardinality violation Invalid auth specs Data exception Access rule violation Access rule violation Invalid transaction termination Data exception Remote database access Remote database access Connection exception Remote database access Data exception Invalid cursor state Access rule violation Integrity constraint
150
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value 2350c 2350d 2350e 5050f 2150g hz50h 0850i hz50j 0850k 33002 5050l 2350m 2350n 4250o 2350p 22000 5050q 5050r 5050s 5050t 0750u 34000 07001 (8 of 16)
Error code 20102 20103 20104 20105 20106 20107 20108 20109 20110 20114 20115 20116 20117 20118 20119 20120 20121 20122 20123 20124 20125 20126 20127
Class condition Integrity constraint Integrity constraint Integrity constraint OpenEdge SQL rds error Cardinality violation Remote database access Connection exception Remote database access Connection exception Invalid SQL descriptor name OpenEdge SQL rds error Integrity constraint Integrity constraint Access rule violation Integrity constraint Data exception OpenEdge SQL rds error OpenEdge SQL rds error OpenEdge SQL rds error OpenEdge SQL rds error Dynamic sql-error Invalid cursor name Dynamic sql-error
Subclass message Primary/Candidate key column defined null. No matching key defined for the referenced table. Keys in reference constraint incompatible. Not allowed in read only isolation level. Invalid ROWID. Remote database not started. Remote Network Server not started. Remote database name not valid. TCP/IP Remote HostName is unknown. Fetched Value NULL & indicator var not defined. References to the table/record present. Constraint violation. Table definition not complete. Duplicate constraint name. Constraint name not found. **Use of reserved word. Permission denied. Procedure not found. Invalid arguments to procedure. Query conditionally terminated. Number of open cursors exceeds limit. ***Invalid cursor name. Bad parameter specification for the statement. 151
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value 2250x 2250y 5050u 5050v 5050x m0m01 5050z 50514 50513 50512 85001 86001 86002 86003 86004 86005 86006 86007 22001 22P0 (9 of 16)
Error code 20128 20129 20132 20134 20135 20135 20136 20137 20138 20140 20141 20142 20143 20144 20145 20146 20147 20148 20152 20170
Class condition Data Exception Data Exception OpenEdge SQL rds error OpenEdge SQL rds error OpenEdge SQL rds error OpenEdge SQL diagnostics error OpenEdge SQL rds error OpenEdge SQL rds error OpenEdge SQL rds error OpenEdge SQL rds error OpenEdge SQL Stored procedure Compilation OpenEdge SQL Stored procedure Execution OpenEdge SQL Stored procedure Execution OpenEdge SQL Stored procedure Execution OpenEdge SQL Stored procedure Execution OpenEdge SQL Triggers OpenEdge SQL Triggers OpenEdge SQL Triggers Data exception Data exception
Subclass message Numeric value out of range. Data truncated. Revoke failed because of restrict. Invalid long data type column references. Contains operator is not supported in this context. Diagnostics statement failed. Contains operator is not supported for this datatype. Index is not defined or does not support CONTAINS. Index on long fields requires that it can push down only CONTAINS. Procedure already exists. Error in stored procedure compilation. Error in Stored Procedure Execution. Too many recursions in call procedure. Null value fetched. Invalid field reference. Trigger with this name already exists. Trigger with this name does not exist. Trigger Execution Failed. Character string is too long. An invalid reference to a sequence was used.
152
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value 22565 0ALLV 86010 (10 of 16)
Class condition Data exception Feature not supported OpenEdge SQL Triggers
Subclass message Sequence already exists in current schema. LIKE predicate for long data type uses unsupported feature. Invalid colnum number specified for Trigger OLDROW/NEWROW getValue/setValue method. Incompatible data type specified for Trigger OLDROW/NEWROW getValue/setValue method. IO error while compiling stored procedure/trigger. Cannot rename table/column with check constraint. Long data exceeds column width. Long data exceeds maximum size of data that can be selected. Remote procedure call error. SQL client bind to daemon failed. SQL client bind to SQL server failed. SQL NETWORK service entry is not available. Invalid TCP/IP hostname. Invalid remote database name. Network error on server. Invalid protocol. ***Invalid connection name. Duplicate connection name. No active connection. No environment defined database. Multiple local connections. Invalid protocol in connect_string.
20175
86011
20176 20178 20180 20181 20211 20212 20213 20214 20215 20216 20217 20218 20219 20220 20221 20222 20223 20224
85001 OaC01 22915 22916 22800 08801 08802 08803 08804 hz805 08806 08807 2e000 08809 08810 08811 08812 08813
OpenEdge SQL Stored proc/Trigger Feature not supported Data exception Data exception Data exception Connection exception Connection exception Connection exception Connection exception Remote database access Connection exception Connection exception Invalid connection name Connection exception Connection exception Connection exception Connection exception Connection exception
153
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value 08814 80815 08816 28817 22818 22819 22820 22821 22822 22523 22007 22012 22615 2c000 5050y 08815 90901 90902 90903 90904 90905 22563 (11 of 16)
Error code 20225 20226 20227 20228 20229 20230 20231 20232 20233 20234 20235 20236 20238 20239 20240 20241 20300 20301 20302 20303 20304 23000
Class condition Connection exception OpenEdge SQL snw error Connection exception Invalid auth specs Data exception Data exception Data exception Data exception Data exception Data exception Data exception Data exception Data exception Invalid character set name OpenEdge SQL rds error Connection exception DBS error DBS error DBS error DBS error DBS error OpenEdge SQL Data exception
Subclass message Exceeding permissible number of connections. Bad database handle. Invalid host name in connect string. Access denied (Authorization failed). Invalid date value. Invalid date string. Invalid number strings. Invalid number string. Invalid time value. Invalid time string. Invalid time stamp string. Division by zero attempted. Error in format type. Invalid character set name specified. Invalid collation name specified. Service in use. Column group column does not exist. Column group column already specified. Column group name already specified. Column groups have not covered all columns. Column groups are not implemented in Progress storage. Table create returned invalid table id.
154
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value 22564 j0j28 j0j29 5050w k0k02 k0k03 k0k04 k0k05 k0k06 k0k07 k0k08 k0k09 k0k10 k0k02 k0k11 k0k12 k0k13 k0k14 k0k15 (12 of 16)
Error code 23001 25128 25131 30001 30002 30003 30004 30005 30006 30007 30008 30009 30010 30011 30031 30032 30033 30034 30051
Class condition OpenEdge SQL Data exception OpenEdge SQL odbc trans layer OpenEdge SQL odbc trans layer OpenEdge SQL rds error OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface
Subclass message Index create returned invalid index id. Query terminated as max row limit exceeded for a remote table. Unable to read column info from remote table. Query aborted on user request. Invalid network handle. Invalid sqlnetwork INTERFACE. Invalid sqlnetwork INTERFACE procedure. INTERFACE is already attached. INTERFACE entry not found. INTERFACE is already registered. Mismatch in pkt header size and total argument size. Invalid server id. Reply does not match the request. Memory allocation failure. Error in transmission of packet. Error in reception of packet. No packet received. Connection reset. Network handle is inprocess handle. 155
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value k0k16 k0k17 k0k18 k0k19 k0k20 k0k21 k0k22 k0k23 k0k24 k0k25 k0k26 k0k27 k0k28 k0k29 k0k30 L0L01 08P00 08004 (13 of 16)
Error code 30061 30062 30063 30064 30065 30066 30067 30091 30092 30093 30094 30095 30096 30097 30101 40001 210001 210002
Class condition OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL network interface OpenEdge SQL env error Connection exception Connection exception
Subclass message Could not connect to sql network daemon. Error in number of arguments. Requested INTERFACE not registered. Invalid INTERFACE procedure id. Requested server executable not found. Invalid configuration information. INTERFACE not supported. Invalid service name. Invalid host. Error in tcp/ip accept call. Error in tcp/ip connect call. Error in tcp/ip bind call. Error in creating socket. Error in setting socket option. Interrupt occurred. Error in reading configuration. Failure to acquire share schema lock during connect. Failure in finding DLC environment variable.
156
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value 08004 (14 of 16)
Subclass message DLC environment variable exceeds maximum size <max_size> -> <DLC path>. Error opening convmap.cp file <filename> <path>. Failure getting lock table on table <table_name>. Fatal error identifying database log in SQL. Column <column_name> in table <table_name> has value exceeding its max length or precision. Unable to complete server connection. <function_name>; reason <summary_of_reason>. Column values too big to make key. Table <table_name>; index <index_name>. Failure getting record lock on a record table <table_name>. Lock table is full. Failure to acquire exclusive schema lock for DDL operation. Update of word indexes not yet supported. Table <table_name>, index <index_name>. Scan of word indexes not yet supported. Table <table_name>, index <index_name>. The first index created for a table may not be dropped. Location of the Java compiler was not specified. Need to recompile stored procedures (run scriptSQLConvertSPTP - refer to release notes). Need to recompile triggers (run script SQLConvertSPTP - refer to release notes). 157
210013
08004
Connection exception
210014
22P01
Data exception
210019
0A000
Unsupported feature
Unsupported feature Progress/SQL stored procedure compilation OpenEdge stored procedure execution
210045
86009
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value 22P00 (15 of 16)
Class condition OpenEdge SQL Update Statistics Data exception Data exception Data exception Data exception Data exception Data exception
Subclass message Table %s.%s at Rowid %s has column %s whose value exceeding its max length or precision. Cache overflowed. Unable to read sequence record. The sequence was unable to cycle to another value. Sequence not found. Maximum number of sequences already defined. A sequence value was referenced outside of the defined range of values. Operation not allowed on the read-only database. Syntax error at or about %s. OpenEdge/SQL Java Native Interface(JNI) version not supported. Error from Java compiler. Compiler messages follow. Database statistics (%s) updated for all tables. Database statistics (%s) updated for table %s. Database statistics (%s) updated by direct user SQL statement (%s). mgr removed a prepared, never executed statement from statement cache. %s statements currently in use (%s cache). SQL cannot alter or drop a table or index created by ABL or SQL 89. Incorrect view owner name on CREATE VIEWcannot be PUB or _FOREIGN.
Access rule violation Syntax error OpenEdge SQL Stored proc/Trigger OpenEdge SQL Stored proc/Trigger OpenEdge SQL statistics OpenEdge SQL statistics OpenEdge SQL statistics OpenEdge SQL statement mgr
211013 211014
3F001 3F002
158
Error codes, SQLSTATE values, and messages Table 2: OpenEdge SQL error codes and messages SQL STATE value 3F003 (16 of 16)
Subclass message Database object (table, view, index, trigger, procedure, or synonym) owned by sysprogress cannot be created, dropped, or altered. Database schema table cannot be created, dropped, or altered. Attempt to insert, update, or delete a row in a schema table. Array reference/update incorrect. Failure to create a NLS character set conversion handler. Internal error <error_num1> <error_meaning> in SQL from subsystem <subsystem_name> function <function_name> called from <calling_function> on <object_2> for <object_1>. Save log for Progress technical support. Failure reading schema during DDL operation. Inconsistent metadata - contact Progress technical support. Fatal error <error_num> <error_meaning> in SQL from subsystem <subsystem_name> function <function_name> called from <calling_function> on <object_2> for <object_1>. Save log for Progress technical support.
Bad schema reference Bad schema reference Array reference error OpenEdge I18N NLS error Internal error
159
160
This section provides a list of the maximum sizes for various attributes of the OpenEdge SQL database environment, and for elements of SQL queries addressed to this environment.
OpenEdge SQL system limits Table 3: OpenEdge SQL system limits Attribute Maximum length for a username in a connect string Maximum length of an error message Maximum number of columns in a table Maximum number of bytes that can be inserted in a large key entry Maximum number of bytes that can be inserted in a small key entry Maximum length of a CHECK constraint clause Maximum number of nesting levels in an SQL statement Maximum number of table references in an SQL statement: other platforms Maximum size of input parameters for an SQL statement Maximum number of outer references in an SQL statement Maximum nesting level for view references Maximum number of check constraints in a table Maximum number of foreign constraints in a table Maximum LOB length Name TPE_UNAME_LEN TPE_MAX_ERRLEN TPE_MAX_FIELDS MAX_KEY_DATA_SIZE SMALL_KEY_DATA_SIZE SQL_MAXCHKCL_SZ SQL_MAXLEVELS SQL_MAXTBLREF SQL_MAXIPARAMS_SZ SQL_MAX_OUTER_REF MAX_VIEW_LEVEL SQL_MAXCHKCNSTRS 32 256 5000 1980 193 240 25 250 512 25 25 1000 total constraints per table 1000 total constraints per table 1 GB (2 of 2) Value
SQL_MAXFRNCNSTRS
SQL_MAXLOB
162
OpenEdge SQL maintains a set of system tables for storing information about tables, columns, indexes, constraints, and privileges. This section describes those system catalog tables.
Overview of system catalog tables Table 4: System tables and descriptions Summary description Core system table; one row for each TABLE in the database Core system table; one row for each COLUMN of each table in the database Core system table. One row for each component of each INDEX in the database A single row with a single column set to the value 100 One row for each CHARACTER column in the database One row for each column for each user holding privileges on the column Provides statistical information on data distribution Superset of information in core system table SYSCOLUMNS Information on supported data types One set of rows for each DATE column in the database One row for each user with database-wide privileges One set of rows for each FLOAT column in the database Information on indexes in the database One set of rows for each INTEGER column in the database One set of rows for each NUMERIC column in the database One row for each compiled Java stored procedure or trigger in the database One row for each column in the result set of a stored procedure One row for each stored procedure in the database One row for each Java source code for a stored procedure or trigger in the database One set of rows for each REAL column in the database One row for each unique user/sequence combination, holding sequence privileges on a sequence of the database View of OpenEdge schema table_sequence One set of rows for each SMALLINT column in the database One row for each SYNONYM in the database One row for each unique user/table combination holding table privileges on a table in the database (1 of 2)
System table SYSTABLES SYSCOLUMNS SYSINDEXES SYSCALCTABLE SYSNCHARSTAT SYSCOLAUTH SYSCOLSTAT SYSCOLUMNS_FULL SYSDATATYPES SYSDATESTAT SYSDBAUTH SYSFLOATSTAT SYSIDXSTAT SYSINTSTAT SYSNUMSTAT SYSPROCBIN SYSPROCCOLUMNS SYSPROCEDURES SYSPROCTEXT SYSREALSTAT SYSSEQAUTH SYSSEQUENCES SYSSMINTSTAT SYSSYNONYMS SYSTABAUTH
164
SYSTABLES Table 4: System tables and descriptions Summary description Superset of information in core system table SYSTABLES Contains statistics for user tables in the database One set of rows for each TIME column in the database One set of rows for each TINYINT column in the database One row for each column specified in each trigger in the database One row for each trigger in the database One set of rows for each TIMESTAMP column in the database One set of rows for each TIMESTAMP WITH TIME ZONE column in the database One set of rows for each VARCHAR column in the database One row for each VIEW in the database One row for each CHECK CONSTRAINT defined on a column in the database One row for each CHECK CONSTRAINT defined on a user table in the database One row for each column in the database defined with a PRIMARY KEY or FOREIGN KEY One row for each table in the database defined with a REFERENTIAL INTEGRITY CONSTRAINT One row for each CONSTRAINT defined on a table in the database (2 of 2)
System table SYSTABLES_FULL SYSTBLSTAT SYSTIMESTAT SYSTINYINTSTAT SYSTRIGCOLS SYSTRIGGER SYSTSSTAT SYSTSTZSTAT SYSNVARCHARSTAT SYSVIEWS SYS_CHKCOL_USAGE SYS_CHK_CONSTRS SYS_KEYCOL_USAGE SYS_REF_CONSTRS SYS_TBL_CONSTRS
SYSTABLES
Contains one row for each table in the database. Table 5 provides details of the SYSTABLES table. Table 5: SYSTABLES core system table Column name creator has_ccnstrs has_fcnstrs Column data type VARCHAR VARCHAR VARCHAR 32 1 1 (1 of 2) Column size
165
SYSCOLUMNS Table 5: SYSTABLES core system table Column name has_pcnstrs has_ucnstrs id owner rssid segid tbl tbl_status tbltype Column data type VARCHAR VARCHAR INTEGER VARCHAR INTEGER INTEGER VARCHAR VARCHAR VARCHAR 1 1 4 32 4 4 32 1 1 (2 of 2) Column size
SYSCOLUMNS
Contains one row for each column of every table in the database. Table 6 provides details of the SYSCOLUMNS table. Table 6: SYSCOLUMNS core system table Column name charset col collation coltype dflt_value id nullflag owner scale tbl width Column data type VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR INTEGER VARCHAR VARCHAR INTEGER VARCHAR INTEGER 32 32 32 10 250 4 1 32 4 32 4 Column size
166
SYSINDEXES
SYSINDEXES
Contains one row for each component of an index in the database. For an index with n components, there will be n rows in this table. Table 7 provides details of the SYSINDEXES table. Table 7: SYSINDEXES core system table Column name abbreviate active creator colname desc id idxcompress idxmethod idxname idxorder idxowner idxsegid idxseq ixcol_user_misc rssid tbl tblowner BIT BIT VARCHAR VARCHAR VARCHAR INTEGER VARCHAR VARCHAR VARCHAR CHARACTER VARCHAR INTEGER INTEGER VARCHAR INTEGER VARCHAR VARCHAR Column data type 1 1 32 32 144 4 1 2 32 1 32 4 4 20 4 32 32 Column size
SYSCALCTABLE
Contains exactly one row with a single column with a value of 100. Table 8 provides details of the SYSCALCTABLE table.
167
SYSNCHARSTAT Table 8: SYSCALCTABLE system table Column name fld Column data type INTEGER 4 Column size
SYSNCHARSTAT
Contains a set of rows for each column in the database with data type CHAR. Used by the optimizer, each row contains a sample of values in the column. Table 9 provides details of the SYSNCHARSTAT table. Table 9: SYSNCHARSTAT system table Column name colid tblid property attribute value Column data type INTEGER INTEGER INTEGER INTEGER VARCHAR 4 4 4 4 2000 Column size
SYSCOLAUTH
Contains one row for the update privileges held by users on individual columns of tables in the database. Table 10 provides details of the SYSCOLAUTH table. Table 10: SYSCOLAUTH system table Column data type VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR 32 32 32 1 1 32 (1 of 2) Column size
168
SYSCOLSTAT Table 10: SYSCOLAUTH system table Column data type VARCHAR VARCHAR 32 1 (2 of 2) Column size
SYSCOLSTAT
Provides statistical information on data distribution for columns in tables. Table 11 provides details of the SYSCOLSTAT table. Table 11: SYSCOLSTAT system table Column data type INTEGER INTEGER INTEGER INTEGER INTEGER TIMESTAMP 4 4 4 4 4 8 Column size
SYSCOLUMNS_FULL
A superset of information in the SYSCOLUMNS core system table. Table 12 provides details of the SYSCOLUMNS_FULL table. Table 12: SYSCOLUMNS_FULL system table Column data type INTEGER VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR 4 32 32 32 20 60 12 169 (1 of 2) Column size
SYSDATATYPES Table 12: SYSCOLUMNS_FULL system table Column data type INTEGER VARCHAR VARCHAR VARCHAR INTEGER INTEGER VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR CHARACTER VARCHAR INTEGER VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR INTEGER 4 144 250 12 4 4 60 12 126 12 4 60 12 2 32 4 32 20 144 144 12 100 4 (2 of 2) Column size
Column name col_subtype description dflt_value dflt_value_sa display_order field_rpos format format_sa help help_sa id label label_sa nullflag owner scale tbl user_misc valexp valmsg valmsg_sa view_as width
SYSDATATYPES
Contains information on each data type supported by the database. Table 13 provides details of the SYSDATATYPES table.
170
SYSDATESTAT Table 13: SYSDATATYPES system table Column data type SMALLINT SMALLINT VARCHAR SMALLINT VARCHAR VARCHAR VARCHAR VARCHAR SMALLINT SMALLINT SMALLINT INTEGER SMALLINT 2 2 32 2 32 1 1 1 2 2 2 4 2 Column size
Column name autoincr casesensitive createparams datatype dhtypename literalprefix literalsuffix localtypename nullable odbcmoney searchable typeprecision unsignedattr
SYSDATESTAT
Contains a set of rows for each column of data type DATE. Used by the optimizer, each row contains a sample of values in the column. Table 14 provides details of the SYSDATESTAT table. Table 14: SYSDATESTAT system table Column data type INTEGER INTEGER DATE INTEGER INTEGER 4 4 4 4 4 Column size
SYSDBAUTH
Contains the database-wide privileges held by users. 171
SYSFLOATSTAT Table 15 provides details of the SYSDBAUTH table. Table 15: SYSDBAUTH system table Column data type VARCHAR VARCHAR VARCHAR 1 32 1 Column size
SYSFLOATSTAT
Contains one row for each column of data type FLOAT. Used by the optimizer, each row contains a sampling of values in the column. Table 16 provides details of the SYSFLOATSTAT table. Table 16: SYSFLOATSTAT system table Column data type INTEGER INTEGER FLOAT INTEGER INTEGER 4 4 4 4 4 Column size
SYSIDXSTAT
Contains statistics for indexes in the database. Table 17 provides details of the SYSIDXSTAT table. Table 17: SYSIDXSTAT system table Column data type INTEGER INTEGER INTEGER INTEGER 4 4 4 4 (1 of 2) Column size
172
SYSINTSTAT Table 17: SYSIDXSTAT system table Column data type TIMESTAMP INTEGER 8 4 (2 of 2) Column size
SYSINTSTAT
Contains one row for each column of data type INTEGER. Used by the optimizer, each row contains a sampling of values in the column. Table 18 provides details of the SYSINTSTAT table. Table 18: SYSINTSTAT system table Column data type INTEGER INTEGER INTEGER INTEGER INTEGER 4 4 4 4 4 Column size
SYSNUMSTAT
Contains one row for each column of data type NUMERIC. Used by the optimizer, each row contains a sampling of values in the column. Table 19 provides details of the SYSNUMSTAT table. Table 19: SYSNUMSTAT system table Column data type INTEGER INTEGER NUMERIC INTEGER INTEGER 4 4 32 4 4 Column size
173
SYSPROCBIN
SYSPROCBIN
Contains one or more rows for each stored procedure and trigger in the database. Each row contains compiled Java bytecode for its procedure or trigger. Table 20 provides details of the SYSPROCBIN table. Table 20: SYSPROCBIN system table Column data type INTEGER VARBINARY CHARACTER INTEGER INTEGER 4 2000 2 4 4 Column size
SYSPROCCOLUMNS
Contains one row for each column in the result set of a stored procedure. Table 21 provides details of the SYSPROCCOLUMNS table. Table 21: SYSPROCCOLUMNS system table Column data type VARCHAR VARCHAR VARCHAR VARCHAR INTEGER CHAR INTEGER INTEGER INTEGER INTEGER 32 32 32 250 4 1 4 4 4 4 Column size
Column name argtype col datatype dflt_value id nullflag proc_id rssid scale width
174
SYSPROCEDURES
SYSPROCEDURES
Contains one row for each stored procedure in the database. Table 22 provides details of the SYSPROCEDURES table. Table 22: SYSPROCEDURES system table Column data type VARCHAR CHARACTER CHARACTER VARCHAR INTEGER VARCHAR VARCHAR INTEGER 32 1 1 32 4 32 32 4 Column size
Column name creator has_resultset has_return_val owner proc_id proc_name proc_type rssid
SYSPROCTEXT
Contains one or more rows for each stored procedure and trigger in the database. The row contains the Java source code for a procedure or trigger. Table 23 provides details of the SYSPROCTEXT table. Table 23: SYSPROCTEXT system table Column data type INTEGER VARCHAR CHARACTER INTEGER INTEGER 4 2000 2 4 4 Column size
SYSREALSTAT
Contains one row for each column of data type REAL. Used by the optimizer, each row contains a sampling of values in the column.
175
SYSSEQAUTH Table 24 provides details of the SYSREALSTAT table. Table 24: SYSREALSTAT system table Column data type INTEGER INTEGER REAL INTEGER INTEGER 4 4 4 4 4 Column size
SYSSEQAUTH
Contains information about sequence privileges for database users. Table 25 provides details of the SYSSEQAUTH table. Table 25: SYSSEQAUTH system table Column data type VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR 32 32 1 1 32 32 1 Column size
SYSSEQUENCES
A view of the OpenEdge schema table_sequences. Table 26 provides details of the SYSSEQUENCES table.
176
SYSSYNONYMS Table 26: SYSSEQUENCES system table Column data type VARCHAR INTEGER INTEGER INTEGER INTEGER INTEGER BIT VARCHAR INTEGER VARCHAR VARCHAR 32 4 4 4 4 4 1 208 4 20 32 Column size
Column name seq-name seq-num seq-init seq-incr seq-min seq-max cycle-ok seq-misc db-recod user-misc seq-owner
SYSSYNONYMS
Contains one row for each synonym in the database. Table 27 provides details of the SYSSYNONYMS table. Table 27: SYSSYNONYMS system table Column data type SMALLINT VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR 2 32 32 32 32 32 32 Column size
SYSTABAUTH
Contains information about table privileges for each user in the database.
177
SYSTABLES_FULL Table 28 provides details of the SYSTABAUTH table. Table 28: SYSTABAUTH system table Column data type VARCHAR VARCHAR CHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR 1 1 1 32 32 1 1 1 1 32 32 1 Column size
Column name alt del exe grantee grantor ins ndx ref sel tbl tblowner upd
SYSTABLES_FULL
A superset of information in the SYSTABLES core system table. Table 29 provides details of the SYSTABLES_FULL table. Table 29: SYSTABLES_FULL system table Column data type VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR BIT (1 of 2) Column size 126 126 32 144 16 60 12 1
Column name can_dump can_load creator description dump_name file_label file_label_sa frozen
178
SYSTBLSTAT Table 29: SYSTABLES_FULL system table Column data type VARCHAR VARCHAR VARCHAR VARCHAR BIT INTEGER INTEGER VARCHAR INTEGER INTEGER INTEGER VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR 1 1 1 1 1 4 4 32 4 4 4 32 1 1 20 144 144 12 (2 of 2) Column size
Column name has_ccnstrs has_fcnstrs has_pcnstrs has_ucnstrs hidden id last_change owner prime_index rssid segid tbl tbltype tbl_status user_misc valexp valmsg valmsg_sa
SYSTBLSTAT
Contains statistics for tables. Table 30 provides details of the SYSTBLSTAT table. Table 30: SYSTBLSTAT system table Column data type INTEGER INTEGER INTEGER 4 4 4 (1 of 2) Column size
179
SYSTIMESTAT Table 30: SYSTBLSTAT system table Column data type TIMESTAMP INTEGER 8 4 (2 of 2) Column size
SYSTIMESTAT
Contains one row for each column of data type TIME. Used by the optimizer, each row contains a sampling of values in the column. Table 31 provides details of the SYSTIMESTAT table. Table 31: SYSTIMESTAT system table Column data type INTEGER INTEGER TIME INTEGER INTEGER 4 4 4 4 4 Column size
SYSTINYINTSTAT
Contains one row for each column of data type TINYINT. Used by the optimizer, each row contains a sampling of values in the column. Table 32 provides details of the SYSTINYINTSTAT table. Table 32: SYSTINYINTSTAT system table Column data type INTEGER INTEGER TINYINT INTEGER INTEGER 4 4 1 4 4 Column size
180
SYSTRIGCOLS
SYSTRIGCOLS
Contains one row for each column specified in each UPDATE trigger in the database. Table 33 provides details of the SYSTRIGCOLS table. Table 33: SYSTRIGCOLS system table Column data type INTEGER VARCHAR VARCHAR 4 32 32 Column size
SYSTRIGGER
Contains one row for each trigger in the database. Table 34 provides details of the SYSTRIGGER table. Table 34: SYSTRIGGER system table Column data type BIT VARCHAR CHAR CHAR INTEGER CHAR VARCHAR VARCHAR INTEGER VARCHAR VARCHAR VARCHAR 1 32 1 1 4 1 32 32 4 32 1 1 Column size
Column name fire_4gl owner refers_to_new refers_to_old rssid statement_or_row tbl tblowner triggerid triggername trigger_event trigger_time
181
SYSTSSTAT
SYSTSSTAT
Contains one row for each column of data type TIMESTAMP. Used by the optimizer, each row contains a sampling of values in the column. Table 35 provides details of the SYSTSSTAT table. Table 35: SYSTSSTAT system table Column data type INTEGER INTEGER TIMESTAMP INTEGER INTEGER 4 4 8 4 4 Column size
SYSTSTZSTAT
Contains one row for each column of data type TIMESTAMP WITH TIME ZONE. Used by the optimizer, each row contains a sampling of values in the column. Table 36 provides details of the SYSTSTZSTAT table. Table 36: SYSTSTZSTAT system table Column data type INTEGER INTEGER TIMESTAMP WITH TIME ZONE INTEGER INTEGER 4 4 12 4 4 Column size
SYSNVARCHARSTAT
Contains one row for each column of data type VARCHAR. Used by the optimizer, each row contains a sampling of values in the column. Table 37 provides details of the SYSNVARCHARSTAT table.
182
SYSVIEWS Table 37: SYSNVARCHARSTAT system table Column data type INTEGER INTEGER VARCHAR INTEGER INTEGER 4 4 2000 4 4 Column size
SYSVIEWS
Contains one row for each VIEW in the database. Table 38 provides details of the SYSVIEWS table. Table 38: SYSVIEWS system table Column data type VARCHAR VARCHAR INTEGER VARCHAR VARCHAR 32 32 4 32 2000 Column size
SYS_CHKCOL_USAGE
Contains one row for each column on which a check constraint is specified. Table 39 provides details of the SYS_CHKCOL_USAGE table. Table 39: SYS_CHKCOL_USAGE system table Column data type VARCHAR VARCHAR VARCHAR VARCHAR 32 32 32 32 Column size
183
SYS_CHK_CONSTRS
SYS_CHK_CONSTRS
Contains one row for each CHECK CONSTRAINT specified on a user table. The chkclause column contains the content of the CHECK clause. Table 40 provides details of the SYS_CHK_CONSTRS table. Table 40: SYS_CHK_CONSTRS system table Column data type VARCHAR INTEGER VARCHAR VARCHAR VARCHAR Column size 2000 4 32 32 32
SYS_KEYCOL_USAGE
Contains one row for each column on which a PRIMARY KEY or FOREIGN KEY is specified. Table 41 provides details of the SYS_KEYCOL_USAGE table. Table 41: SYS_KEYCOL_USAGE system table Column data type VARCHAR VARCHAR INTEGER VARCHAR VARCHAR 32 32 4 32 32 Column size
SYS_REF_CONSTRS
Contains one row for each REFERENTIAL INTEGRITY CONSTRAINT specified on a user table. Table 42 provides details of the SYS_REF_CONSTRS table.
184
SYS_TBL_CONSTRS Table 42: SYS_REF_CONSTRS system table Column data type VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR 32 1 32 32 32 32 32 Column size
SYS_TBL_CONSTRS
Contains one row for each table constraint in the database. Table 43 provides details of the SYS_TBL_CONSTRS table. Table 43: SYS_TBL_CONSTRS system table Column data type VARCHAR VARCHAR VARCHAR VARCHAR VARCHAR 32 1 32 32 32 Column size
185
SYS_TBL_CONSTRS
186
This section addresses compatibility issues when using the OpenEdge SQL environment and earlier versions of the Progress database. Specifically, it discusses mapping between Advanced Business Language (ABL) supported data types and the corresponding OpenEdge SQL data types.
Supported ABL data types and corresponding OpenEdge SQL data types
OpenEdge SQL supports many data types that do not correspond to ABL data types. Table 44 lists the ABL data types that do correspond to OpenEdge SQL data types. Table 44: ABL and corresponding OpenEdge SQL data types ABL data type
ARRAY BLOB CHARACTER CLOB DATE DATETIME DATETIME-TZ DECIMAL INTEGER INT64
or NUMERIC
Supported ABL data types and corresponding OpenEdge SQL data types Table 44: ABL and corresponding OpenEdge SQL data types ABL data type
LOGICAL RAW RECID BIT VARBINARY RECID
Notes
All other SQL types are not compatible with ABL. In particular, OpenEdge SQL CHARACTER data is not compatible with the ABL. Use OpenEdge SQL type VARCHAR to map ABL CHARACTER data. Data columns created using OpenEdge SQL that have a data type not supported by ABL are not accessible through ABL applications and utilities. For more information about OpenEdge SQL data types, see the OpenEdge SQL Language Elements section on page 189.
188
This section describes Standard SQL language elements that are common to OpenEdge SQL. The language elements described in this section include: OpenEdge SQL identifiers Number formats Date-time formats Date formats Time formats Data types Literals Relational operators
Conventional identifiers
Conventional SQL identifiers must: Begin with an uppercase or lowercase letter Contain only letters (AZ), digits (09), or the underscore character ( _ ) Not be reserved words, such as CREATE or DROP Use ASCII characters only
SQL does not distinguish between uppercase and lowercase letters in SQL identifiers. It converts all names specified as conventional identifiers to uppercase, but statements can refer to the names in mixed case. Example The following example illustrates the use of identifiers in a simple query statement where CustNum, Order, and OrderDate are the user-specified names of columns:
SELECT CustNum, COUNT(*) FROM Order WHERE OrderDate < TO_DATE ('3/31/2004') GROUP BY CustNum HAVING COUNT (*) > 10 ;
Delimited identifiers
Delimited identifiers are strings of no more than 32 ASCII characters enclosed in quotation marks ( " " ). Delimited identifiers allow you to create identifiers that are identical to keywords or that use special characters (such as #, &, or *) or a space. Enclosing a name in quotation marks preserves the case of the name and allows it to be a reserved word or to contain special characters. Special characters are any characters other than letters, digits, or the underscore character. Subsequent references to a delimited identifier must also use quotation marks. To include a quotation mark character in a delimited identifier, precede it with another quotation mark. The following code example uses a delimited identifier to create a table named "Dealer Table", where the space character is part of the name:
CREATE TABLE "Dealer Table" (name, address, city, state) AS SELECT name, address, city, state FROM customer WHERE state IN ('CA','NY', 'TX') ;
190
Number formats
Number formats
Numeric data has cultural characteristics that international applications must address. For example, numeric separators (decimal and thousands separators) and currency symbols differ across locales and regions. Therefore, OpenEdge applications provide the capability to store, manage and display data in formats that meet the needs of the international market. Table 45 defines the number formats that are supported by OpenEdge SQL. Table 45: Format
$ , $999 9,999
OpenEdge SQL Number Formats Example Definition Returns a value with a leading dollar sign. Returns a comma in the specified position (not a thousands separator). Returns a decimal in the specified position (not a fractional indicator). Displays and positions a leading or trailing zero. Sets the number of significant digits to be displayed. Displays the leading space if positive, leading minus if negative. Leading zeros are blank except for a zero value returning a zero for the integer part of the number. Returns NLS_NUMERIC_CHARACTER in the specified position. The default D character is (.). Returns NLS_NUMERIC_CHARACTER in the specified position. The default G character is (,). Return the local currency symbol NLS_CURRENCY in the specified position.
99.99
0 9
99D9
9G99
L999
Date-time formats
The TO_CHAR function supports the date-format and the time-format strings to control the output of date and time values. The format strings consist of keywords that SQL interprets and replaces with formatted values. Syntax
TO_CHAR ( expresion expression
, format_string
Converts to character form. It must evaluate to a value of the date or time data type to use the format_string.
191
Date formats
format_string
Specifies the format of the output. SQL ignores the format string if the expression argument does not evaluate to a date or time. Supply the format strings, enclosed in single quotation marks, as the second argument to the function. The format strings are case sensitive. For instance, SQL replaces DAY with all uppercase letters, but follows the case of Day. The following example illustrates the difference between how a date value displays with and without the TO_CHAR function: Example
SELECT C1 FROM T2; C1 -09/29/1952 1 record selected
SELECT TO_CHAR(C1, 'Day, Month ddth'), TO_CHAR(C2, 'HH12 a.m.') FROM T2; TO_CHAR(C1,DAY, MONTH DDTH) TO_CHAR(C2,HH12 A.M.) --------------------------- --------------------Monday , September 29th 02 p.m. 1 record selected
Date formats
A date-format string can contain any of the following format keywords along with other characters. The format keywords in the format string are replaced by corresponding values to get the result. The other characters are displayed as literals. Table 46 lists the date formats and their corresponding descriptions. Table 46: Date format
CC YYYY YYY YY Y Y,YYY Q MM
(1 of 2)
Description The century as a two-digit number. The year as a four-digit number. The last three digits of the year. The last two digits of the year. The last digit of the year. The year as a four-digit number with a comma after the first digit. The quarter of the year as a one-digit number (with values 1, 2, 3, or 4). The month value as a two-digit number (in the range 01-12).
192
(2 of 2)
Description The name of the month as a string of nine characters ('JANUARY' to 'DECEMBER'). The first three characters of the name of the month (in the range'JAN' to 'DEC'). The week of the year as a two-digit number (in the range 01-53). The week of the month as a one-digit number (in the range 1-5). The day of the year as a three-digit number (in the range 001-366). The day of the month as a two-digit number (in the range 01-31). The day of the week as a one-digit number (in the range 1-7, 1 for Sunday and 7 for Saturday). The day of the week as a character string of nine characters (in the range 'SUNDAY' to 'SATURDAY'). The day of the week as a character string of three characters (in the range 'SUN' to 'SAT'). The Julian day (number of days since DEC 31, 1899) as an eight-digit number. When added to a format keyword that results in a number, this format keyword ('TH') is replaced by the string 'ST', 'ND', 'RD', or 'TH' depending on the last digit of the number.
MON
WW W DDD DD D
DAY
DY
J TH
Example
The following example illustrates the use of the DAY, MONTH, DD, and TH format strings:
SELECT TO_CHAR (C1, 'Day, Month ddth'), TO_CHAR (C2, 'HH12 a.m.') FROM T2; TO_CHAR (C1,DAY, MONTH DDTH) TO_CHAR (C2,HH12 A.M.) ---------------------------- ---------------------Monday, September 29th 02 p.m. 1 record selected
193
Time formats
Time formats
A time format string can contain any of the following format keywords along with other characters. The format keywords in the format string are replaced by corresponding values to get the result. The other characters are displayed as literals. Table 47 lists the time formats and their corresponding descriptions. Table 47: Time format
AM PM A.M. P.M. HH12 HH HH24 MI SS SSSSS
Description The string AM or PM depending on whether time corresponds to morning or afternoon The string A.M. or P.M. depending on whether time corresponds to morning or afternoon The hour value as a two-digit number (in the range 00 to 11) The hour value as a two-digit number (in the range 00 to 23) The minute value as a two-digit number (in the range 00 to 59) The seconds value as a two-digit number (in the range 00 to 59) The seconds from midnight as a five-digit number (in the range 00000 to 86399) The milliseconds value as a three-digit number (in the range 000 to 999)
MLS
Example
The following example illustrates the TO_CHAR function, and the Day, Month, dd, and HH12 format strings:
SELECT TO_CHAR (C1, 'Day, Month ddth'), TO_CHAR (C2, 'HH12 a.m.') FROM T2; TO_CHAR (C1,DAY, MONTH DDTH) TO_CHAR (C2,HH12 A.M.) ---------------------------- ---------------------Monday , September 29th 02 p.m. 1 record selected
194
Data types
Data types
CREATE TABLE statements specify the data type for each column in the table they define. This section describes the data types SQL supports for table columns. All the data types can store null values. A null value indicates that the value is not known and is distinct from all non-null values.
Syntax
char_data_type
exact_numeric_data_type
approx_numeric_data_type
| date_time_data_type vararray_data_type
Example
bit_string_data_type
array_data_type
The following example illustrates the use of data types in a CREATE TABLE statement:
CUSTOMERS INTEGER NOT NULL, VARCHAR (20) NOT NULL, INTEGER, INTEGER, (CUST_NUM))
ARRAY
CHARACTER
CHAR
|{
CHARACTER
VARCHAR
LVARCHAR
}[
( length )
195
Data types
CHARACTER
( length )
(alias CHAR) corresponds to a null-terminated character string with the length specified. Values are padded with blanks to the specified length. The default length is 1. The maximum length is 2,000 characters. The OpenEdge SQL representation is a variable-length string. The host language representation is equivalent to a C language character string.
CHARACTER
CHARACTER VARYING
CHAR VARYING
VARCHAR
LVARCHAR
} [
( length )
CHARACTER VARYING, CHAR VARYING, and VARCHAR corresponds to a variable-length character string with the maximum length specified. The default length is 1 character. The maximum length is 31,995 characters. LVARCHAR has a maximum length of 1,073,741,823. A CLOB is an object of data type LVARCHAR.
Notes
For data types CHARACTER( length ) and VARCHAR( length ) the value of length specifies the number of characters. The maximum length can be as large as 31,995. The sum of all the column lengths of a table row must not exceed 31,960. Due to index size limitations, only the narrower VARCHAR columns can be indexed.
Maximum length for VARCHAR The maximum length of the VARCHAR data type depends on: The number of columns in a table More columns in a table further limits the length of VARCHAR data. When a table was created Tables created earlier can support longer VARCHAR data than tables created later.
National Language Support (NLS) The VARCHAR data type has NLS. The choice of character set affects the available character count or maximum length of the data column. The limits established above assume a singlebyte character set. Using a multiplebyte character set lowers the maximum character count proportionally. For example, if all the characters in a character set take 3 bytes per character, the practical maximum is 10,660 (31,982 divided by 3). If, however, you are using a variablewidth character set, you will be able to hold between 10,660 and 31,982 characters, depending on the actual mix of characters you use. Concatenation operator Use the concatenation operator (||) to join two text strings together. The following example provides an example of a concatenation operator used in a query: Example
SELECT firstname || ' ' || lastname from Employee;
196
Data types
SMALLINT
| |
NUMERIC DECIMAL
| [
NUMBER (
TINYINT
NUMBER
( precision
, scale
Corresponds to a number with the given precision (maximum number of digits) and scale (the number of digits to the right of the decimal point). By default, NUMERIC columns have a precision of 32 and a scale of 0. If NUMERIC columns omit the scale, the default scale is 0. The range of values for a NUMERIC type column is -n to +n where n is the largest number that can be represented with the specified precision and scale. If a value exceeds the precision of a NUMERIC column, SQL generates an overflow error. If a value exceeds the scale of a NUMERIC column, SQL rounds the value.
NUMERIC
type columns cannot specify a negative scale or specify a scale larger than the precision.
DECIMAL
( precision , scale
REAL
DOUBLE PRECISION
FLOAT
( precision )
] }
197
Data types
REAL
Corresponds to a single precision floating-point number equivalent to the C language float type.
DOUBLE PRECISION
Corresponds to a double precision floating-point number equivalent to the C language double type.
FLOAT
( precision )
Corresponds to a double precision floating-point number of the given precision, in bytes. By default, FLOAT columns have a precision of 8. The REAL data type is same as a FLOAT(4), and double-precision is the same as a FLOAT(8).
TIME
TIMESTAMP
|TIMESTAMP
Stores a date value as three parts: year, month, and day. The ranges for the parts are:
TIME
Year: 1 to 9999 Month: 1 to 12 Day: Lower limit is 1; the upper limit depends on the month and the year
Stores a time value as four parts: hours, minutes, seconds, and milliseconds. The ranges for the parts are: Hours: 0 to 23 Minutes: 0 to 59 Seconds: 0 to 59 Milliseconds: 0 to 999
TIMESTAMP
198
Data types
BINARY
VARBINARY
LVARBINARY
( length )
Corresponds to a single bit value of 0 or 1. SQL statements can assign and compare values in BIT columns to and from columns of types CHAR, VARCHAR, BINARY, VARBINARY, TINYINT, SMALLINT, and INTEGER. However, in assignments from BINARY and VARBINARY, the value of the first four bits must be 0001 or 0000. No arithmetic operations are allowed on BIT columns.
BINARY
( length )
Corresponds to a bit field of the specified length of bytes. The default length is 1 byte. The maximum length is 2000 bytes. When inserting literals into binary data types, INSERT statements must use a special format to store values in BINARY columns. They can specify the binary values as a bit string, hexadecimal string, or character string. INSERT statements must enclose binary values in single-quote marks, preceded by b for a bit string and x for a hexadecimal string. Table 48 lists the specification formats for binary values. Table 48: Specification formats for binary values Format
b x
Example
b '1010110100010000' x 'ad10'
' '
'ad10'
SQL interprets a character string as the character representation of a hexadecimal string. If the data inserted into a BINARY column is less than the length specified, SQL pads it with zeros.
BINARY
data can be assigned and compared to and from columns of type BIT, CHAR, and VARBINARY. Arithmetic operations are not allowed.
VARBINARY ( length )
Corresponds to a variable-length bit field of the specified length in bytes. The default length is 1 byte. The maximum length is 31,995 bytes. The default length is 1. Due to index limitations, only the narrower VARBINARY columns can be indexed.
199
Data types
LVARBINARY ( length )
Corresponds to an arbitrarily long byte array with the maximum length defined by the amount of available disk storage up to 1,073,741,823. A BLOB is an object of data type LVARBINARY. Maximum length for VARBINARY The maximum length of the VARBINARY data type depends on: The number of columns in a table More columns in a table further limits the length of VARBINARY data. When a table was created Tables created earlier can support longer VARBINARY data than tables created later.
data columns cannot be part of an index. data columns cannot be used for variables or as parameters in stored
procedures. Comparison operations are not supported on LVARBINARY columns. Comparison operations between LVARBINARY columns are not supported. Comparison operations between LVARBINARY columns and columns of other data types are not supported. Conversion, aggregate, and scalar functions are disallowed on this data type.
LVARBINARY
Language support for LVARBINARY This data type has normal column functionality except for the following exceptions: A column of data type LVARBINARY is not a valid column name in a CREATE INDEX statement. When issuing a CREATE TABLE statement, a valid data type for the column definitions is LVARBINARY. However, LVARBINARY does not allow the column constraints of PRIMARY KEY, FOREIGN KEY, UNIQUE, REFERENCES, and CHECK. When creating a table with a column of data type LVARBINARY, place the table in a new AREA. The VALUES option on the INSERT statement is not valid for the LVARBINARY data type. In a SELECT statement, a WHERE, GROUP BY, HAVING, or ORDER BY clause cannot use a column of data type LVARBINARY.
200
Data types There is no support for an UPDATE of an LVARBINARY column on a table that contains a column of data type LVARBINARY. Obtain the functionality of an UPDATE on an LVARBINARY column by using the DELETE and INSERT statements for the record.
Utility support for LVARBINARY Use BINARY DUMP/LOAD to dump and load data that contains the LVARBINARY data type. SQLDUMP and SQLLOAD do not support tables with LVARBINARY column data.
VARARRAY[int]
The data type of the array. This is also known as the element type. Supported data types are: BINARY, BIT, CHAR, VARCHAR, DATE, DECIMAL, DOUBLE
PRECISION, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, TIME, TIMESTAMP, TIMESTAMP_TZ, TINYINT, [int]
and VARBINARY.
An unsigned integer, indicating the arrays maximum element size. Example In this example, table TBL is created. TBL has two columns: column C1 is an array of up to 3 elements, all of them type int and column C2 is a variable-sized array of up to 4 elements, all of them type varchar:
The size of any element in C2 can be up to 20 characters (5*4) with a total size of 20 characters. Notes OpenEdge SQL limits an arrays size. The arrays size must be an integer between 1 and 9999. Array columns and element references cannot be indexed because: You cannot define a UNIQUE key with columns of type ARRAY.
201
Data types You cannot define a PRIMARY key with columns of type ARRAY. You cannot define a FOREIGN key with columns of type ARRAY.
ARRAY element reference An element reference allows you to access a specific element of an array. It operates on two arguments: the first must evaluate to an array and the second must evaluate to an integer. The integer refers to the ordinal position of the element in the array (the first element in the array is element number one, the second is element number two, and so on). It is possible to select the array as a whole value, rather than selecting individual array elements. When the array as a whole is selected, SQL returns a VARCHAR datatype value. That value comprises all the elements, converted to character form, with elements separated from each other by a ; delimiter. Example In this example, the fourth element of the array column named array_column is returned:
Default value for ARRAY columns When creating array columns, you can specify a default value. Example Since no value is specified for array column C2 when inserting values, the default value is used. The result returned from this example would be 10;10;10:
CREATE TABLE tbl (C1 int, C2 int ARRAY[3] default 10); INSERT INTO tbl (C1) VALUES (1); SELECT C2 FROM tble WHERE C1 = 1;
Note
The default value is applicable only at the column level. This means that if fewer values are specified when executing an insert statement, the default will not be used to fill up the rest of the array elements. Instead, NULL is used. Assignment When an array is assigned to an array target, the assignment is done one element at a time. Two arrays are assignable if their elements data types are mutually assignable. This means: When an array is taken from SQL data to be assigned to an array target, the number of elements in the source array equals the maximum number of elements in the target array. The value of each element of the source is assigned to the corresponding element of the target. If the maximum number of elements in the target array is less than the number of elements in the source array, then an error is returned.
202
Literals If the maximum number of elements in the target array is greater than the number of elements in the source array, the assignment of each of the source element values to the target elements occurs and the rest of the target elements will be assigned values of NULL.
Example
CREATE TABLE TBL (C1 int, C2 int ARRAY[3]); INSERT into TBL values (1, 111;222;333); UPDATE TBL SET C2 = 777;888;999;
Comparison OpenEdge SQL provides two scalar comparison operators: = and <>. Two arrays are comparable if their element data types are mutually comparable. During comparison, the elements are compared pair-wise in element order. Two arrays are equal if: They both have the same number of elements Each pair of elements is equal
Two arrays are not equal if: They do not have the same number or elements At least one pair of elements is not equal
Literals
A literal, also called a constant, is a type of expression that specifies a constant value. Generally, you can specify a literal wherever SQL syntax allows an expression. Some SQL constructs allow literals but disallow other forms of expressions. There are three types of literals:
NUMERIC CHARACTER-STRING DATE-TIME
Numeric literals
A numeric literal is a string of digits that SQL interprets as a decimal number. SQL allows the string to be in a variety of formats, including scientific notation. This is the syntax for numeric literals:
203
Literals Syntax
0-9
]}]
Example
Character-string literals
A character-string literal is a string of characters enclosed in single quotation marks ( ' '). To include a single quotation mark in a character-string literal, precede it with an additional single quotation mark. The INSERT statements in the following example show embedding quotation marks in character-string literals:
A character string literal can contain multi-byte characters in the character set used by the SQL client. Only single-byte ASCII-encoded quote marks are valid in the syntax.
Date-time literals
SQL supports special formats for literals to be used in conjunction with date-time data types. Basic predicates and the VALUES clause of INSERT statements can specify date literals directly for comparison and insertion into tables. In other cases, you need to convert date literals to the appropriate date-time data type with the CAST, CONVERT, or TO_DATE scalar functions. Enclose date-time literals in single quotation marks ( ' ' ). Notes All text (names of days, months, ordinal number endings) in all date-format literals must be in the English language. The default date format is American. You can explicitly request another date format by using a format string.
204
Date literals A date literal specifies a day, month, and year using any of the following formats, enclosed in single quotation marks ( ' ' ). This is the syntax for date literals: Syntax
{ d yyyy-mm-dd } { d 'yyyy-mm-dd' }
A date literal enclosed in an escape clause is compatible with ODBC. Precede the literal string with an open brace ( { ) and a lowercase d. End the literal with a close brace )}). If you use the ODBC escape clause, you must specify the date using the format yyyy-mm-dd. Note Date literals must be enclosed in single quotations, such as the case with column values in an statement.
INSERT
Examples
The following example illustrates how to use the date literal format with an INSERT statement:
The INSERT and SELECT statements in the following example show some of the supported formats for date literals:
TABLE T2 (C1 INTO T2 (C1) INTO T2 (C1) INTO T2 (C1) INTO T2 (C1) INTO T2 (C1)
Time literals Time literals specify an hour, minute, second, and millisecond, using the following format, enclosed in single quotation marks (' ' ). This is the syntax for time literals: Syntax
{ hh:mi:ss[:mls
205
Literals
{ t 'hh:mi:ss' }
A time literal enclosed in an escape clause is compatible with ODBC. Precede the literal string with an open brace ( { ) and a lowercase t. End the literal with a close brace ( } ). Note If you use the ODBC escape clause, you must specify the time using the format hh:mi:ss.
hh
Specifies the milliseconds value as a three-digit number in the range 000 to 999. Examples The following example illustrates how to use the time literal format with an INSERT statement:
The INSERT statements in the following example show some of the formats SQL will and will not accept for time literals:
INSERT INTO T2 (C2) VALUES('3'); error(-20234): Invalid time string INSERT INTO T2 (C2) VALUES('8:30'); error(-20234): Invalid time string INSERT INTO T2 (C2) VALUES('8:30:1'); INSERT INTO T2 (C2) VALUES('8:30:'); error(-20234): Invalid time string
INSERT INTO T2 (C2) VALUES('8:30:00'); INSERT INTO T2 (C2) VALUES('8:30:1:1'); INSERT INTO T2 (C2) VALUES({t'8:30:1:1'});
The SELECT statement in the following example illustrates which INSERT statements successfully inserted a row:
206
Relational operators Timestamp literals Timestamp literals specify a date and a time separated by a space, enclosed in single quotation marks ( ' ' ). This is the syntax for timestamp literals: Syntax
{ ts 'yyyy-mm-dd hh:mi:ss' } { ts 'yyyy-mm-dd hh:mi:ss' }
A timestamp literal enclosed in an escape clause is compatible with ODBC. Precede the literal string with an open brace ( { ) and a lowercase ts. End the literal with a close brace ( } ). Note that braces are part of the syntax. If you use the ODBC escape clause, you must specify the timestamp using the format yyyy-mm-dd hh:mi:ss.
date_literal
A date.
time_literal
A time literal. Examples The following example illustrates how to INSERT a timestamp literal into a column:
The following example illustrates a timestamp literal with the ODBC escape clause:
Relational operators
Relational operators specify how SQL compares expressions in basic and quantified predicates. This is the syntax for relational operators: Syntax
=
<>
!=
^=
<
<=
>
>=
Table 49 lists the relational operators and the resulting predicates for each operator.
207
Relational operators Table 49: Relational operator = <> < <= > >= Relational operators and resulting predicates
Predicate for this relational operator True if the two expressions are equal.
| != | ^=
True if the two expressions are not equal. The operators != and ^= are equivalent to <>. True if the first expression is less than the second expression. True if the first expression is less than or equal to the second expression. True if the first expression is greater than the second expression. True if the first expression is greater than or equal to the second expression.
Basic Predicate
A basic predicate compares two values using a relational operator. If a basic predicate specifies a query expression, then the query expression must return a single value. Basic predicates often specify an inner join. If the value of any expression is null or the query_expression does not return any value, then the result of the predicate is set to false. This is the syntax for a basic predicate: Syntax
expression relop
expression
( query_expression )
Quantified Predicate
The quantified predicate compares a value with a collection of values using a relational operator. A quantified predicate has the same form as a basic predicate with the query_expression being preceded by the ALL, ANY, or SOME keyword. The result table returned by query_expression can contain only a single column. When you specify ALL, the predicate evaluates to true if the query_expression returns no values or the specified relationship is true for all the values returned. When you specify SOME or ANY, the predicate evaluates to true if the specified relationship is true for at least one value returned by the query_expression. There is no difference between the SOME and ANY keywords. The predicate evaluates to false if the query_expression returns no values or if the specified relationship is false for all the values returned. This is the syntax for a quantified predicate: Syntax
expression relop
ALL
ANY
SOME
( query_expression )
208
BETWEEN Predicate The BETWEEN predicate can be used to determine if a value is within a specified value range or not. The first expression specifies the lower bound of the range and the second expression specifies the upper bound of the range. The predicate evaluates to true if the value is greater than or equal to the lower bound of the range and less than or equal to the upper bound of the range. This is the syntax for a BETWEEN predicate. Syntax
expression
NOT
Example
salary BETWEEN 20000.00 AND 100000.00
NULL Predicate The NULL predicate can be used for testing null values of database table columns. This is the syntax for a NULL predicate Syntax
column_name IS
NOT
NULL
Example
contact_name IS NOT NULL
LIKE Predicate The LIKE predicate searches for strings that have a certain pattern. The pattern is specified after the LIKE keyword in a string constant. The pattern can be specified by a string in which the underscore ( _ ) and percent sign ( % ) characters have special semantics. Use the ESCAPE clause to disable the special semantics given to the characters ( _ ) and ( % ). The escape character specified must precede the special characters in order to disable their special semantics. This is the syntax for a LIKE predicate: Syntax
column_name
NOT
LIKE string_constant
ESCAPE escape_character
Notes
The column_name specified in the LIKE predicate can be a column, a string constant, or an arbitrary character expression (such as SUBSTRING or LTRIM). 209
Relational operators The string_constant may be a string constant or a scalar function call. The escape_character must be a one character string constant. A percent sign ( % ) in the pattern matches zero or more characters of the column string. An underscore symbol ( _ ) in the pattern matches any single character of the column string. The LIKE predicate is multi-byte enabled. The string_constant and the escape_character may contain multi-byte characters, and the escape_character can be a multi-byte character. A percent sign ( % ) or an underscore ( _ ) in the string_constant can represent a multi-byte character. However, the percent sign or underscore itself must be the single-byte ASCII encoding.
Example
cust_name LIKE %Computer% cust_name LIKE ___ item_name LIKE %\_% ESCAPE \
In the first LIKE clause, for all strings with the substring Computer the predicate evaluates to true. In the second LIKE clause, for all strings which are exactly three characters long the predicate evaluates to true. In the third LIKE clause the backslash character ( \ ) is specified as the escape character, which means that the special interpretation given to the underscore character ( _ ) is disabled. The pattern evaluates to TRUE if the item_name column has embedded underscore characters. EXISTS Predicate The EXISTS predicate can be used to check for the existence of specific rows. The query_expression returns rows rather than values. The predicate evaluates to true if the number of rows returned by the query_expression is nonzero. This is the syntax for an EXISTS predicate: Syntax
EXISTS (query_expression)
Example
In this example, the predicate evaluates to true if the specified customer has any orders:
IN Predicate The IN predicate can be used to compare a value with a set of values. If an IN predicate specifies a query expression, then the result table it returns can contain only a single column. This is the syntax for an IN predicate:
210
NOT
IN
{
Example
(query_expression)
(constant , constant
... ]
OUTER JOIN Predicate An outer join predicate specifies two tables and returns a result table that contains all the rows from one of the tables, even if there is no matching row in the other table. Syntax
Unary operators.
numeric_literal
Number value.
numeric_expr
| - | * | /
Operators for addition, subtraction, multiplication, and division. SQL evaluates numeric arithmetic expressions in the following order: Unary plus or minus Expressions in parentheses Multiplication and division, from left to right
211
Syntax
date_time_expr
int_expr
date_time_expr - date_time_expr
date_time_expr
Returns a value of type DATE or TIME or TIMESTAMP. A single date-time expression cannot mix data types, however. All elements of the expression must be the same data type. Date-time expressions can contain date-time literals, but they must be converted to DATE or TIME using the CAST, CONVERT, or TO_DATE functions.
int_expr
Returns an integer value. SQL interprets the integer differently depending on the data type of the date-time expression: Examples For DATE expressions, integers represent days For TIME expressions, integers represent milliseconds For TIMESTAMP expressions, integers represent milliseconds
The following example manipulates DATE values using date arithmetic. SQL interprets integers as days and returns date differences in units of days:
SELECT C1, C2, C1-C2 FROM DTEST c1 c2 c1-c2 --------------------------------------1956-05-07 1952-09-29 1316
select sysdate, sysdate - 3 , sysdate - cast ('9/29/52' as date) from dtest; sysdate sysdate-3 sysdate-convert(date,9/29/52) ---------------------------------------------------------1995-03-24 1995-03-21 15516
The following example manipulates TIME values using date arithmetic. SQL interprets integers as milliseconds and returns time differences in milliseconds: 212
Relational operators
select systime, systime - 3000, systime - cast ('15:28:01' as time) from dtest; systime systime-3000 systime-convert(time,15:28:01) ---------------------------------------------------------15:28:09 15:28:06 8000
213
Relational operators
214
This section presents OpenEdge SQL language elements and statements in Backus Naur Form (BNF). Information on BNF elements and statements include: Data types syntax in BNF Expressions syntax in BNF Literals syntax in BNF Query Expressions syntax in BNF Search conditions syntax in BNF Statements, DDL and DML syntax in BNF
| |
exact_numeric_data_type date_time_data_type
approx_numeric_data_type
bit_string_data_type
OpenEdge SQL Elements and Statements in Backus Naur Form Character data type Syntax
char_data_type ::=
CHARACTER
CHAR
} [
( length )
] |
CLOB
| { CHARACTER [ (length) ]
VARYING
CHAR VARYING
VARCHAR
::=
::= ( precision ) ] }
TIME
TIMESTAMP
BINARY
( length )
] |
BLOB
( length )
] | ]
VARBINARY
[(
length )
] |
LONG VARBINARY
[(
length )
216
table_name.| alias. character_literal numeric_literal date-time_literal aggregate_function scalar_function numeric_arith_expr date_arith_expr conditional_expr (expr)
}]
column_name
| | | | | | | | |
+ | [ {
int_expr
date_time_expr - date_time_expr
Conditional expression
Case expression A type of conditional expression. Syntax
ase_expr ::= searched_case_expr
simple_case_expr
217
OpenEdge SQL Elements and Statements in Backus Naur Form Searched case expression Syntax
searched_case_expr ::= CASE WHEN search_condition THEN ELSE expr END
result_expr
NULL
} [
... ]
NULL
result_expr
NULL
} [
... ]
NULL
| | | | | | | | | |
mm-dd-yyyy mm/dd/yyyy mm-dd-yy mm/dd/yy yyyy-mm-dd yyyy/mm/dd dd-mon-yyyy dd/mon/yyyy dd-mon-yy dd/mon/yy
Time literal
Syntax
time_literal ::= { t hh:mi:ss }
hh:mi:ss[:mls
218
Timestamp literal
Syntax
timestamp_literal ::= { t 'yyyy-mm-dd hh:mi:ss' }
|'date_literal
time_literal'
UNION
ALL
] |
INTERSECT
MINUS
,...
219
OpenEdge SQL Elements and Statements in Backus Naur Form Table reference Syntax
table_ref ::= table_name
AS
] [
alias
(column_alias alias
| (query_expression) [ AS ] | [ ( ] joined_table [ ) ]
Joined table Syntax
joined_table ::=
{ }
|table_ref [
] ]
JOIN
{ }
JOIN table_ref
table_name.]column (+) =
WHERE
table_name.]column
[ table_name.]column = [ table_name.]column
(+)
220
NOT
predicate
[ {
AND
OR
} {
predicate
( search_condition )
} ]
Predicate Syntax
predicate ::= basic_predicate
| | | | | | |
<>
!=
^=
<
<=
>
>=
expr
( query_expression )
ALL
ANY
SOME
( query_expression )
NOT
221
OpenEdge SQL Elements and Statements in Backus Naur Form Null predicate Syntax
null_predicate ::= column_name IS
NOT
NULL
NOT
LIKE string_constant
ESCAPE escape_character
In predicate Syntax
in_predicate ::= expr
NOT
IN
(query_expression)
(constant , constant
... ]
table_name.]column =
table_name.]column (+)
| [
table_name.]column (+) =
table_name.]column
ALTER USER
Syntax
alter user statement ::= ALTER USER 'username', 'old_password', 'new_password' ;
222
CALL
Syntax
call statement ::= CALL proc_name (
parameter
][
...]
) ;
COMMIT
Syntax
commit statement ::= COMMIT
WORK
CREATE INDEX
Syntax
create index statement ::= CREATE [ UNIQUE ON table_name (
INDEX index_name
column_name
AREA area_name
[ ASC | ] ;
DESC
] } [, ... ]
CREATE PROCEDURE
Syntax
create procedure statement ::= CREATE PROCEDURE ( )
owner_name.]procname
[ [ [
parameter_decl
...... ] ] [
,
... ]
IN
OUT
INOUT
parameter_name data_type
223
CREATE SYNONYM
Syntax
create synonym statement ::= CREATE FOR
|synonym
CREATE TABLE
Syntax
create table statement ::= CREATE TABLE ( ; create table statement ::= CREATE TABLE
owner_name.]table_name
{ [
table_constraint
}, ...
owner_name.]table_name
[ [
;
(column_name
NULL
NOT NULL] ,
...) ]
[ [
DEFAULT
literal
column_constraint
]
UNIQUE
PRIMARY KEY
] [
( column_name )
| |
REFERENCES
owner_name.]table_name
CHECK ( search_condition )
224
OpenEdge SQL Elements and Statements in Backus Naur Form Table Constraint Syntax
table_constraint ::=
] PRIMARY KEY ( column [, ... ] ) | UNIQUE ( column [, ...... ] ) | FOREIGN KEY ( column [, ... ] ) REFERENCES [ owner_name.]table_name [ | CHECK ( search_condition )
CONSTRAINT constraint_name
( column
[, ... ]
CREATE TRIGGER
Syntax
create trigger statement ::= CREATE TRIGGER
owner_name.]trigname UPDATE
{ { [ [ [
BEFORE
| |
} DELETE |
AFTER
OF column_name
... ] }
OLDROW
REFERENCING
OLDROW
[,
NEWROW
ROW
STATEMENT
] | } ]
NEWROW
[,
]} ]
CREATE USER
Syntax
create user statement ::= CREATE USER 'username', 'password' ;
CREATE VIEW
Syntax
create view statement ::= CREATE VIEW
owner_name.]view_name
[
AS
( column_name, column_name,... )
query_expression
225
DELETE
Syntax
delete statement ::= DELETE FROM
owner_name.]
WHERE search_condition
{table_name |view_name } ] ;
DROP INDEX
Syntax
drop index statement ::= DROP INDEX
index_owner_name.]index_name
ON
table_owner_name.]table_name
DROP PROCEDURE
Syntax
drop procedure statement ::= DROP PROCEDURE
owner_name.]procedure_name ;
DROP SYNONYM
Syntax
drop synonym statement ::= DROP
PUBLIC
SYNONYM synonym ;
DROP TABLE
Syntax
drop table statement ::= DROP TABLE
owner_name.]table_name ;
DROP TRIGGER
Syntax
drop trigger statement ::= DROP TRIGGER
owner_name.]trigger_name ;
DROP USER
Syntax
drop user statement ::= DROP USER username ;
226
DROP VIEW
Syntax
drop view statement ::= DROP VIEW
owner_name.]view_name ;
RESOURCE, DBA
TO user_name
, user_name
...
GRANT PRIVILEGE
Syntax
grant privilege statement ::= GRANT { privilege ON table_name TO
[,
privilege
], ... |
,
ALL
PRIVILEGES]
user_name GRANT
[WITH
[, user_name ] OPTION] ;
... |
PUBLIC
PRIVILEGE
Syntax
privilege ::=
SELECT | INSERT | DELETE | INDEX |UPDATE [ ( column , column , ... ) ] | REFERENCES [ ( column , column , ...
] }
INSERT
Syntax
insert statement ::= INSERT INTO
{table_name |view_name } [ ( column_name [, column_name ] , ... ) ] { VALUES ( value [, value ] ,... ) | query_expression }
owner_name.]
LOCK TABLE
Syntax
lock table statement ::= LOCK TABLE table_name ;
, table_name
...
IN
SHARE
EXCLUSIVE
MODE
227
REVOKE PRIVILEGE
Syntax
revoke privilege statement ::= REVOKE
[ {
... | ]
,
ALL
PRIVILEGES
] }
, user_name
... |
PUBLIC
RESTRICT
CASCADE
| INSERT | DELETE | INDEX |UPDATE [ ( column , column , ... ) ] | REFERENCES [ ( column , column , ...
SELECT
] }
ROLLBACK
Syntax
rollback statement ::= ROLLBACK
WORK
SELECT
Syntax
select statement ::= query_expression ORDER BY
} [ ASC | DESC ] [ , { expr | posn } [ ASC | DESC ] , ... ] FOR UPDATE [ OF [ table.]column_name , ... ]
expr posn
SET SCHEMA
Syntax
set schema statement ::= SET SCHEMA { 'string_literal' | ? | USER }
228
UPDATE
Syntax
update statement ::= UPDATE table_name SET assignment
[,assignment ], ... [
WHERE search_condition
expr
NULL
| |
( column ( column
[, [,
column column
} ], ... ], ...
) = ( expr
[,
expr
], ...
) = ( query_expression )
UPDATE STATISTICS
Syntax
update statistics statement ::= UPDATE (
table_name | index_name |
ALL
column_name
STATISTICS
AND
])
...
FOR table_name
229
230
This section identifies the level of ANSI SQL-92 compliance and ODBC SQL Grammar compliance for OpenEdge statements, and the SQL-92 and ODBC compatibility for OpenEdge SQL scalar functions, as defined in the following sections: Scalar functions SQL-92 DDL and DML statements
Scalar functions
Table 50 lists OpenEdge SQL scalar functions. A check mark identifies the compatibility of the function as SQL-92 compatible, ODBC compatible, or a Progress extension. Table 50: Compatibility of SQL-92 scalar functions Progress extension (1 of 5)
Scalar function
ABS ACOS ADD_MONTHS ASCII ASIN ATAN ATAN2
SQL-92
ODBC
Notes
Scalar functions Table 50: Compatibility of SQL-92 scalar functions Progress extension (2 of 5)
Scalar function
CAST CEILING CHAR CHR COALESCE CONCAT CONVERT
SQL-92
ODBC
Notes Requires ODBC escape clause { fn } Not compatible with ODBC CONVERT
CONVERT
COS CURDATE CURTIME DATABASE DAYNAME DAYOFMONTH DAYOFWEEK DAYOFYEAR DB_NAME DECODE DEGREES EXP FLOOR GREATEST HOUR IFNULL INITCAP INSERT INSTR
232
Scalar functions Table 50: Compatibility of SQL-92 scalar functions Progress extension (3 of 5)
Scalar function
LAST_DAY LCASE LEAST LEFT LENGTH LOCATE LOG10 LOWER LPAD LTRIM MINUTE MOD MONTH MONTHNAME MONTHS_BETWEEN NEXT_DAY NOW NULLIF NVL PI POWER PREFIX PRO_ARR_DESCAPE PRO_ARR_ESCAPE PRO_ELEMENT QUARTER RADIAN RAND
SQL-92
ODBC
Notes
233
Scalar functions Table 50: Compatibility of SQL-92 scalar functions Progress extension (4 of 5)
Scalar function
REPEAT REPLACE RIGHT ROUND ROWID RPAD RTRIM SECOND SIGN SIN SQRT SUBSTR SUBSTRING SUFFIX SYSDATE SYSTIME SYSTIMESTAMP TAN TO_CHAR TO_DATE TO_NUMBER TO_TIME TO_TIMESTAMP TRANSLATE UCASE UPPER USER
SQL-92
ODBC
Notes
234
SQL-92 DDL and DML statements Table 50: Compatibility of SQL-92 scalar functions Progress extension (5 of 5)
Scalar function
WEEK YEAR
SQL-92
ODBC
Notes
SQL-92
Progress extension
COMMIT CONNECT CREATE INDEX CREATE PROCEDURE CREATE SYNONYM CREATE TABLE
Minimum Core
AREA AS
query_expression
CREATE TRIGGER CREATE USER CREATE VIEW DELETE DISCONNECT DROP INDEX DROP PROCEDURE DROP SYNONYM
Extended
235
SQL-92 DDL and DML statements Table 51: Compliance of SQL-92 DDL and DML statements ODBC SQL grammar Minimum Core Core (2 of 2)
SQL-92
Notes
Core Core
ROLLBACK SELECT SET CONNECTION SET SCHEMA SET TRANSACTION ISOLATION LEVEL UPDATE
Extended Extended
UPDATE STATISTICS
236
The OpenEdge SQL statements CREATE TABLE and ALTER TABLE allow you to define ABL (Advanced Business Language) attributes for tables and columns. This section lists and describes the SQL keywords to use with CREATE TABLE and ALTER TABLE syntax. For examples of syntax using SQL keywords for ABL attributes, see the CREATE TABLE and ALTER TABLE entries in the OpenEdge SQL Statements section on page 1.
Value Arbitrary character string Arbitrary character string Arbitrary character string Arbitrary character string Arbitrary character string
PRO_CAN_DELETE
Equivalent to ABL
CAN-DELETE
PRO_CAN_DUMP
Equivalent to ABL
CAN-DUMP
PRO_CAN_LOAD
Equivalent to ABL
CAN-LOAD
PRO_CAN_READ
Equivalent to ABL
CAN-READ
Syntax for ABL Attributes Table 52: ABL table attributes used in OpenEdge SQL statements (2 of 2)
Value Arbitrary character string Arbitrary character string Arbitrary character string
'Y'|'y'|'N'|'n'
PRO_DESCRIPTION
Equivalent to ABL
DESCRIPTION.
PRO_DUMP_NAME
Equivalent to ABL
DUMP-NAME.
PRO_FROZEN
However, the frozen attribute may be set to 'N' to unfreeze a frozen table. For example: ALTER
Indicates whether the table is shown in ABL tools and reports. Equivalent to ABL LABEL. Indicates an ABL validation expression. Indicates an ABL validation message. Indicates an ABL string attributes validation message. Indicates an ABL table label. Determines default data-access index for a table.
'Y'|'y'|'N'|'n'
PRO_LABEL
Arbitrary character string Arbitrary character string Arbitrary character string Arbitrary character string Arbitrary character string Name of an index or table
PRO_VALEXP
PRO_VALMSG
PRO_SA_VALMS
PRO_SA_LABEL
PRO_DEFAULT_INDEX
Table 53 lists the keywords to use when setting ABL column attributes with OpenEdge SQL statements.
238
Syntax for ABL Attributes Table 53: ABL column attributes used in OpenEdge SQL statements(1 of 2)
Value Arbitrary character string Arbitrary character string Free-form text Free-form text ABL format string Free-form text Free-form text Positive integer Positive integer Free-form text Integer value Free-form text Free-form text Arbitrary character string Arbitrary character string Arbitrary character string Arbitrary character string Arbitrary character string Arbitrary character string
PRO_CAN_WRITE
Equivalent to ABL
CAN-WRITE
PRO_COL_LABEL
Equivalent to ABL
COL-LABEL
PRO_DESCRIPTION
Equivalent to ABL
DESCRIPTION
PRO_FORMAT
Equivalent to ABL
FORMAT
PRO_HELP
Indicates a ABL help message Indicates ABL label Indicates ABL relative record position Indicates SQL width Equivalent to ABL
VIEW-AS
PRO_LABEL PRO_RPOS
PRO_SQL_WIDTH PRO_VIEW_AS
PRO_ORDER PRO_VALEXP
Equivalent to ABL ORDER Indicates ABL validation expression Indicates ABL validation message Indicates ABL string attribute column label Indicates ABL string attribute column label Indicates ABL string attribute column label Indicates ABL string attribute column label Indicates ABL string attribute column label Indicates ABL string attribute column label
PRO_VALMSG
PRO_SA_LABEL
PRO_SA_COL_LABEL
PRO_SA_FORMAT
PRO_SA_INITIAL
PRO_SA_HELP
PRO_SA_VALMSG
239
Syntax for ABL Attributes Table 53: ABL column attributes used in OpenEdge SQL statements(2 of 2)
Description Indicates the default value for a column. Indicates case-sensitivity The maximum size of a BLOB or CLOB column described as a string
Value A literal value whose type is compatible with the type of the column
'Y'|'y'|'N'|'n'
Table 54 lists the keywords to use when setting ABL index attributes with OpenEdge SQL statements. Table 54: ABL index attributes used in OpenEdge SQL statements
Description Changes the indexs status from active to inactive. This action must be performed offline. Equivalent to ABL
DESCRIPTION. 'n'
Value
PRO_DESCRIPTION
Free-form text
240
Part II
JDBC Reference
Java Class Reference JDBC Conformance Notes
This section provides information on OpenEdge SQL Java classes and methods. The following subjects are covered: Java classes and methods DhSQLException DhSQLResultSet SQLCursor SQLIStatement SQLPStatement
setParam
Sets the value of an SQL statements input parameter to the specified value; a literal, procedure variable, or procedure input parameter. The following Java classes declare setParam:
SQLIStatement SQLPStatement
makeNULL
Sets the value of an SQL statements input parameter to NULL. The following Java classes declare makeNULL:
SQLIStatement SQLPStatement SQLCursor
Sets a field of the currently active row in a procedures result set to NULL:
DhSQLResultSet
execute
Executes the SQL statement. The following Java classes declare execute:
SQLIStatement SQLPStatement
rowCount
Returns the number of rows deleted, inserted, or updated by the SQL statement. The following Java classes declare rowCount:
SQLIStatement SQLPStatement SQLCursor
open
Opens the result set specified by the SELECT or CALL statement. The following Java class declares open:
SQLCursor
close
Closes the result set specified by the SELECT or CALL statement. The following Java class declares close:
SQLCursor
fetch
Fetches the next record in a result set. The following Java class declares fetch:
SQLCursor
244
found
Checks whether a fetch operation returned to a record. The following Java class declares found:
SQLCursor
wasNULL
Checks if the value in a fetched field is NULL. The following Java class declares wasNULL:
SQLCursor
getValue
Stores the value of a fetched field in the specified procedure variable or procedure output parameter. The following Java class declares getValue:
SQLCursor
set
Sets the field in the currently active row of a procedures result set a literal, procedure variable, or procedure input parameter. The following Java class declares set:
DhSQLResultSet
insert
Inserts the currently active row into the result set of a procedure. The following Java class declares insert:
DhSQLResultSet
getDiagnostics
Returns the specified detail of an error message. The following Java class declares getDiagnostics:
DhSQLException
log
Writes a message to the log. The following Java classes inherit the log:
SQLIStatement SQLPStatement SQLCursor DhSQLResult Set DhSQLException
245
err
Writes a message to the log. The following Java classes write to the log:
SQLIStatement SQLPStatement SQLCursor DhSQLResult Set DhSQLException
DhSQLException
Extends the general java.lang. exception class to provide detail about errors in SQL statement execution. Any such errors raise an exception with an argument that is an SQLException class object. The getDiagnostics() method retrieves details of the error. Constructors
public DhSQLException(int
Parameters
ecode
The error message associated with the exception condition. Example In this example, the DhSQLException constructor creates an exception object called excep and then throws the excep object under all conditions:
CREATE PROCEDURE sp1_02() BEGIN // raising exception DhSQLException excep = new DhSQLException(666,new String ("Entered the tst02 procedure")); if (true) throw excep; END
DhSQLException.getDiagnostics
Returns the requested detail about an exception. Format public String getDiagnostics(int diagType)
246
Java Class Reference Returns A string containing the information specified by the diagType parameter, as shown in Table 55. Parameters
diagType
One of the argument values listed in Table 55. Table 55: Argument values for DhSQLException.getDiagnostics Argument value
RETURNED_SQLSTATE
Returns The SQLSTATE returned by execution of the previous SQL statement The condition indicated by
RETURNED_SQLSTATE
MESSAGE_TEXT
CLASS_ORIGIN SUBCLASS_ORIGIN
Not currently used; always returns NULL Not currently used; always returns NULL
Throws
DhSQLException
Example
try { SQLIStatement insert_cust = new SQLIStatement ( "INSERT INTO customer VALUES (1,2) "); } catch (DhSQLException e) { errstate = e.getDiagnostics (RETURNED_SQLSTATE) ; errmesg = e.getDiagnostics (MESSAGE_TEXT) ; . . . }
DhSQLResultSet
Provides the stored procedure with a result set to return to the application that called the procedure. The Java code in a stored procedure does not explicitly create DhSQLResultSet objects. Instead, when the SQL server creates a Java class from a CREATE PROCEDURE statement that contains a Result clause, it implicitly instantiates an object of type DhSQLResultSet, and calls it SQLResultSet.
247
Java Class Reference Procedures invoke methods of the SQLResultSet instance to populate fields and rows of the result set. Constructors No explicit constructor Parameters None Throws
DhSQLException
DhSQLResultSet.insert
Inserts the currently active row into a procedures result set. Format public void insert() Returns None Parameters None Throws
DhSQLException
Example
248
CREATE PROCEDURE get_sal2 () RESULT ( empname CHAR(20), empsal NUMERIC, ) BEGIN String ename = new String (20) ; BigDecimal esal = new BigDecimal () ; SQLCursor empcursor = new SQLCursor ( "SELECT name, sal FROM emp " ) ; empcursor.Open () ; do { empcursor.Fetch (); if (empcursor.found ()) { empcursor.getValue (1, ename); empcursor.getValue (2, esal); SQLResultSet.Set (1, ename); SQLResultSet.Set (2, esal); SQLResultSet.Insert (); } } while (empcursor.found ()) ; empcursor.close () ; END
DhSQLResultSet.makeNULL
Sets a field of the currently active row in a procedures result set to NULL. This method is redundant with using the DhSQLResultSet.set method to set a procedure result-set field to NULL. Format public void makeNULL(int field) Returns None Parameters
field
An integer that specifies which field of the result-set row to set to NULL. 1 denotes the first field in the row, 2 denotes the second, n denotes the nth. Throws
DhSQLException
Example
249
CREATE PROCEDURE test_makeNULL2( IN char_in CHAR(20) RESULT ( res_char CHAR(20) , res_vchar VARCHAR(30)) BEGIN SQLResultSet.set(1,char_in); SQLResultSet.makeNULL(2); END
DhSQLResultSet.set
Sets the field in the currently active row of a procedures result set to the specified value (a literal, procedure variable, or procedure input parameter). Format public void set(int field, Object val) Returns None Parameters
field
An integer that specifies which field of the result-set row to set to the value specified by val. (1 denotes the first field in the row, 2 denotes the second, and so on.)
val
A literal or the name of a variable or input parameter that contains the value to be assigned to the field. Throws
DhSQLException
Example
250
CREATE PROCEDURE get_sal2 () RESULT ( empname CHAR(20), empsal NUMERIC, ) BEGIN String ename = new String (20) ; BigDecimal esal = new BigDecimal () ; SQLCursor empcursor = new SQLCursor ( "SELECT name, sal FROM emp " ) ; empcursor.Open () ; do { empcursor.Fetch (); if (empcursor.found ()) { empcursor.getValue (1, ename); empcursor.getValue (2, esal); SQLResultSet.Set (1, ename); SQLResultSet.Set (2, esal); SQLResultSet.Insert (); } } while (empcursor.found ()) ; empcursor.close () ; END
SQLCursor
Allows rows of data to be retrieved from a database or another stored procedures result set. Constructors
SQLCursor (String statement)
Parameters
statement
Generates a result set. Enclose the SQL statement in double quotes. The SQL statement is either a SELECT or CALL statement. Notes A SELECT statement queries the database and returns data that meets the criteria specified by the query expression in the SELECT statement. A CALL statement invokes another stored procedure that returns a result set specified by the RESULT clause of the CREATE PROCEDURE statement.
Throws
DhSQLException
Examples
The following excerpt from a stored procedure instantiates an SQLCursor object called cust_cursor that retrieves data from a database table:
251
SQLCursor empcursor = new SQLCursor ( "SELECT name, sal FROM emp " ) ;
The following excerpt from a stored procedure instantiates an SQLCursor object called cust_cursor that calls another stored procedure:
SQLCursor.close
Closes the result set specified by a SELECT or CALL statement. Format public void close() Returns None Parameters None Throws
DhSQLException
Example
{ if (cust_cursor.Found ()) { cust_cursor.getValue (1, cust_number); cust_cursor.getValue (2, cust_name) ; } else break; } cust_cursor.close () ;
SQLCursor.fetch
Fetches the next record in a result set, if there is one. Format public void fetch()
252
Example
This code fragment illustrates the fetch method and the getValue method:
for (;;) { cust_cursor.Fetch (); if (cust_cursor.Found ()) { cust_cursor.getValue (1, cust_number); cust_cursor.getValue (2, cust_name) ; } else break; }
SQLCursor.found
Checks whether a fetch operation returned a record. Format public boolean found () Returns True if the previous call to fetch() returned a record, false otherwise Parameters None Throws
DhSQLException
Example
This code fragment illustrates the fetch, found, and getValue methods:
253
for (;;) { cust_cursor.Fetch (); if (cust_cursor.Found ()) { cust_cursor.getValue (1, cust_number); cust_cursor.getValue (2, cust_name) ; } else break; }
SQLCursor.getParam
Retrieves the values of Java OUT and INOUT parameters. Format inout_var = getParam( int fieldIndex, short fieldType ) ; Returns
OUT
or INOUT variable
Parameters
inout_var
The target variable into which the value of an OUT or INOUT parameter is stored.
fieldIndex
An integer that specifies the position of the parameter in the parameter list.
fieldType
A short integer that specifies the data type of the parameter. The allowable defined values for fieldType are listed in Table 56, grouped by category of data type. Table 56: Allowable values for fieldType in getParam Exact numeric
INTEGER SMALLINT TINYINT NUMERIC DECIMAL
Character
CHAR CHARACTER VARCHAR
Approximate numeric
REAL FLOAT DOUBLE
Date-time
DATE TIME TIMESTAMP
Bit string
BIT BINARY VARBINARY LVARBINARY
254
Notes
The getParam() method returns the value of an INOUT or OUT parameter identified by the number you specify in the fieldIndex parameter. getParam() returns the value as an object of the data type you specify in the fieldType parameter. Since getParam() returns the result as an instance of class Object, you must explicitly cast your inout_var variable to the correct data type. If the OUT or INOUT parameter is of data type CHARACTER, then getParam returns a Java String Object. You must declare a procedure variable of type String, and explicitly cast the value returned by getParam to type String. Before calling getParam() you must call the SQLCursor.wasNULL method to test whether the returned value is NULL. If getParam() is called for a NULL value, it raises a DhSQLException.
SQLCursor.getValue
Assigns a single value from an SQL result set to a procedure variable. The single field value is the result of an SQL query or the result from another stored procedure. Format public Object getValue( int fieldNum, short fieldType ) Returns Object Parameters
fieldNum
An integer that specifies the position of the field to retrieve from the fetched record.
fieldType
A short integer that specifies the data type of the parameter. The allowable defined values for fieldType are listed in Table 57, grouped by category of data type. Table 57: Allowable values for fieldType in getValue Exact numeric
INTEGER SMALLINT TINYINT NUMERIC DECIMAL
Character
CHAR CHARACTER VARCHAR
Approximate numeric
REAL FLOAT DOUBLE
Date-time
DATE TIME TIMESTAMP
Bit string
BIT BINARY VARBINARY LVARBINARY
255
Notes
Before invoking getValue, you must test for the NULL condition by calling the SQLCursor.wasNULL method. If the value returned is NULL, you must explicitly set the target variable in the stored procedure to NULL. The getValue method returns a value from the result set identified by the number you specify in the fieldNum parameter. getValue returns the value as an object of the data type you specify in the fieldType parameter. Since getValue returns the result as an instance of class Object, you must explicitly cast your return value to the correct data type. If the returned value is of data type CHARACTER, then getValue returns a Java String Object. You must declare a procedure variable of type String and explicitly cast the value returned by getValue to type String.
Example
This example illustrates testing for NULL and invoking the Java getValue method:
Integer pvar_int = new Integer(0); String pvar_str = new String(); SQLCursor select_t1 = new SQLCursor ("select int_col, char_col from T1"); Select_t1.open(); Select_t1.fetch(); while(select_t1.found()) { // Assign values from the current row of the SQL result set // to the procedure variables. First check whether // the values fetched are null. If null then explicitly // set the procedure variables to null. if ((select_t1.wasNULL(1)) == true) pvar_int = null; else pvar_int = (Integer)select_t1.getValue(1, INTEGER); if ((select_t1.wasNULL(2)) == true) pvar_str = null; else pvar_str = (String)select_t1.getValue(1, CHAR); }
SQLCursor.makeNULL
Sets the value of an SQL statements input parameter to NULL. This method is common to the SQLCursor, SQLIStatement, and SQLPStatement classes. This method is redundant with using the setParam method to set an SQL statements input parameter to NULL. Format public void makeNULL(int f) Returns None 256
An integer that specifies which input parameter of the SQL statement string to set to NULL. 1 denotes the first input parameter in the statement, 2 denotes the second, n denotes the nth. Throws
DhSQLException
Example
CREATE PROCEDURE sc_makeNULL() BEGIN SQLCursor select_btypes = new SQLCursor ( "SELECT small_fld from sfns where small_fld = ? "); select_btypes.makeNULL(1); select_btypes.open(); select_btypes.fetch(); . . . select_btypes.close(); END
SQLCursor.open
Opens the result set specified by the SELECT or CALL statement. Format public void open() Returns None Parameters None Throws
DhSQLException
Example
SQLCursor empcursor = new SQLCursor ( "SELECT name, sal FROM emp " ) ; empcursor.Open () ;
257
SQLCursor.registerOutParam
Registers OUT parameters. Format registerOutParam( int fieldIndex, short fieldType Returns None Parameters
fieldIndex
[ , short scale ] )
An integer that specifies the position of the parameter in the parameter list.
fieldType
A short integer that specifies the data type of the parameter. The allowable defined values for fieldType are listed in Table 58, grouped by category of data type. Table 58: Allowable values for fieldType in registerOutParam Exact numeric
INTEGER SMALLINT TINYINT NUMERIC DECIMAL
Character
CHAR CHARACTER VARCHAR
Approximate numeric
REAL FLOAT DOUBLE
Date-time
DATE TIME TIMESTAMP
Bit string
BIT BINARY VARBINARY LVARBINARY
Throws
DhSQLException
SQLCursor.rowCount
Returns the number of rows affected (selected, inserted, updated, or deleted) by the SQL statement. This method is common to the SQLCursor, SQLIStatement, and SQLPStatement classes. Format public int rowCount()
258
Java Class Reference Returns An integer indicating the number of rows. Parameters None Throws
DhSQLException
Example
This example uses the rowCount method of the SQLIStatement class by nesting the method invocation within SQLResultSet.set to store the number of rows affected (1, in this case) in the procedures result set:
CREATE PROCEDURE sis_rowCount() RESULT ( ins_recs INTEGER ) BEGIN SQLCursor insert_test103 = new SQLIStatement ( "INSERT INTO test103 (fld1) values (17)"); insert_test103.execute(); SQLResultSet.set(1,new Long(insert_test103.rowCount())); SQLResultSet.insert(); END
SQLCursor.setParam
Sets the value of an SQL statements input parameter to the specified value (a literal, procedure variable, or procedure input parameter). This method is common to the SQLCursor, SQLIStatement, and SQLPStatement classes. Format public void setParam(int f, Object val) Returns None Parameters
f
An integer that specifies which parameter marker in the SQL statement is to receive the value. 1 denotes the first parameter marker, 2 denotes the second, n denotes the nth.
val
A literal or the name of a variable or input parameter that contains the value to be assigned to the parameter marker.
259
Example
CREATE PROCEDURE sps_setParam() BEGIN // Assign local variables to be used as SQL input parameter references Integer ins_fld_ref = new Integer(1); Integer ins_small_fld = new Integer(3200); Integer ins_int_fld = new Integer(21474); Double ins_doub_fld = new Double(1.797E+30); String ins_char_fld = new String("Athula"); String ins_vchar_fld = new String("Scientist"); Float ins_real_fld = new Float(17); SQLIStatement insert_sfns1 = new SQLIStatement ("INSERT INTO sfns (fld_ref,small_fld,int_fld,doub_fld,char_fld,vchar_fld) values (?,?,?,?,?,?)" ); insert_sfns1.setParam(1,ins_fld_ref); insert_sfns1.setParam(2,ins_small_fld); insert_sfns1.setParam(3,ins_int_fld); insert_sfns1.setParam(4,ins_doub_fld); insert_sfns1.setParam(5,ins_char_fld); insert_sfns1.setParam(6,ins_vchar_fld); insert_sfns1.execute(); END
SQLCursor.wasNULL
Checks if the value in a fetched field is NULL. Format public boolean wasNULL(int field) Returns True if the field is NULL, false otherwise Parameters
field
An integer that specifies which field of the fetched record is of interest. (1 denotes the first column of the result set, 2 denotes the second, and so on.) wasNULL checks whether the value in the currently fetched record of the column denoted by field is NULL. Throws
DhSQLException
Example
260
CREATE PROCEDURE test_wasNULL() BEGIN int small_sp = 0; SQLCursor select_btypes = new SQLCursor ("SELECT small_fld from sfns"); select_btypes.open(); select_btypes.fetch(); if ((select_btypes.wasNULL(1)) == true) small_sp = null; else select_btypes.getValue(1,small_sp); select_btypes.close(); END
SQLIStatement
Allows immediate (one-time) execution of SQL statements that do not generate a result set. Constructors
SQLIStatement (String statement)
Parameters
statement
An SQL statement that does not generate a result set. Enclose the SQL statement in double quotes. Throws
DhSQLException
Example
CREATE PROCEDURE insert_customer ( IN cust_number INTEGER, IN cust_name CHAR(20) ) BEGIN SQLIStatement insert_cust = new SQLIStatement ( "INSERT INTO customer VALUES (?,?) "); END
SQLIStatement.execute
Executes the SQL statement. This method is common to the SQLIStatement and SQLPStatement classes.
261
Java Class Reference Format public void execute() Returns None Parameters None Throws
DhSQLException
Example
CREATE PROCEDURE insert_customer ( IN cust_number INTEGER, IN cust_name CHAR(20) ) BEGIN SQLIStatement insert_cust = new SQLIStatement ( "INSERT INTO customer VALUES (?,?) "); insert_cust.setParam (1, cust_number); insert_cust.setParam (2, cust_name); insert_cust.execute (); END
SQLIStatement.makeNULL
Sets the value of an SQL statements input parameter to NULL. This method is common to the SQLCursor, SQLIStatement, and SQLPStatement classes. This method is redundant with using the setParam method to set an SQL statements input parameter to NULL. Format public void makeNULL(int f) Returns None Parameters
f
An integer that specifies which input parameter of the SQL statement string to set to NULL. 1 denotes the first input parameter in the statement, 2 denotes the second, n denotes the nth.
262
Example
CREATE PROCEDURE sis_makeNULL() BEGIN SQLIStatement insert_sfns1 = new SQLIStatement ("INSERT INTO sfns (fld_ref,small_fld,int_fld,doub_fld,char_fld,vchar_fld) values (?,?,?,?,?,?)" ); insert_sfns1.setParam(1,new Integer(66)); insert_sfns1.makeNULL(2); insert_sfns1.makeNULL(3); insert_sfns1.makeNULL(4); insert_sfns1.makeNULL(5); insert_sfns1.makeNULL(6); insert_sfns1.execute(); END
SQLIStatement.rowCount
Returns the number of rows affected (selected, inserted, updated, or deleted) by the SQL statement. This method is common to the SQLCursor, SQLIStatement, and SQLPStatement classes. Format public int rowCount() Returns An integer indicating the number of rows Parameters None Throws
DhSQLException
Example
This example uses the rowCount method of the SQLIStatement class by nesting the method invocation within SQLResultSet.set to store the number of rows affected (1, in this case) in the procedures result set:
263
CREATE PROCEDURE sis_rowCount() RESULT ( ins_recs INTEGER ) BEGIN SQLIStatement insert_test103 = new SQLIStatement ( "INSERT INTO test103 (fld1) values (17)"); insert_test103.execute(); SQLResultSet.set(1,new Long(insert_test103.rowCount())); SQLResultSet.insert(); END
SQLIStatement.setParam
Sets the value of an SQL statements input parameter to the specified value (a literal, procedure variable, or procedure input parameter). This method is common to the SQLCursor, SQLIStatement, and SQLPStatement classes. Format public void setParam(int f, Object val) Returns None Parameters
f
An integer that specifies which parameter marker in the SQL statement is to receive the value (1 denotes the first parameter marker, 2 denotes the second, and so on).
val
A literal or the name of a variable or input parameter that contains the value to be assigned to the parameter marker. Throws
DhSQLException
Example
264
CREATE PROCEDURE sps_setParam() BEGIN // Assign local variables to be used as // SQL input parameter references Integer ins_fld_ref = new Integer(1); Integer ins_small_fld = new Integer(3200); Integer ins_int_fld = new Integer(21474); Double ins_doub_fld = new Double(1.797E+30); String ins_char_fld = new String("Athula"); String ins_vchar_fld = new String("Scientist"); Float ins_real_fld = new Float(17); SQLPStatement insert_sfns1 = new SQLPStatement ("INSERT INTO sfns (fld_ref,small_fld,int_fld,doub_fld,char_fld,vchar_fld) values (?,?,?,?,?,?)" ); insert_sfns1.setParam(1,ins_fld_ref); insert_sfns1.setParam(2,ins_small_fld); insert_sfns1.setParam(3,ins_int_fld); insert_sfns1.setParam(4,ins_doub_fld); insert_sfns1.setParam(5,ins_char_fld); insert_sfns1.setParam(6,ins_vchar_fld); insert_sfns1.execute(); END
SQLPStatement
Allows prepared (repeated) execution of SQL statements that do not generate a result set. Constructors
SQLPStatement (String statement)
Parameters
statement
An SQL statement that does not generate a result set. Enclose the SQL statement in double quotes. Throws
DhSQLException
Example
SQLPStatement.execute
Executes the SQL statement. This method is common to the SQLIStatement and SQLPStatement classes.
265
Java Class Reference Format public void execute() Returns None Parameters None Throws
DhSQLException
Example
This code fragment illustrates the execute and setParam methods in the SQLPStatement class:
SQLPStatement pstmt = new SQLPStatement ( "INSERT INTO T1 VALUES (?, ?) ") ; pstmt.setParam (1, 10); pstmt.setParam (2, 10); pstmt.execute (); pstmt.setParam (1, 20); pstmt.setParam (2, 20); pstmt.execute ();
SQLPStatement.makeNULL
Sets the value of an SQL statements input parameter to NULL. This method is common to the SQLCursor, SQLIStatement, and SQLPStatement classes. This method is redundant with using the setParam method to set an SQL statements input parameter to NULL. Format public void makeNULL(int f) Returns None Parameters
f
An integer that specifies which input parameter of the SQL statement string to set to NULL. (1 denotes the first input parameter in the statement, 2 denotes the second, and so on.) Throws DhSQLException
266
CREATE PROCEDURE sps_makeNULL() BEGIN SQLPStatement insert_sfns1 = new SQLPStatement ("INSERT INTO sfns (fld_ref,small_fld,int_fld,doub_fld,char_fld,vchar_fld) values (?,?,?,?,?,?)" ); insert_sfns1.setParam(1,new Integer(666)); insert_sfns1.makeNULL(2); insert_sfns1.makeNULL(3); insert_sfns1.makeNULL(4); insert_sfns1.makeNULL(5); insert_sfns1.makeNULL(6); insert_sfns1.execute(); END
SQLPStatement.rowCount
Returns the number of rows affected (selected, inserted, updated, or deleted) by the SQL statement. This method is common to the SQLCursor, SQLIStatement, and SQLPStatement classes. Format public int rowCount() Returns An integer indicating the number of rows Parameters None Throws
DhSQLException
Example
This example uses the rowCount method of the SQLPStatement class by nesting the method invocation within SQLResultSet.set to store the number of rows affected (1, in this case) in the procedures result set:
CREATE PROCEDURE sis_rowCount() RESULT ( ins_recs INTEGER ) BEGIN SQLPStatement insert_test103 = new SQLPStatement ( "INSERT INTO test103 (fld1) values (17)"); insert_test103.execute(); SQLResultSet.set(1,new Long(insert_test103.rowCount())); SQLResultSet.insert(); END
267
SQLPStatement.setParam
Sets the value of an SQL statements input parameter to the specified value (a literal, procedure variable, or procedure input parameter). This method is common to the SQLCursor, SQLIStatement, and SQLPStatement classes. Format public void setParam(int f, Object val) Returns None Parameters
f
An integer that specifies which parameter marker in the SQL statement is to receive the value (1 denotes the first parameter marker, 2 denotes the second, and so on).
val
A literal or the name of a variable or input parameter that contains the value to be assigned to the parameter marker. Throws
DhSQLException
Example
CREATE PROCEDURE sps_setParam() BEGIN // Assign local variables to be used as // SQL input parameter references Integer ins_fld_ref = new Integer(1); Integer ins_small_fld = new Integer(3200); Integer ins_int_fld = new Integer(21474); Double ins_doub_fld = new Double(1.797E+30); String ins_char_fld = new String("Athula"); String ins_vchar_fld = new String("Scientist"); Float ins_real_fld = new Float(17); SQLPStatement insert_sfns1 = new SQLPStatement ("INSERT INTO sfns (fld_ref,small_fld,int_fld,doub_fld,char_fld,vchar_fld) values (?,?,?,?,?,?)" ); insert_sfns1.setParam(1,ins_fld_ref); insert_sfns1.setParam(2,ins_small_fld); insert_sfns1.setParam(3,ins_int_fld); insert_sfns1.setParam(4,ins_doub_fld); insert_sfns1.setParam(5,ins_char_fld); insert_sfns1.setParam(6,ins_vchar_fld); insert_sfns1.execute(); END
268
This section details the DataDirect JDBC drivers support for the JDBC standard. Information presented in this section includes: Supported data types Return values for DatabaseMetaData
(1 of 2)
Supported data types Table 59: Mapping between Java and JDBC data types Java data type double float Int java.math.BigDecimal java.sql.Date java.sql.Time java.sql.Timestamp Short String
DOUBLE REAL INTEGER NUMERIC, DECIMAL DATE TIME TIMESTAMP SMALLINT VARCHAR
(2 of 2)
For getXXX methods, the driver converts the JDBC data type returned by the database to the Java data type shown in Table 60, Table 61, and Table 62 before returning it to the getXXX method. Table 60 details mapping between JDBC and Java data types. Table 60: Mapping between JDBC and Java data types JDBC data type
BIT CHAR DECIMAL INTEGER NUMERIC SMALLINT TINYINT VARCHAR
int
java.math.BigDecimal
short byte
String
Table 61 details mapping between SQL-92 and Java data types. Table 61: Mapping between SQL-92 and Java data types SQL-92 data type
BINARY BIT
(1 of 2)
270
Supported data types Table 61: Mapping between SQL-92 and Java data types SQL-92 data type
CHAR, VARCHAR DATE DECIMAL DOUBLE PRECISION FLOAT INTEGER LONGVARBINARY NUMERIC REAL SMALLINT TIME TIMESTAMP TINYINT VARBINARY String java.sql.Date java.math.BigDecimal
(2 of 2)
Float short
java.sql.Time java.sql.Timestamp
byte[ ] byte[ ]
Table 62 provides information on JDBC data type conversion. Table 62: JDBC data type conversion JDBC data type
BIGINT BINARY BIT CHAR
(1 of 2) Converts to . . .
Does not convert to any other data type Does not convert to any other data type
BIGINT, DATE. DECIMAL, DOUBLE, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, TIME, TIMESTAMP, TINYINT, VARCHAR CHAR, TIMESTAMP, VARCHAR BIGINT, CHAR, DOUBLE, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, TINYINT, VARCHAR BIGINT, CHAR, DECIMAL, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, TINYINT, VARCHAR
DATE DECIMAL
DOUBLE
271
Return values for DatabaseMetaData Table 62: JDBC data type conversion JDBC data type
FLOAT
(2 of 2) Converts to . . .
BIGINT, CHAR, DECIMAL, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, TINYINT, VARCHAR BIGINT, CHAR, DECIMAL, DOUBLE, FLOAT, NUMERIC, REAL, SMALLINT, TINYINT, VARCHAR
INTEGER
Does not convert to any other data type Does not convert to any other data type
BIGINT, CHAR, DECIMAL, DOUBLE, FLOAT, INTEGER, REAL, SMALLINT, TINYINT, VARCHAR BIGINT, CHAR, DECIMAL, DOUBLE, FLOAT, INTEGER, NUMERIC, SMALLINT, TINYINT, VARCHAR BIGINT, CHAR, DECIMAL, DOUBLE, FLOAT, INTEGER, NUMERIC, REAL, TINYINT, VARCHAR CHAR, TIMESTAMP CHAR, DATE, TIME, VARCHAR BIGINT, CHAR, DECIMAL, DOUBLE, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, VARCHAR
REAL
SMALLINT
VARBINARY VARCHAR
272
Return values for DatabaseMetaData Table 63: Return values for DatabaseMetaData methods Method
allProceduresAreCallable()
(1 of 11) Returns
False
Description Can all the procedures returned by getProcedures be called by the current user? Can all the tables returned by getTable be SELECTed by the current user? Does a data definition statement within a transaction force the transaction to commit? Is a data definition statement within a transaction ignored? Did getMaxRowSize() include LONGVARCHAR and LONGVARBINARY BLOBs? Gets a description of a tables optimal set of columns that uniquely identifies a row. Gets the catalog names available in this database. What is the separator between catalog and table names? What is the database vendors preferred term for catalog? Gets a description of the access rights for a tables columns. Gets a description of table columns available in a catalog.
allTablesAreSelectable()
False
dataDefinitionCausesTransactionCommi t()
True
dataDefinitionIgnoredInTransactions( )
False
doesMaxRowSizeIncludeBlobs()
False
(Result set)
getCatalogs()
getCatalogSeparator()
getCatalogTerm()
(Result set)
273
Return values for DatabaseMetaData Table 63: Return values for DatabaseMetaData methods Method
getCrossReference (String, String, String, String, String, String)
Description Gets a description of the foreign key columns in the foreign key table that reference the primary key columns of the primary key table (describes how one table imports anothers key). This should normally return a single foreign key/primary key pair (most tables only import a foreign key from a table once). They are ordered by FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, and KEY_SEQ. What is the name of this database product? What is the version of this database product? What is the databases default transaction isolation level? The values are defined in java.sql.Connection. What is the version of this JDBC driver? What is the minor version of this JDBC driver? What is the name of this JDBC driver? What is the version of this JDBC driver? Gets a description of the foreign key columns that reference a tables primary key columns (the foreign keys exported by a table). Gets all the extra characters that can be used in unquoted identifier names (those beyond az, AZ, 09 and _).
getDatabaseProductName()
OPENEDGE
getDatabaseProductVersion()
10.0A1B
getDefaultTransactionIsolation()
TRANSACTION_READ_COMMITTE D
getDriverMajorVersion()
getDriverMinorVersion()
1000
getDriverName()
OpenEdge
4.0.00 5805 (040318.014802)
getDriverVersion()
(Result set)
getExtraNameCharacters()
_, %
274
Return values for DatabaseMetaData Table 63: Return values for DatabaseMetaData methods Method
getIdentifierQuoteString ()
(3 of 11) Returns
Description What is the string used to quote SQL identifiers? This returns a space if identifier quoting is not supported. Gets a description of the primary key columns that reference a tables foreign key columns (the primary keys imported by a table). Gets a description of a tables indices and statistics. How many hex characters can you have in an inline binary literal? What is the maximum length of a catalog name? What is the maximum length for a character literal? What is the limit on column name length? What is the maximum number of columns in a GROUP BY clause? What is the maximum number of columns allowed in an index? What is the maximum number of columns in an ORDER BY clause? What is the maximum number of columns in a SELECT list? What is the maximum number of columns in a table? How many active connections can we have at a time to this database? What is the maximum cursor name length?
(Result set)
(Result set)
31983
getMaxCatalogNameLength()
None No catalogs
31983
getMaxCharLiteralLength()
getMaxColumnNameLength()
32
getMaxColumnsInGroupBy()
499
getMaxColumnsInIndex()
16
getMaxColumnsInOrderBy()
getMaxColumnsInSelect()
500
getMaxColumnsInTable()
500
getMaxConnections()
getMaxCursorNameLength()
18
275
Return values for DatabaseMetaData Table 63: Return values for DatabaseMetaData methods Method
getMaxIndexLength()
(4 of 11) Returns
113
Description What is the maximum length of an index (in bytes)? What is the maximum length of a procedure name? What is the maximum length of a single row? What is the maximum length allowed for a schema name? What is the maximum length of an SQL statement? How many active statements can we have open at one time to this database? What is the maximum length of a table name? What is the maximum number of tables in a SELECT? What is the maximum length of a user name? Gets a comma-separated list of math functions.
getMaxProcedureNameLength()
32
getMaxRowSize()
31,995
bytes
getMaxSchemaNameLength()
32
getMaxStatementLength()
131,000
getMaxStatements()
100
getMaxTableNameLength()
32
getMaxTablesInSelect()
250
getMaxUserNameLength()
32
getNumericFunctions()
ABS, ACOS, ASIN, ATAN, ATAN2, CEILING, COS, DEGREES, EXP, FLOOR, LOG10, MOD, PI, POWER, RADIANS, RAND, ROUND, SIGN,SIN, SQRT, TAN
Gets a description of a tables primary key columns. Get a description of a catalogs stored procedure parameters and result columns. Gets a description of stored procedures available in a catalog. What is the database vendors preferred term for procedure? Gets the schema names available in this database.
(Result set)
(Result set)
(Result set)
getProcedureTerm()
procedure
getSchemas()
(Result set)
276
Return values for DatabaseMetaData Table 63: Return values for DatabaseMetaData methods Method
getSchemaTerm()
(5 of 11) Returns
Owner
Description What is the database vendors preferred term for schema? This is the string that can be used to escape _ or % in the string pattern style catalog search parameters. Gets a comma-separated list of all a databases SQL keywords that are NOT also SQL keywords. Gets a comma-separated list of string functions.
getSearchStringEscape()
getSQLKeywords()
See the OpenEdge SQL Reserved Words section for a complete list of reserved words.
ASCII, CHAR, CONCAT, DIFFERENCE, INSERT, LCASE, LEFT, LENGTH, LOCATE, LOCATE-2, LTRIM, REPEAT, REPLACE, RIGHT, RTRIM, SPACE, SUBSTRING, UCASE USERNAME, IFNULL, DBNAME
getStringFunctions()
getSystemFunctions()
Gets a comma-separated list of system functions. Gets a description of the access rights for each table available in a catalog. Gets a description of tables available in a catalog. Gets the table types available in this database. Gets a comma-separated list of time and date functions.
(Result set)
getTimeDateFunctions()
getTypeInfo()
Gets a description of all the standard SQL types supported by this database. What is the URL for this database? What is our user name as known to the database? Gets a description of a tables columns that are automatically updated when any value in a row is updated.
(Result set)
getURL()
getUserName()
277
Return values for DatabaseMetaData Table 63: Return values for DatabaseMetaData methods Method
isCatalogAtStart()
(6 of 11) Returns
False
Description Does a catalog appear at the start of a qualified table name? Otherwise it appears at the end. Is the database in read-only mode? Are concatenations between NULL and non-NULL values NULL? A JDBC-compliant driver always returns true. Are NULL values sorted at the end regardless of sort order? Are NULL values sorted at the start regardless of sort order? Are NULL values sorted high? Are NULL values sorted low? Does the database treat mixed-case, unquoted SQL identifiers as case insensitive and store them in lowercase? Does the database treat mixed-case, quoted SQL identifiers as case insensitive and store them in lowercase? Does the database treat mixed-case, unquoted SQL identifiers as case insensitive and store them in mixed case? Does the database treat mixed-case, quoted SQL identifiers as case insensitive and store them in mixed case? Does the database treat mixed-case, unquoted SQL identifiers as case insensitive and store them in uppercase?
isReadOnly()
False
nullPlusNonNullIsNull()
True
nullsAreSortedAtEnd()
False
nullsAreSortedAtStart()
False
storesLowerCaseQuotedIdentifiers()
False
storesMixedCaseIdentifiers()
False
storesMixedCaseQuotedIdentifiers()
True
storesUpperCaseIdentifiers()
True
278
Return values for DatabaseMetaData Table 63: Return values for DatabaseMetaData methods Method
storesUpperCaseQuotedIdentifiers()
(7 of 11) Returns
False
Description Does the database treat mixed-case, quoted SQL identifiers as case insensitive and store them in uppercase? Is ALTER TABLE with add column supported? Is ALTER TABLE with drop column supported? Is the ANSI92 entry level SQL grammar supported? All JDBC-compliant drivers must return true. Is the ANSI92 full SQL grammar supported? Is the ANSI92 intermediate SQL grammar supported? Can a catalog name be used in a data manipulation statement? Can a catalog name be used in an index definition statement? Can a catalog name be used in a privilege definition statement? Can a catalog name be used in a procedure call statement? Can a catalog name be used in a table definition statement? Is column aliasing supported? If so, the SQL AS clause can be used to provide names for computed columns or to provide alias names for columns as required. Is the CONVERT function between SQL types supported? Is CONVERT between the given SQL types supported?
supportsAlterTableWithAddColumn()
False
supportsAlterTableWithDropColumn()
False
supportsANSI92EntryLevelSQL()
True
supportsANSI92FullSQL()
False
supportsANSI92IntermediateSQL()
False
supportsCatalogsInDataManipulation()
False
supportsCatalogsInIndexDefinitions()
False
supportsCatalogsInPrivilegeDefinitio ns()
False
supportsCatalogsInProcedureCalls()
False
supportsCatalogsInTableDefinitions()
False
supportsColumnAliasing()
True
supportsConvert()
True
supportsConvert(int, int)
True
279
Return values for DatabaseMetaData Table 63: Return values for DatabaseMetaData methods Method
supportsCoreSQLGrammar()
(8 of 11) Returns
True
Description Is the ODBC Core SQL grammar supported? Are correlated subqueries supported? A JDBC-compliant driver always returns true. Are both data definition and data manipulation statements within a transaction supported? Are only data manipulation statements within a transaction supported? If table correlation names are supported, are they restricted to be different from the names of the tables? Are expressions in ORDER BY lists supported? Is the ODBC Extended SQL grammar supported? Are full nested outer joins supported? Is some form of GROUP BY clause supported? Can a GROUP BY clause add columns not in the SELECT provided it specifies all the columns in the SELECT?
Can a GROUP BY clause use columns not in the SELECT?
supportsCorrelatedSubqueries()
True
supportsDataDefinitionAndData ManipulationTransactions ()
True
supportsDataManipulationTransactions Only()
False
supportsDifferentTableCorrelationNam es()
True
supportsExpressionsInOrderBy()
True
supportsExtendedSQLGrammar()
True
supportsFullOuterJoins()
False
supportsGroupBy()
True
supportsGroupByBeyondSelect()
True
supportsGroupByUnrelated()
False
supportsIntegrityEnhancementFacility ()
Is the SQL Integrity Enhancement Facility supported? Is the escape character in LIKE clauses supported? A JDBC-compliant driver always returns true.
True
supportsLikeEscapeClause()
True
280
Return values for DatabaseMetaData Table 63: Return values for DatabaseMetaData methods Method
supportsLimitedOuterJoins()
(9 of 11) Returns
False
Description Is there limited support for outer joins? (This will be true if supportFullOuterJoins is true.) Is the ODBC Minimum SQL grammar supported? All JDBC-compliant drivers must return true. Does the database treat mixed-case, unquoted SQL identifiers as case sensitive and as a result store them in mixed case? A JDBC-compliant driver will always return false. Does the database treat mixed-case, quoted SQL identifiers as case sensitive and as a result store them in mixed case? A JDBC-compliant driver will always return true. Are multiple ResultSets from a single execute supported? Can multiple transactions be open at once (on different connections)? Can columns be defined as non-nullable? A JDBC-compliant driver always returns true. Can cursors remain open across commits? Can cursors remain open across rollbacks? Can statements remain open across commits? Can statements remain open across rollbacks? Can an ORDER BY clause use columns not in the SELECT? Is some form of outer join supported?
supportsMinimumSQLGrammar()
True
supportsMixedCaseIdentifiers()
False
supportsMixedCaseQuotedIdentifiers()
True
supportsMultipleResultSets()
False
supportsMultipleTransactions()
True
supportsNonNullableColumns()
True
supportsOpenCursorsAcrossCommit()
True
supportsOpenCursorsAcrossRollback()
True
supportsOpenStatementsAcrossCommit()
True
supportsOpenStatementsAcrossRollback () supportsOrderByUnrelated()
True
False
supportsOuterJoins()
True
281
Return values for DatabaseMetaData Table 63: Return values for DatabaseMetaData methods Method
supportsPositionedDelete()
Description Is positioned DELETE supported? Is positioned UPDATE supported? Can a schema name be used in a data manipulation statement? Can a schema name be used in an index definition statement? Can a schema name be used in a privilege definition statement? Can a schema name be used in a procedure call statement? Can a schema name be used in a table definition statement? Is SELECT for UPDATE supported? Are stored procedure calls using the stored procedure escape syntax supported? Are subqueries in comparison expressions supported? A JDBC-compliant driver always returns true. Are subqueries in EXISTS expressions supported? A JDBC-compliant driver always returns true. Are subqueries in IN statements supported? A JDBC-compliant driver always returns true. Are subqueries in quantified expressions supported? A JDBC-compliant driver always returns true.
supportsPositionedUpdate()
True
supportsSchemasInDataManipulation()
True
supportsSchemasInIndexDefinitions()
True
supportsSchemasInPrivilegeDefinition s()
True
supportsSchemasInProcedureCalls()
True
supportsSchemasInTableDefinitions()
True
supportsSelectForUpdate()
True
supportsStoredProcedures()
True
supportsSubqueriesInComparisons()
True
supportsSubqueriesInExists()
True
supportsSubqueriesInIns()
True
supportsSubqueriesInQuantifieds()
True
282
Return values for DatabaseMetaData Table 63: Return values for DatabaseMetaData methods Method
supportsTableCorrelationNames()
Description Are table correlation names supported? A JDBC-compliant driver always returns true. Does the database support the given transaction isolation level? Are transactions supported? If not, commit is a no-op and the isolation level is TRANSACTION_NONE. Is SQL UNION supported? Is SQL UNION ALL supported? Does the database use a file for each table? Does the database store tables in a local file?
supportsTransactionIsolationLevel(in t)
supportsTransactions ()
True
supportsUnion() supportsUnionAll()
True True
usesLocalFilePerTable()
False
usesLocalFiles()
False
Example
The following example is a code segment that illustrates calling methods of DatabaseMetadata:
Connection con = DriverManager.getConnection ( url, prop); . . . // Get the DatabaseMetaData object and display // some information about the connection DatabaseMetaData dma = con.getMetaData (); o.println("\nConnected to " + dma.getURL()); o.println("Driver " + dma.getDriverName()); o.println("Version " + dma.getDriverVersion());
283
284
Part III
ODBC Reference
OpenEdge SQL and ODBC Data Types SQLGetInfo ODBC Scalar Functions
This section contains Table 64, which shows how the OpenEdge SQL data types are mapped to the standard ODBC data types: Table 64: OpenEdge SQL and ODBC data types Progress data type
BINARY BIT CHAR DATE DECIMAL DOUBLE PRECISION FLOAT INTEGER REAL SMALLINT TIME TIMESTAMP TINYINT VARBINARY LVARBINARY VARCHAR SQL_BINARY SQL_BIT SQL_CHAR SQL_TYPE_DATE SQL_DECIMAL SQL_DOUBLE SQL_FLOAT SQL_INTEGER SQL_FLOAT SQL_SMALLINT SQL_TYPE_TIME SQL_TYPE_TIMESTAMP SQL_TINYINT SQL_VARBINARY SQL_LONGVARBINARY SQL_VARCHAR
288
SQLGetInfo
This section details the information the ODBC Driver returns to SQLGetInfo. Table 65 describes return values the ODBC driver returns to SQLGetInfo. Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_ACCESSIBLE_PROCEDURES N
(1 of 19)
Returns
SQL_ACCESSIBLE_TABLES
Maximum number of active connections Maximum number of active statements supported for an active connection Maximum number of active environments Support for ALTER DOMAIN statement
SQL_ACTIVE_CONNECTIONS
SQL_ACTIVE_STATEMENTS
100
SQL_ACTIVE_ENVIRONMENTS
SQL_ALTER_DOMAIN
0x00000000
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_ALTER_TABLE
(2 of 19)
Description Support for ALTER clauses SQL Conformance Support for datetime literals Level of asynchronous mode support Behavior with respect to the availability of row counts in batches Support for batches Support for bookmarks Position of qualifier in a qualified table name Support for catalog names Character used to separate table, column qualifiers Term for object that qualifies table names Statements that support qualifiers
Returns
0x00000000
TABLE
SQL_SQL_CONFORMANCE SQL_DATETIME_LITERALS
SQL_SC_SQL92_ENTRY 0x00000000
SQL_ASYNC_MODE
SQL_AM_NONE
SQL_BATCH_ROW_COUNT
0x00000000
SQL_BATCH_SUPPORT SQL_BOOKMARK_PERSISTENCE
SQL_CATALOG_LOCATION
SQL_CATALOG_NAME
SQL_CATALOG_NAME_SEPARATOR
SQL_CATALOG_TERM
database
SQL_CATALOG_USAGE
SQL_CU_DML_STATEMENTS
SQL_CU_PROCEDURE_ INVOCATION Default collation sequence name for the default character set Support for column aliases Result of concatenation of NULL character column with non-NULL column
SQL_COLLATION_SEQ
SQL_COLUMN_ALIAS
SQL_CONCAT_NULL_BEHAVIOR
SQL_CB_NULL = 0
290
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_CONVERT_BIGINT
(3 of 19)
Returns
SQL_CVT_CHAR SQL_CVT_BIGINT SQL_CVT_TINYINT SQL_CVT_SMALLINT SQL_CVT_INTEGER SQL_CVT_FLOAT SQL_CVT_DOUBLE 0x00000000
Conversion from
BINARY
SQL_CONVERT_BINARY
Conversion from
BIT
SQL_CONVERT_BIT
0x00000000
Conversion from
CHAR
SQL_CONVERT_CHAR
SQL_CVT_CHAR SQL_CVT_NUMERIC SQL_CVT_DECIMAL SQL_CVT_INTEGER SQL_CVT_SMALLINT SQL_CVT_FLOAT SQL_CVT_REAL SQL_CVT_DOUBLE SQL_CVT_VARCHAR SQL_CVT_TINYINT SQL_CVT_BIGINT SQL_CVT_DATE SQL_CVT_TIME SQL_CVT_TIMESTAMP SQL_CVT_CHAR SQL_CVT_VARCHAR SQL_CVT_DATE SQL_CVT_TIMESTAMP SQL_CVT_CHAR SQL_CVT_NUMERIC SQL_CVT_DECIMAL SQL_CVT_INTEGER SQL_CVT_SMALLINT SQL_CVT_FLOAT SQL_CVT_REAL SQL_CVT_DOUBLE SQL_CVT_VARCHAR SQL_CVT_TINYINT SQL_CVT_BIGINT SQL_CVT_CHAR SQL_CVT_NUMERIC SQL_CVT_DECIMAL SQL_CVT_INTEGER SQL_CVT_SMALLINT SQL_CVT_FLOAT SQL_CVT_REAL SQL_CVT_DOUBLE SQL_CVT_VARCHAR SQL_CVT_TINYINT SQL_CVT_BIGINT
Conversion from
DATE
SQL_CONVERT_DATE
Conversion from
DECIMAL
SQL_CONVERT_DECIMAL
Conversion from
DOUBLE
SQL_CONVERT_DOUBLE
291
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_CONVERT_FLOAT
(4 of 19)
Returns
SQL_CVT_CHAR SQL_CVT_NUMERIC SQL_CVT_DECIMAL SQL_CVT_INTEGER SQL_CVT_SMALLINT SQL_CVT_FLOAT SQL_CVT_REAL SQL_CVT_DOUBLE SQL_CVT_VARCHAR SQL_CVT_TINYINT SQL_CVT_BIGINT SQL_FN_CVT_CONVERT
SQL_CONVERT_FUNCTIONS
SQL_CONVERT_INTEGER
SQL_CVT_CHAR SQL_CVT_NUMERIC SQL_CVT_DECIMAL SQL_CVT_INTEGER SQL_CVT_SMALLINT SQL_CVT_FLOAT SQL_CVT_REAL SQL_CVT_DOUBLE SQL_CVT_VARCHAR SQL_CVT_TINYINT SQL_CVT_BIGINT 0x00000000
Conversion from
INTERVAL_DAY_ TIME
SQL_CONVERT_INTERVAL_ DAY_TIME
Conversion from
INTERVAL_YEAR_ MONTH
SQL_CONVERT_INTERVAL_ YEAR_MONTH
0x00000000
Conversion from
INTERVAL_DAY_ TIME
SQL_CONVERT_INTERVAL_DAY _TIME
0x00000000
Conversion from
LONGVARBINARY.
SQL_CONVERT_LONGVARBINARY
0x00000000
Conversion from
LONGVARCHAR
SQL_CONVERT_LONGVARCHAR
0x00000000
Conversion from
NUMERIC
SQL_CONVERT_NUMERIC
SQL_CVT_CHAR SQL_CVT_NUMERIC SQL_CVT_DECIMAL SQL_CVT_INTEGER SQL_CVT_SMALLINT SQL_CVT_FLOAT SQL_CVT_REAL SQL_CVT_DOUBLE SQL_CVT_VARCHAR SQL_CVT_TINYINT SQL_CVT_BIGINT
292
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_CONVERT_REAL
(5 of 19)
Returns
SQL_CVT_CHAR SQL_CVT_NUMERIC SQL_CVT_DECIMAL SQL_CVT_INTEGER SQL_CVT_SMALLINT SQL_CVT_FLOAT SQL_CVT_REAL SQL_CVT_DOUBLE SQL_CVT_VARCHAR SQL_CVT_TINYINT SQL_CVT_BIGINT SQL_CVT_CHAR SQL_CVT_NUMERIC SQL_CVT_DECIMAL SQL_CVT_INTEGER SQL_CVT_SMALLINT SQL_CVT_FLOAT SQL_CVT_REAL SQL_CVT_DOUBLE SQL_CVT_VARCHAR SQL_CVT_TINYINT SQL_CVT_BIGINT SQL_CVT_CHAR SQL_CVT_TIME SQL_CVT_TIMESTAMP SQL_CVT_CHAR SQL_CVT_VARCHAR SQL_CVT_DATE SQL_CVT_TIME SQL_CVT_TIMESTAMP SQL_CVT_CHAR SQL_CVT_NUMERIC SQL_CVT_DECIMAL SQL_CVT_INTEGER SQL_CVT_SMALLINT SQL_CVT_FLOAT SQL_CVT_REAL SQL_CVT_DOUBLE SQL_CVT_VARCHAR SQL_CVT_TINYINT SQL_CVT_BIGINT 0x00000000
Conversion from
SMALLINT
SQL_CONVERT_SMALLINT
Conversion from
TIME
SQL_CONVERT_TIME
Conversion from
TIMESTAMP
SQL_CONVERT_TIMESTAMP
Conversion from
TINYINT
SQL_CONVERT_TINYINT
Conversion from
VARBINARY
SQL_CONVERT_VARBINARY
Conversion from
VARCHAR
SQL_CONVERT_VARCHAR
SQL_CVT_CHAR SQL_CVT_NUMERIC SQL_CVT_DECIMAL SQL_CVT_INTEGER SQL_CVT_SMALLINT SQL_CVT_FLOAT SQL_CVT_REAL SQL_CVT_DOUBLE SQL_CVT_VARCHAR SQL_CVT_TINYINT SQL_CVT_BIGINT SQL_CVT_DATE SQL_CVT_TIME SQL_CVT_TIMESTAMP
293
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_CONVERT_WCHAR
(6 of 19)
Returns
0x00000000
Conversion from
WLONGVARCHAR
SQL_CONVERT_WLONGVARCHAR
0x00000000
Conversion from
WVARCHAR
SQL_CONVERT_WVARCHAR
0x00000000
SQL_CORRELATION_NAME
SQL_CN_DIFFERENT
SQL_CREATE_ASSERTION
0x00000000
statement Support for CREATE DOMAIN statement Support for CREATE SCHEMA statement Support for CREATE TABLE statement Support for CREATE
TRANSLATION SQL_CREATE_DOMAIN 0x00000000
SQL_CREATE_SCHEMA
0x00000000
SQL_CREATE_TABLE
SQL_CREATE_TRANSLATION
statement Support for CREATE VIEW statement Effect of COMMIT operation on cursors and prepared statements Effect of ROLLBACK operation on cursors and prepared statements Support for cursor sensitivity
SQL_CREATE_VIEW SQL_CV_CREATE_VIEW SQL_CV_CHECK_OPTION SQL_CB_PRESERVE
SQL_CURSOR_COMMIT_BEHAVIOR
SQL_CURSOR_ROLLBACK_BEHAVIOR
SQL_CB_PRESERVE
SQL_CURSOR_SENSITIVITY
SQL_INSENSITIVE
294
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_DATA_SOURCE_NAME
(7 of 19)
Description Name of the data source as specified to the ODBC Administrator Access limited to read-only Name of the Progress SQL-92 ODBC data source on the server system Name of the database product supporting the data source Version of the database product Default transaction isolation level Support for describing parameters via
DESCRIBE INPUT
Returns
(String containing the name)
SQL_DATA_SOURCE_READ_ONLY
N (Read-write access)
SQL_DATABASE_NAME
SQL_DBMS_NAME
OPENEDGE
SQL_DBMS_VER
10.1B
SQL_DEFAULT_TXN_ISOLATION
SQL_TXN_READ_COMMITTED
SQL_DESCRIBE_PARAMETER
Y (Supports)
statement Version of the driver manager Connection handle determined by the argument InfoType Drivers descriptor handle determined by the Driver Managers descriptor handle Environment handle determined by the argument
InfoType SQL_DM_VER 03.52.1117.0000
SQL_DRIVER_HDBC
0x017E4538
SQL_DRIVER_HDESC
0x017E68A8
SQL_DRIVER_HENV
0x017E4090
Handle library from the load library returned to the Driver Manager when it loaded the driver DLL
SQL_DRIVER_HLIB
0x28660000
295
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_DRIVER_HSTMT
(8 of 19)
Description Drivers statement handle determined by the Driver Managers statement handle Name of the dynamic link library file for the ODBC Driver
Returns
0x01828050
SQL_DRIVER_NAME
SQL_DRIVER_ODBC_VER
03.52
SQL_DRIVER_VER
SQL_DROP_ASSERTION
0x00000000
SQL_DROP_CHARACTER_SET
0x00000000
SQL_DROP_COLLATION
0x00000000
statement
DOMAIN
Support for DROP statement Support for DROP statement Support for DROP statement
SQL_DROP_DOMAIN
0x00000000
SQL_DROP_SCHEMA
0x00000000
SCHEMA
SQL_DROP_TABLE
SQL_DT_DROP_TABLE
TABLE
SQL_DROP_TRANSLATION
0x00000000
Support for DROP statement Supported attributes of a dynamic cursor: subset 1 Supported attributes of a dynamic cursor: subset 2
SQL_DROP_VIEW
SQL_DV_DROP_VIEW
SQL_DYNAMIC_CURSOR_ ATTRIBUTES1
0x00000000
SQL_DYNAMIC_CURSOR_ ATTRIBUTES2
0x00000000
296
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_EXPRESSIONS_IN_ORDERBY Y
(9 of 19)
Description Support for expressions in ORDER BY clause Supported fetch direction option.
Returns
SQL_FETCH_DIRECTION
Single-tier driver behavior Supported attributes of a forward-only cursor: subset 1 Supported attributes of a forward-only cursor: subset 2 Supported extensions to
SQLGetData
SQL_FILE_USAGE
SQL_FORWARD_ONLY_ CURSOR_ATTRIBUTES1
SQL_CA1_NEXT SQL_CA1_BULK_ADD
SQL_FORWARD_ONLY_ CURSOR_ATTRIBUTES2
SQL_CA2_MAX_ROWS_SELECT SQL_CA2_MAX_ROWS_CATALOG
SQL_GETDATA_EXTENSIONS
Relationship between GROUP BY clause and columns in the select list Case sensitivity of user-supplied names Character used to enclose delimited identifiers Keywords supported in the
CREATE INDEX
SQL_GROUP_BY
SQL_IDENTIFIER_CASE
SQL_IC_UPPER
SQL_IDENTIFIER_QUOTE_CHAR
SQL_INDEX_KEYWORDS
SQL_IK_ASC | SQL_IK_DESC
SQL_INTEGRITY
297
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_KEYSET_CURSOR_ ATTRIBUTES1
(10 of 19)
Returns
SQL_CA1_NEXT SQL_CA1_ABSOLUTE SQL_CA1_RELATIVE SQL_CA1_BOOKMARK SQL_CA1_LOCK_NO_CHANGE SQL_CA1_POS_POSITION SQL_CA1_POS_UPDATE SQL_CA1_POS_DELETE SQL_CA1_POS_REFRESH SQL_CA1_POSITIONED_UPDATE SQL_CA1_POSITIONED_DELETE SQL_CA1_SELECT_FOR_UPDATE SQL_CA1_BULK_ADD SQL_CA2_READ_ONLY_ CONCURRENCY SQL_CA2_OPT_VALUES_ CONCURRENCY SQL_CA2_SENSITIVITY _DELETIONS SQL_CA2_SENSITIVITY _UPDATES SQL_CA2_MAX_ROWS_SELECT SQL_CA2_CRC_EXACT SQL_CA2_SIMULATE _TRY_UNIQUE
SQL_KEYSET_CURSOR_ ATTRIBUTES2
Data source specific keywords Support for escape clause in LIKE predicates Support for lock types Maximum number of active concurrent statements in asynchronous mode Maximum length in hexadecimal characters of binary literals Maximum length of a table or column qualifier
SQL_KEYWORDS
See the OpenEdge SQL Reserved Words section for a list of SQL Keywords.
Y
SQL_LIKE_ESCAPE_CLAUSE
SQL_LOCK_TYPES
SQL_LCK_NO_CHANGE
SQL_MAX_ASYNC_CONCURRENT _STATEMENTS
SQL_MAX_BINARY_LITERAL_LEN
31,983
SQL_MAX_CATALOG_NAME_LEN
32
298
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_MAX_CHAR_LITERAL_LEN 31,983
(11 of 19)
Description Maximum length in characters of character string literals Maximum length of a column name Maximum number of columns allowed in GROUP BY clause Maximum number of columns allowed in an index Maximum number of columns allowed in ORDER BY clause Maximum number of columns allowed in a SELECT list Maximum number of columns allowed in a table Maximum number of active SQL statements Maximum length of a cursor name Maximum number of active connections Maximum length of user-defined names Maximum number of bytes allowed in the combined fields of an index Maximum length of a procedure name Maximum length in bytes of a table row Whether maximum row size includes LONGVARCHAR and
LONGVARBINARY
Returns
SQL_MAX_COLUMN_NAME_LEN
32
SQL_MAX_COLUMNS_IN_GROUP_BY
5000
SQL_MAX_COLUMNS_IN_INDEX
16
SQL_MAX_COLUMNS_IN_ORDER_BY
SQL_MAX_COLUMNS_IN_SELECT
5000
SQL_MAX_COLUMNS_IN_TABLE
5000
SQL_MAX_CONCURRENT _ACTIVITIES
100
SQL_MAX_CURSOR_NAME_LEN
18
SQL_MAX_DRIVER_CONNECTIONS
SQL_MAX_IDENTIFIER_LEN
32
SQL_MAX_INDEX_SIZE
115
SQL_MAX_PROCEDURE_NAME_LEN
32
SQL_MAX_ROW_SIZE
31995
SQL_MAX_ROW_SIZE_INCLUDES _LONG
299
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_MAX_SCHEMA_NAME_LEN 32
(12 of 19)
Description Maximum length of an owner name Maximum number of characters in an SQL statement Maximum length of a table name Maximum number of tables allowed in FROM clause Maximum length of a user name Maximum length of owner name Maximum length of a qualifier name Support for multiple result sets Support for active transactions on multiple connections Whether data source requires length of LONGVARCHAR and
LONGVARBINARY
Returns
SQL_MAX_STATEMENT_LEN
131,000
SQL_MAX_TABLE_NAME_LEN
32
SQL_MAX_TABLES_IN_SELECT
250
SQL_MAX_USER_NAME_LEN
32
SQL_MAX_OWNER_NAME_LEN
32
SQL_MAX_QUALIFIER_NAME_LEN
32
SQL_MULT_RESULT_SETS
SQL_MULTIPLE_ACTIVE_TXN
SQL_NEED_LONG_DATA_LEN
data Support for NOT NULL clause in CREATE TABLE statement Where NULL values are sorted in a list
SQL_NULL_COLLATION SQL_NC_HIGH SQL_NON_NULLABLE_COLUMNS SQL_NNC_NON_NULL
300
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_NUMERIC_FUNCTIONS
(13 of 19)
Returns
SQL_FN_NUM_ABS SQL_FN_NUM_ACOS SQL_FN_NUM_ASIN SQL_FN_NUM_ATAN SQL_FN_NUM_ATAN2 SQL_FN_NUM_CEILING SQL_FN_NUM_COS SQL_FN_NUM_EXP SQL_FN_NUM_FLOOR SQL_FN_NUM_MOD SQL_FN_NUM_PI SQL_FN_NUM_POWER SQL_FN_NUM_RADIANS SQL_FN_NUM_RAND SQL_FN_NUM_ROUND SQL_FN_NUM_SIGN SQL_FN_NUM_SIN SQL_FN_NUM_SQRT SQL_FN_NUM_TAN SQL_FN_NUM_DEGREES SQL_FN_NUM_LOG10 SQL_OAC_LEVEL1
Level of ODBC conformance Level of ODBC 3.x interface conformance SQL Access Group (SAG) conformance Level of SQL conformance Referential integrity syntax support ODBC version supported by driver manager Types of outer joins supported
SQL_ODBC_API_CONFORMANCE
SQL_ODBC_INTERFACE _CONFORMANCE
SQL_OIC_CORE
SQL_ODBC_SAG_CLI_CONFORMANCE
SQL_OSCC_COMPLIANT
SQL_ODBC_SQL_CONFORMANCE
SQL_OSC_EXTENDED
SQL_ODBC_SQL_OPT_IEF
SQL_ODBC_VER
03.52.0000
SQL_OJ_CAPABILITIES
Whether columns in ORDER BY clause must also be in select list Support for outer joins Name for an owner
SQL_ORDER_BY_COLUMNS _IN_SELECT
SQL_OUTER_JOINS
SQL_OWNER_TERM
owner
301
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_OWNER_USAGE
(14 of 19)
Returns
SQL_OU_DML_STATEMENTS SQL_OU_PROCEDURE _INVOCATION SQL_OU_TABLE_DEFINITION SQL_OU_INDEX_DEFINITION SQL_OU_PRIVILEGE _DEFINITION
Characteristics of row counts available in a parameterized execution Characteristics of result sets available in a parameterized execution Supported operations in
SQLSetPos
SQL_PARAM_ARRAY_ROW_COUNTS
SQL_PARC_NO_BATCH
SQL_PARAM_ARRAY_SELECTS
SQL_PAS_NO_SELECT
SQL_POS_OPERATIONS
Supported positioned SQL statements Term for procedures SQL procedures support Support for qualifiers
SQL_POSITIONED_STATEMENTS
SQL_PROCEDURE_TERM
SQL_PROCEDURES
SQL_QUALIFIER_USAGE
Case sensitivity of quoted user-supplied names Separator character used between qualifier name and element Term used for a qualifier
SQL_QUOTED_IDENTIFIER_CASE
SQL_IC_MIXED
SQL_QUALIFIER_NAME_SEPARATOR
SQL_QUALIFIER_TERM
database
302
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_QUALIFIER_LOCATION
(15 of 19)
Description Position of the qualifier in a qualified table name Detect changes to any row in mixed-cursor operations Term for entity that has owner privileges on objects Statements that support use of owner qualifiers
Returns
SQL_CL_START
SQL_ROW_UPDATES
SQL_SCHEMA_TERM
owner
SQL_SCHEMA_USAGE
Options supported for scrollable cursors Support for scrollable cursors Character to permit wildcard characters in search strings Name of the system where the ODBC data source resides Special characters allowed in user-supplied names Datetime scalar functions supported Behavior of DELETE statement that refers to a foreign key.
SQL_SCROLL_OPTIONS
SQL_SCROLL_CONCURRENCY
SQL_SEARCH_PATTERN_ESCAPE
(Backslash)
SQL_SERVER_NAME
SQL_SPECIAL_CHARACTERS
_, %
SQL_SQL92_DATETIME_FUNCTIONS
0x00000000
SQL_SQL92_FOREIGN_KEY_DELETE _RULE
0x00000000
303
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_SQL92_FOREIGN_KEY _UPDATE_RULE
(16 of 19)
Returns
0x00000000
SQL_SQL92_GRANT
SQL_SG_DELETE_TABLE SQL_SG_INSERT_TABLE SQL_SG_INSERT_COLUMN SQL_SG_REFERENCES_TABLE SQL_SG_REFERENCES_COLUMN SQL_SG_SELECT_TABLE SQL_SG_UPDATE_TABLE SQL_SG_UPDATE_COLUMN SQL_SNVF_CHAR_LENGTH SQL_SNVF_CHARACTER _LENGTH
SQL_SQL92_NUMERIC_ VALUE_FUNCTIONS
Predicates supported
SQL_SQL92_PREDICATES
SQL_SR_GRANT_OPTION_FOR SQL_SR_CASCADE SQL_SR_RESTRICT SQL_SR_DELETE_TABLE SQL_SR_INSERT_TABLE SQL_SR_INSERT_COLUMN SQL_SR_REFERENCES_TABLE SQL_SR_REFERENCES_COLUMN SQL_SR_SELECT_TABLE SQL_SR_UPDATE_TABLE SQL_SR_UPDATE_COLUMN 0x00000000
SQL_SQL92_ROW_VALUE _CONSTRUCTOR
SQL_SQL92_STRING_FUNCTIONS
SQL_SSF_CONVERT SQL_SSF_LOWER SQL_SSF_UPPER SQL_SSF_SUBSTRING SQL_SSF_TRANSLATE SQL_SSF_TRIM_LEADING SQL_SSF_TRIM_TRAILING SQL_SVE_COALESCE SQL_SVE_NULLIF SQL_SCC_XOPEN_CLI _VERSION1
SQL_SQL92_VALUE_EXPRESSIONS
SQL_STANDARD_CLI_CONFORMANCE
304
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_STATIC_CURSOR _ATTRIBUTES1
(17 of 19)
Returns
SQL_CA1_NEXT SQL_CA1_ABSOLUTE SQL_CA1_RELATIVE SQL_CA1_BOOKMARK SQL_CA1_LOCK_NO_CHANGE SQL_CA1_POS_POSITION SQL_CA1_POS_UPDATE SQL_CA1_POS_DELETE SQL_CA1_POS_REFRESH SQL_CA1_POSITIONED_UPDATE SQL_CA1_POSITIONED_DELETE SQL_CA1_SELECT_FOR_UPDATE SQL_CA1_BULK_ADD SQL_CA2_READ_ONLY _CONCURRENCY SQL_CA2_OPT_VALUES _CONCURRENCY SQL_CA2_SENSITIVITY _UPDATES SQL_CA2_MAX_ROWS_SELECT SQL_CA2_CRC_EXACT SQL_CA2_SIMULATE _TRY_UNIQUE
SQL_STATIC_CURSOR _ATTRIBUTES2
Support for detection of changes made to a static or key-set driven cursor through SQLSetPos String functions supported
SQL_STATIC_SENSITIVITY
0x00000000
SQL_STRING_FUNCTIONS
SQL_FN_STR_CONCAT SQL_FN_STR_INSERT SQL_FN_STR_LEFT SQL_FN_STR_LTRIM SQL_FN_STR_LENGTH SQL_FN_STR_LOCATE SQL_FN_STR_LCASE SQL_FN_STR_REPEAT SQL_FN_STR_REPLACE SQL_FN_STR_RIGHT SQL_FN_STR_RTRIM SQL_FN_STR_SUBSTRING SQL_FN_STR_UCASE SQL_FN_STR_ASCII SQL_FN_STR_CHAR SQL_FN_STR_DIFFERENCE SQL_FN_STR_LOCATE_2 SQL_FN_STR_SPACE SQL_FN_STR_CHAR_LENGTH SQL_FN_STR_CHARACTER _LENGTH
305
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_SUBQUERIES
(18 of 19)
Returns
SQL_SQ_COMPARISON SQL_SQ_EXISTS SQL_SQ_IN SQL_SQ_QUANTIFIED SQL_SQ_CORRELATED _SUBQUERIES SQL_FN_SYS_USERNAME
System functions supported Term for tables Timestamp intervals supported for TIMESTAMPADD function Timestamp intervals supported for TIMESTAMPDIFF function Date-time functions supported
SQL_SYSTEM_FUNCTIONS
SQL_TABLE_TERM SQL_TIMEDATE_ADD_INTERVALS
table 0x00000000
SQL_TIMEDATE_DIFF_INTERVALS
0x00000000
SQL_TIMEDATE_FUNCTIONS
SQL_FN_TD_NOW SQL_FN_CURDATE SQL_FN_TD_DAYOFMONTH SQL_FN_TD_DAYOFWEEK SQL_FN_TD_DAYOFYEAR SQL_FN_TD_MONTH SQL_FN_TD_QUARTER SQL_FN_TD_WEEK SQL_FN_TD_YEAR SQL_FN_CURTIME SQL_FN_TD_HOUR SQL_FN_TD_MINUTE SQL_FN_TD_SECOND SQL_FN_TD_TIMESTAMP_ADD SQL_FN_TD_TIMESTAMPDIFF SQL_FN_TD_DAYNAME SQL_FN_TD_MONTHNAME SQL_TC_ALL
Support for DML, DDL within transactions Options for setting transaction isolation levels
UNION
SQL_TXN_CAPABLE
SQL_TXN_ISOLATION_OPTION
support
SQL_UNION
306
SQLGetInfo Table 65: Information the ODBC driver returns to SQLGetInfo fInfoType argument
SQL_USER_NAME
(19 of 19)
Description Name of user connected to the data source Year of publication of the X/Open specification with which the driver complies
SQL_XOPEN_CLI_YEAR
1995
307
SQLGetInfo
308
This section lists scalar functions that ODBC supports and are available to use in OpenEdge SQL statements, as described in the following sections: Scalar functions System functions
Scalar functions
Table 67, Table 68, and Table 69 list the scalar functions that ODBC supports. You can use these functions in SQL statements using the following syntax: Syntax
{fn scalar-function}
scalar-function
String functions
Table 66 lists the string functions that ODBC supports. The string functions listed can take the following arguments:
string_exp can be the name of a column, a string literal, or the result of another scalar function, where the underlying data type is SQL_CHAR or SQL_VARCHAR.
value, where the underlying data type is SQL_TINYINT, SQL_SMALLINT, or SQL_INTEGER. The string functions are one-based; that is, the first character in the string is character 1. Character string literals must be surrounded in single quotation marks. Table 66: Scalar string functions String function
ASCII(string_exp)
(1 of 2) Returns
ASCII code value of the leftmost character of string_exp as an integer. The length in bits of the string expression. The character with the ASCII code value specified by code. code should be between 0 and 255; otherwise, the return value is data-source dependent. The length in characters of the string expression, if the string expression is of a character data type; otherwise, the length in bytes of the string expression (the smallest integer not less than the number of bits divided by 8). (This function is the same as the CHARACTER_LENGTH function.) The length in characters of the string expression, if the string expression is of a character data type; otherwise, the length in bytes of the string expression (the smallest integer not less than the number of bits divided by 8). (This function is the same as the CHAR_LENGTH function.) The string resulting from concatenating string_exp2 and string_exp1. The string is system dependent. An integer value that indicates the difference between the values returned by the SOUNDEX function for string_exp2 and string_exp1. A string where length characters have been deleted from string_exp1 beginning at start and where string_exp2 has been inserted into string_exp, beginning at start. Uppercase characters in string_exp converted to lowercase. The count of characters of string_exp. The number of characters in string_exp.
CONCAT(string_exp1,string_exp)
LCASE(string_exp)
310
ODBC Scalar Functions Table 66: Scalar string functions String function
LOCATE(string_exp1, string_exp2
(2 of 2) Returns
[,start,])
The starting position of the first occurrence of string_exp1 within string_exp2. If start is not specified the search begins with the first character position in string_exp2. If start is specified, the search begins with the character position indicated by the value of start. The first character position in string_exp2 is indicated by the value 1. If string_exp1 is not found, 0 is returned. The characters of string_exp, with leading blanks removed. The length in bytes of the string expression. The result is the smallest integer not less than the number of bits divided by 8. The position of the first character expression in the second character expression. The result is an exact numeric with an implementation-defined precision and a scale of 0. A string composed of string_exp repeated count times. Replaces all occurrences of string_exp2 in string_exp1 with string_exp3. The rightmost count of characters in string_exp. The characters of string_exp with trailing blanks removed. A string consisting of count spaces. A string derived from string_exp beginning at the character position start for length characters. Lowercase characters in string_exp converted to uppercase.
LTRIM(string_exp)
POSITION(character_exp IN character_exp)
REPEAT(string_exp, count)
RTRIM(string_exp)
UCASE(string_exp)
Numeric functions
Table 67 lists the numeric functions that ODBC supports. The numeric functions listed can take the following arguments: can be a column name, a numeric literal, or the result of another scalar function, where the underlying data type is SQL_NUMERIC, SQL_DECIMAL, SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER, SQL_FLOAT, SQL_REAL, or SQL_DOUBLE.
numeric_exp float_exp can be a column name, a numeric literal, or the result of another scalar function, where the underlying data type is SQL_FLOAT.
311
ODBC Scalar Functions can be a column name, a numeric literal, or the result of another scalar function, where the underlying data type is SQL_TINYINT, SQL_SMALLINT, or SQL_INTEGER.
integer_exp
Table 67:
(1 of 2)
ABS(numeric_exp) ACOS(float_exp)
Arccosine of float_exp as an angle in radians. Arcsine of float_exp as an angle in radians. Arctangent of float_exp as an angle in radians. Arctangent of the x and y coordinates, specified by float_exp1 and float_exp2 as an angle in radians. Smallest integer greater than or equal to numeric_exp. Cosine of float_exp as an angle in radians. Cotangent of float_exp as an angle in radians. Number of degrees converted from numeric_exp radians. Exponential value of float_exp. Largest integer less than or equal to numeric_exp. Natural log of float_exp. Base 10 log of float_exp. Remainder of integer_exp1 divided by
integer_exp2.
ASIN(float_exp) ATAN(float_exp)
ATAN2(float_exp1, float_exp2)
CEILING(numeric_exp)
COS(float_exp) COT(float_exp)
DEGREES(numeric_exp)
EXP(float_exp) FLOOR(numeric_exp)
PI()
Constant value of pi as a floating-point number. Value of numeric_exp to the power of integer_exp. Number of radians converted from numeric_exp degrees. Random floating-point value using integer_exp as the optional seed value.
numeric_exp rounded to integer_exp places right of the decimal (left of the decimal if integer_exp is negative).
POWER(numeric_exp, integer_exp)
RADIANS(numeric_exp)
RAND([ integer_exp
])
ROUND(numeric_exp, integer_exp)
312
ODBC Scalar Functions Table 67: Scalar numeric functions Numeric function
SIGN(numeric_exp)
(2 of 2) Returns Indicator of the sign of numeric_exp. If numeric_exp <0, -1 is returned. If numeric_exp = 0, 0 is returned. If numeric_exp > 0, 1 is returned. Sine of float_exp, where float_exp is an angle in radians. Square root of float_exp. Tangent of float_exp, where float_exp is an angle in radians.
numeric_exp truncated to integer_exp places right of the decimal. (If integer_exp is negative, truncation is to the left of the decimal.)
SIN(float_exp)
SQRT(float_exp) TAN(float_exp)
TRUNCATE(numeric_exp, integer_exp)
can be a column name; a time, date, or timestamp literal; or the result of another scalar function, where the underlying data type can be represented as SQL_CHAR, SQL_VARCHAR, SQL_TIME, SQL_DATE, or SQL_TIMESTAMP.
timestamp_exp
Table 68:
Date and time functions supported by ODBC Function Returns Current date.
(1 of 3)
Current local time. The time-precision argument determines the seconds precision of the returned value. Current local date and local time as a timestamp value. The timestamp-precision argument determines the seconds precision of the returned timestamp.
[(timestamp-precision)]
313
ODBC Scalar Functions Table 68: Date and time functions supported by ODBC Function
CURDATE() CURTIME() DAYNAME(date_exp)
(2 of 3)
Returns Current date as a date value. Current local time as a time value. Character string containing a date source-specific name of the day for the day portion of date_exp. Day of the month in date_exp as an integer value (131). Day of the week in date_exp as an integer value (17). Day of the year in date_exp as an integer value (1366). Hour in time_exp as an integer value (023). Minute in time_exp as an integer value (059). Month in date_exp as an integer value (1366). Character string containing the data source-specific name of the month. Current date and time as a timestamp value. Quarter in date_exp as an integer value (14). Second in date_exp as an integer value (059). Timestamp calculated by adding integer_exp intervals of type interval to time_exp. interval can be:
SQL_TSI_FRAC_SECOND SQL_TSI_SECOND SQL_TSI_MINUTE SQL_TSI_HOUR SQL_TSI_DAY SQL_TSI_WEEK SQL_TSI_MONTH SQL_TSI_QUARTER SQL_TSI_YEAR
DAYOFMONTH(date_exp)
DAYOFWEEK(date_exp)
DAYOFYEAR(date_exp)
HOUR(time_exp) MINUTE(time_exp)
MONTH(date_exp)
MONTHNAME(date_exp)
NOW() QUARTER(date_exp)
SECOND(time_exp)
314
ODBC Scalar Functions Table 68: Date and time functions supported by ODBC Function
TIMESTAMPDIFF(interval, time_exp1, time_exp2)
(3 of 3)
Returns Integer number of intervals of type interval by which time_exp2 is greater than time_exp1. interval has the same values as TIMESTAMPADD. Fractional seconds are expressed in billionths of a second. Week of the year in date_exp as an integer value (1-53). Year in date_exp. The range is data source dependent.
WEEK(date_exp)
YEAR(date_exp)
System functions
Table 69 lists the scalar system functions that ODBC supports. Table 69: Scalar system functions supported by ODBC System function
DATABASE()
if exp is null
The row identifier of the current row in a table Authorization name of the user
USER()
315
316
Part IV
ESQL Reference
Embedded SQL
Embedded SQL
In OpenEdge Release 10, the ESQL interface is being deprecated. It is provided to help OpenEdge customers transition to the use of other interfaces. For the long term, you should use ODBC or JDBC to access SQL data. These newer interfaces offer better performance and access by many development and reporting tools, as described in the following sections: ESQL elements and statements Compliance with industry standards
host_lang_type variable_name
A conventional C Language variable declaration. This form of variable declaration conforms to the ANSI standard for the C Language. Syntax
{
Example
char
short
long
float
double
EXEC SQL BEGIN DECLARE SECTION ; short InvTransNum_v ; short Qty_v ; short OrderNum_v ; EXEC SQL END DECLARE SECTION ;
Notes
The C Language type int is not supported by ESQL. Type int maps to 16 or 32 bits, depending on the machine architecture. This can create rounding errors at run time, as values are passed across different machine architectures. Variables you declare in a BEGIN-END DECLARE SECTION can be used in C Language statements as if they are declared outside the DECLARE SECTION. The scope of variables follows host language scoping rules. The ESQL variables are not visible outside the file in which they are declared.
DECLARE sections are permissible only where host language declarations are permissible in the host language syntax. This restriction is due to how DECLARE SECTION blocks are translated into the main body of host language declarations.
Avoid DECLARE sections in header files that are included by more than one source file. This can cause duplicate variables with the same name. The form of the variable created by ESQL for each type is specified so that it can be manipulated from host language statements. Declaring variables allows you to use the variables in both host language and embedded SQL statements.
320
ESQL elements and statements Authorization None Related statements Static Array Types
CLOSE
Closing a cursor changes the state of the cursor from open to closed. Syntax
EXEC SQL CLOSE cursor_name ; cursor_name
An identifier named earlier in a DECLARE CURSOR statement and an OPEN CURSOR statement. Example
EXEC SQL CLOSE dyncur ; EXEC SQL COMMIT WORK ;
Notes
Only a cursor in the open state can be set to the closed state. When a transaction ends, any cursors in the open state are automatically set to the closed state. When a cursor is in the closed state, you cannot perform FETCH, DELETE, or UPDATE operations using that cursor. It is good practice to close cursors explicitly.
Authorization None Related statements DELETE, OPEN, FETCH, positioned UPDATE, positioned DELETE
CONNECT
Establishes a connection to a database. Optionally, the CONNECT statement can also specify a name for the connection and a username and password for authentication.
321
[ [ [
] ]
connect_string
Syntax
{
Note
DEFAULT
db_name
db_type:T:host_name:port_num:db_name
Arguments to CONNECT must be either string literals enclosed in quotation marks or character-string host variables.
connect_string
Specifies to which database to connect. If the CONNECT statement specifies DEFAULT, SQL tries to connect to the environment-defined database, if any. The value of the DB_NAME environment variable specifies the default connect string. The connect_string can be a simple database name or a complete connect_string. A complete connect string has the components shown in the following table:
Connect string
db_type
Description Type of database. The only currently supported database type is progress T directs the SQL engine to use the TCP/IP protocol Name of the system where the database resides Port number to use for the connection Name of the database
host_name
port_num
db_name
connection_name
The name of the connection as either a character literal or host variable. If the CONNECT statement omits a connection name, the default is the name of the database. Connection names must be unique.
username
User name for authentication of the connection. SQL verifies the user name against a corresponding password before it connects to the database. The value of the DH_USER environment variable specifies the default user name. If DH_USER is not set, the value of the USER environment variable specifies the default user name.
322
Password for authentication of the connection. SQL verifies the password against a corresponding user name before it connects to the database. The value of the DH_PASSWD environment variable determines the default password. Notes Arguments to CONNECT must be either string literals enclosed in quotation marks or character string host variables. An application can connect to more than one database at a time, with a maximum of 10 connections. However, the application can actually gain access to only one database at a time. The database name specified in the CONNECT statement becomes the active one. If an application executes a SQL statement before connecting to a database, an attempt is made to connect to the environment-defined database, if any. If the connection is successful, the SQL statement is executed on that database.
Examples
The first statement shown connects to the salesdb database on the local system. The second statement connects to the custdb database on the local system. The last statement connects to the environment-defined database by default.
DECLARE CURSOR
Associates a cursor with a static query or a prepared dynamic query statement. The query or the prepared statement can have references to host variables. Syntax
DECLARE cursor_name CURSOR FOR
{ }
query_expression
ORDER BY clause
] [
|
;
prepared_statement_name
cursor_name
A name you assign to the cursor. The name must meet the requirements for an identifier. 323
ORDER BY clause
] [FOR
UPDATE clause
The name assigned to a prepared SQL statement in an earlier PREPARE statement. Examples
EXEC SQL WHENEVER SQLERROR GOTO selerr ; EXEC SQL DECLARE stcur CURSOR FOR SELECT InvTransNum, Qty, OrderNum FROM PUB.InventoryTrans ; EXEC SQL OPEN stcur ; EXEC SQL WHENEVER NOT FOUND GOTO seldone ;
WHENEVER SQLERROR GOTO selerr ; PREPARE stmtid from :sel_stmt_v ; DECLARE dyncur CURSOR FOR stmtid ; OPEN dyncur ; WHENEVER NOT FOUND GOTO seldone ;
Notes
You must declare a cursor before any OPEN, FETCH, or CLOSE statement. The scope of the cursor declaration is the entire source file in which it is declared. The operations on the cursor, such as OPEN, CLOSE, and FETCH statements, can occur only within the same compilation unit as the cursor declaration. The use of a cursor allows the execution of the positioned forms of the UPDATE and DELETE statements. If the DECLARE statement corresponds to a static SQL statement with parameter references: The DECLARE statement must be executed before each execution of an OPEN statement for the same cursor. The DECLARE statement and the OPEN statement that follows must occur within the same transaction within the same task. If the statement contains parameter references to automatic variables or function arguments, the DECLARE statement and the following OPEN statement for the same cursor must occur within the same C function.
324
DESCRIBE
Writes information about a prepared statement to the SQL Descriptor Area (SQLDA). You use a DESCRIBE statement in a series of steps that allows a program to accept SQL statements at run time. Dynamically generated statements are not part of a program's source code; they are generated at run time. There are two forms of the DESCRIBE statement: The DESCRIBE BIND VARIABLES statement writes information about input variables in an expression to an SQLDA. These variables can be substitution variable names or parameter markers. The DESCRIBE SELECT LIST statement writes information about select list items in a prepared SELECT statement to an SQLDA.
Syntax
DESCRIBE [ BIND VARIABLES INTO input_sqlda_name ;
SELECT LIST
FOR statement_name
The SQLDA is a host language data structure used in dynamic SQL processing. DESCRIBE statements write information about the number, data types, and sizes of input variables or select list items to SQLDA structures. Program logic then processes that information to allocate storage. OPEN, EXECUTE, and FETCH statements read the SQLDA structures for the addresses of the allocated storage.
The name of an input SQL statement to be processed using dynamic SQL steps. Typically, this is the same statement_name used in the PREPARE statement.
input_sqlda_name
The name of the SQLDA structure to which DESCRIBE will write information about input variables. Input variables represent values supplied to INSERT and UPDATE statements at run time, and to predicates in DELETE, UPDATE, and SELECT statements at run time. To utilize the DESCRIBE BIND VARIABLES statement in your application, issue statements in the following order: 1. PREPARE 2. DESCRIBE BIND VARIABLES 3. EXECUTE or OPEN CURSOR
325
ESQL elements and statements The DESCRIBE BIND VARIABLES statement writes the number of input variables to the sqld_nvars field of the SQLDA. If the sqld_size field of the SQLDA is not equal to or greater than this number, DESCRIBE writes the value as a negative number to sqld_nvars. Design your application to check sqld_nvars for a negative number to determine if a particular SQLDA is large enough to process the current input statement. Input variables in dynamic SQL statements are identified by parameter markers or as substitution names. Authorization None Related statements PREPARE, DECLARE CURSOR, OPEN, FETCH, CLOSE
The name of a SELECT statement to be processed using dynamic SQL steps. Typically, this is the same statement_name as in the PREPARE statement.
output_sqlda_name
The name of the SQLDA structure to which DESCRIBE will write information about select list items. Note Select list items are column names and expressions in a SELECT statement. A FETCH statement writes the values returned by a SELECT statement to the addresses stored in an output SQLDA. To utilize the DESCRIBE SELECT LIST statement in your application, issue statements in the following order: 1. DECLARE CURSOR 2. PREPARE 3. OPEN 4. DESCRIBE SELECT LIST 5. FETCH
326
ESQL elements and statements A DESCRIBE SELECT LIST statement writes the number of select list items to the sqld_nvars field of an output SQLDA. If the sqld_size field of the SQLDA is not equal to or greater than this number, DESCRIBE writes the value as a negative number to sqld_nvars. Design your application to check sqld_nvars for a negative number to determine if a particular output SQLDA is large enough to process the current SELECT statement. Authorization None Related statements PREPARE, DECLARE CURSOR, OPEN, FETCH, CLOSE
DISCONNECT
Terminates the connection between an application and the database to which it is connected. Syntax
DISCONNECT
'connection_name'
CURRENT
ALL
DEFAULT
connection_name
Disconnects the connection to the default database. Examples This example illustrates CONNECT TO AS connection_name and DISCONNECT connection_name:
EXEC SQL CONNECT TO 'progress:T:localhost:6745:salesdb' AS 'conn_1' ; /* ** C Language and embedded SQL application processing against the ** database in the connect_string */ . . . EXEC SQL DISCONNECT 'conn_1' ;
327
EXEC SQL CONNECT TO DEFAULT ; /* ** C Language and embedded SQL application processing against the ** database in the connect_string */ . . . EXEC SQL DISCONNECT DEFAULT ;
After you issue DISCONNECT ALL there is no current connection. The following example disconnects all database connections:
The following example illustrates the CONNECT, SET CONNECTION, and DISCONNECT statements in combination using these steps: 1. CONNECT TO connect_string AS connection_name, which establishes a connect_string connection to the database in the connect_string; the connection has the name 'conn_1'. 2. CONNECT TO DEFAULT, which establishes a connection to the DEFAULT database and sets this connection current. 3. DISCONNECT DEFAULT, which disconnects the connection to the DEFAULT database. 4. SET CONNECTION connection_name, which sets the 'conn_1' connection current. 5. DISCONNECT CURRENT, which disconnects the 'conn_1' connection.
328
/* ** 1. CONNECT TO 'connect_string' */ EXEC SQL CONNECT TO 'progress:T:localhost:6745:salesdb' AS 'conn_1' ; /* ** 2. CONNECT TO DEFAULT. This suspends the conn_1 connection ** and sets the DEFAULT connection current */ EXEC SQL CONNECT TO DEFAULT ; /* ** Application processing against the DEFAULT database */ . . . /* ** 3. DISCONNECT DEFAULT */ EXEC SQL DISCONNECT DEFAULT ; /* ** 4. Set the first connection, conn_1, current */ EXEC SQL SET CONNECTION conn_1 ; /* ** Application processing against the database in the connect_string */ . . . /* ** 5. DISCONNECT the conn_1 connection, which is the current connection. */ EXEC SQL DISCONNECT CURRENT ;
Notes
When you specify DISCONNECT connection_name or DISCONNECT CURRENT and there is also an established connection to the DEFAULT database, the connection to the DEFAULT database becomes the current connection. If there is no DEFAULT database, there is no current connection after the SQL engine processes the DISCONNECT. The DISCONNECT DEFAULT statement terminates the connection to the DEFAULT database. If this connection is the current connection, there is no current connection after this DISCONNECT statement is executed.
329
Syntax
EXEC SQL sql_statement ; sql_statement
An SQL statement to be processed by the ESQL precompiler. You must terminate each SQL statement with a semicolon to mark the end of the statement. Example
EXEC EXEC EXEC EXEC EXEC SQL SQL SQL SQL SQL WHENEVER SQLERROR GOTO selerr ; PREPARE stmtid from :sel_stmt_v ; DECLARE dyncur CURSOR FOR stmtid ; OPEN dyncur ; WHENEVER NOT FOUND GOTO seldone ;
Note
In general, the ESQL precompiler does not parse host language statements and therefore does not detect any syntax or semantic errors in host language statements. The exceptions to this rule are: Recognition of host language blocks. The precompiler recognizes host language blocks in order to determine the scope of variables and types. Constants defined with the #define preprocessor command. To evaluate these constants, the ESQL precompiler invokes the C language preprocessor before beginning embedded SQL processing.
Authorization None
EXECUTE
Executes the statement specified in statement_name. Syntax
EXECUTE statement_name
[ ]
USING
:ind_variable
... }
330
Notes
A statement must be processed with a PREPARE statement before it can be processed with an EXECUTE statement. A prepared statement can be executed multiple times in the same transaction. Typically each call to the EXECUTE statement supplies a different set of host variables. If there is no DESCRIPTOR in the USING clause, the EXECUTE statement is restricted to the number of variables specified in the host variable list. The number and type of the variables must be known at compile time. The host variables must be declared in the DECLARE SECTION before they can be used in the USING clause of the EXECUTE statement. If there is a DESCRIPTOR in the USING clause, the program can allocate space for the input host variables at run time.
EXECUTE IMMEDIATE
Executes the statement specified in a statement_string or host_variable. Syntax
EXECUTE IMMEDIATE
statement_string
host_variable
statement_name
Name of an SQL descriptor area (SQLDA). Notes The character string form of the statement is referred to as a statement string. An EXECUTE IMMEDIATE statement accepts either a statement string or a host variable as input. 331
ESQL elements and statements A statement string must not contain host variable references or parameter markers. A statement string must not begin with EXEC SQL delimiter and must not end with a semicolon. When an EXECUTE IMMEDIATE statement is executed, the SQL engine parses the statement and checks it for errors. Any error in the execution of the statement is reported in the SQLCA. If the same SQL statement is to be executed multiple times, it is more efficient to use and EXECUTE statements, rather than an EXECUTE IMMEDIATE statement.
PREPARE
FETCH
Moves the position of the cursor to the next row of the active set and fetches the column values of the current row into the specified host variables. Syntax
FETCH cursor_name
{ }
|
;
INTO :host_var_ref
[ [
INDICATOR
:ind_var_ref
...
cursor_name
A name identified in an earlier DECLARE CURSOR statement and an OPEN CURSOR statement.
USING SQL DESCRIPTOR structure_name
Directs the SQL engine to FETCH data into storage addressed by an SQLDA structure.
INTO :host_var_ref
[ [
INDICATOR
:ind_var_ref
Directs the SQL engine to FETCH data into the identified host variables, and to set values in the identified indicator variables.
332
Notes
A FETCH operation requires that the cursor be open. The positioning of the cursor for each FETCH operation is as follows: The first time you execute a FETCH statement after opening the cursor, the cursor is positioned to the first row of the active set. Subsequent FETCH operations advance the cursor position in the active set. The next row becomes the current row. When the current row is deleted using a positioned DELETE statement, the cursor is positioned before the row after the deleted row in the active set.
The cursor can only be moved forward in the active set by executing FETCH statements. To move the cursor to the beginning of the active set, you must CLOSE the cursor and OPEN it again. If the cursor is positioned on the last row of the active set or if the active set does not contain any rows, executing a FETCH will return the status code SQL_NOT_FOUND in the SQLDA. After a successful FETCH, the total row count fetched so far for this cursor is returned in sqlca.sqlerrd[2]. The count is set to zero after an OPEN cursor operation. You can FETCH multiple rows in one FETCH operation by using array variables in the INTO clause. The SQL_NOT_FOUND status code is returned in the SQLCA when the end of the active set is reached, even if the current FETCH statement returns one or more rows. If you use array variables in a FETCH statement, the array sizes are set to the number of rows fetched after the FETCH statement is executed.
Authorization None
333
ESQL elements and statements Related statements DECLARE CURSOR, OPEN, CLOSE
GET DIAGNOSTICS
Retrieves information about the execution of the previous SQL statement from the SQL diagnostics area. The diagnostics area is a data structure that contains information about the execution status of the most recent SQL statement. Specifically, GET DIAGNOSTICS extracts information about the SQL statement as a whole from the SQL diagnostics areas header component. Note: Syntax
GET DIAGNOSTICS :param = header_info_item
, :param = header_info_item
...
:param
A host-language variable to receive the information returned by the GET DIAGNOSTICS statement. The host-language program must declare a param compatible with the SQL data type of the information item.
header_info_item
One of the following keywords, which returns associated information about the diagnostics area or the SQL statement: Syntax
NUMBER NUMBER
MORE
COMMAND_FUNCTION
DYNAMIC_FUNCTION
ROW_COUNT
The number of detail areas in the diagnostics area. Currently, NUMBER is always 1. NUMBER is type NUMERIC with a scale of 0.
MORE
A one-character string with a value of Y (all conditions are detailed in the diagnostics area) or N (all conditions are not detailed) that tells whether the diagnostics area contains information on all the conditions resulting from the statement.
COMMAND_FUNCTION
Contains the character-string code for the statement (as specified in the SQL standard), if the statements is a static SQL statement. If the statement is a dynamic statement, contains the character string EXECUTE or EXECUTE IMMEDIATE.
334
Contains the character-string code for the statement (as specified in the SQL standard). For dynamic SQL statements only (as indicated by EXECUTE or EXECUTE IMMEDIATE in the COMMAND_FUNCTION item).
ROW_COUNT
The number of rows affected by the SQL statement. Example The GET DIAGNOSTICS example extracts header information about the last SQL statement executed. The information is assigned to host variables that are defined in the DECLARE SECTION of an embedded SQL program, as shown in the following example:
The GET DIAGNOSTICS statement itself does not affect the contents of the diagnostics area. This means applications can issue multiple GET DIAGNOSTICS statements to retrieve different items of information about the same SQL statement. Related statements GET DIAGNOSTICS EXCEPTION, WHENEVER
[,
:param = detail_info_item
...
EXCEPTION number
Specifies that GET DIAGNOSTICS EXCEPTION extracts detail information. number specifies which of multiple detail areas GET DIAGNOSTICS extracts. Currently, number must be the integer 1.
335
Receives the information returned by the GET DIAGNOSTICS EXCEPTION statement. The host-language program must declare a param compatible with the SQL data type of the information item.
detail_info_item
One of the following keywords, which returns associated information about the particular error condition: Syntax
CONDITION_NUMBER
| | | | | | | | | | | | | | | |
RETURNED_SQLSTATE CLASS_ORIGIN SUBCLASS_ORIGIN ENVIRONMENT_NAME CONNECTION_NAME CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME CATALOG_NAME SCHEMA_NAME TABLE_NAME COLUMN_NAME CURSOR_NAME MESSAGE_TEXT MESSAGE_LENGTH MESSAGE_OCTET_LENGTH
CONDITION_NUMBER
The sequence of this detail area in the diagnostics area. Currently, CONDITION_NUMBER is always 1.
RETURNED_SQLSTATE
The general type of error. For example, connection exception or data exception.
SUBCLASS_ORIGIN
The name of the affected columns, if the error condition involves a column.
CURSOR_NAME
Not currently supported. Example The GET DIAGNOSTICS EXCEPTION example extracts detailed information into host variables that are defined in the DECLARE SECTION of an embedded SQL program:
Note
The GET DIAGNOSTICS statement itself does not affect the contents of the diagnostics area. This means applications can issue multiple GET DIAGNOSTICS statements to retrieve different items of information about the same SQL statement. Related statements GET DIAGNOSTICS, WHENEVER
337
OPEN
Executes a prepared SQL query associated with a cursor and creates a result set composed of the rows that satisfy the query. This set of rows is called the active set. Syntax
OPEN cursor_name
USING
{ [
SQL
DESCRIPTOR structure_name
:host_variable
[ [
INDICATOR
:ind_variable
... }
cursor_name
SQL
DESCRIPTOR structure_name
Directs the SQL engine to create the result set in storage addressed by the identified SQLDA structure.
USING :host_variable
[ [
INDICATOR
:ind_variable
Directs the SQL engine to create the result set in storage addressed by host variables. Example
/* ** ** ** ** ** ** ** ** ** ** ** ** */ 5. 6. Name WHENEVER routine to handle SQLERROR. DECLARE cursor for the SELECT statement. NOTE: You must set input parameter values before OPEN CURSOR. The static query in this program does not have input parameters. OPEN the cursor. NOTE: For static statements, if a DECLARE CURSOR statement contains references to automatic variables, the OPEN CURSOR statement must be in the same C function. Name WHENEVER routine to handle NOT FOUND condition.
7.
8.
EXEC SQL WHENEVER SQLERROR GOTO selerr ; EXEC SQL DECLARE stcur CURSOR FOR SELECT InvTransNum, Qty, OrderNum FROM PUB.InventoryTrans ; EXEC SQL OPEN stcur ; EXEC SQL WHENEVER NOT FOUND GOTO seldone ;
Notes
Executing an OPEN cursor statement sets the cursor to the open state. After the OPEN cursor statement is executed, the cursor is positioned just before the first row of the active set. For a single execution of an OPEN cursor statement, the active set does not change and the host variables are not re-examined. If you elect to retrieve a new active set and a host variable value has changed, you must CLOSE the cursor and OPEN it again.
338
ESQL elements and statements Execution of a COMMIT statement or ROLLBACK statement implicitly closes the cursors that have been opened in the current transaction. It is good practice to CLOSE cursors explicitly. When a cursor is in the open state, executing an OPEN statement on that cursor results in an error. If a DECLARE cursor statement is associated with a static SQL statement containing parameter markers, the following requirements apply: You must execute the DECLARE statement before executing the OPEN statement for that cursor. The DECLARE cursor statement and the OPEN statement for the same cursor must occur in the same transaction. If the statement contains parameter markers for stack variables, the DECLARE cursor statement and the following OPEN statement for the same cursor must occur in the same C Language function.
Authorization Must have DBA privilege of SELECT privilege on all the tables and views referenced in the SELECT statement associated with the cursor. Related statements DECLARE CURSOR, CLOSE, FETCH, positioned UPDATE, positioned DELETE
PREPARE
Parses and assigns a name to an ad hoc or dynamically generated SQL statement for execution. You use a PREPARE statement in a series of steps that allows a program to accept or generate SQL statements at run time. Syntax
PREPARE statement_name FROM statement_string ; statement_name
A name for the dynamically generated statement. DESCRIBE, EXECUTE, and DECLARE CURSOR statements refer to this statement_name. A statement_name must be unique in a program.
statement_string
Specifies the SQL statement to be prepared for dynamic execution. You can use either the name of a C Language string variable containing the SQL statement, or you can specify the SQL statement as a quoted literal. If there is an SQL syntax error, the PREPARE statement returns an error in the SQLCA.
339
{
Examples
:host_variable
quoted_literal
The first example is a code fragment from the DynUpd function in sample program 3DynUpd.pc, which illustrates dynamic processing of an UPDATE statement:
/* ** Process a dynamic non-SELECT input statement ** PREPARE the statement ** EXECUTE the prepared statement ** COMMIT WORK */ EXEC SQL PREPARE dynstmt FROM :sql_stmt_v ; EXEC SQL EXECUTE dynstmt ; EXEC SQL COMMIT WORK ;
This example is a code fragment from the DynSel function in sample program 4DynSel.pc, which illustrates dynamic processing of a SELECT statement:
PREPARE a the dynamic SELECT statement. DECLARE cursor for the prepared SELECT statement. NOTE: You must set input parameter values before OPEN CURSOR. If your query has input parameters, you must define them in the DECLARE SECTION. OPEN the declared cursor. NOTE: For static statements, if a DECLARE CURSOR statement contains references to automatic variables, the OPEN CURSOR statement must be in the same C function. Name WHENEVER routine for NOT FOUND condition. FETCH a row and print results until no more rows.
PREPARE stmtid from :sel_stmt_v ; DECLARE dyncur CURSOR FOR stmtid ; OPEN dyncur ; WHENEVER NOT FOUND GOTO seldone ;
Notes
A statement string can have one or more references to input variables. These variables represent values supplied at run time to:
INSERT
A program supplies an input variable to a PREPARE statement either as a substitution name or as a parameter marker. For example: A substitution name is a name preceded by a colon ( : ) in a statement string. This name does not refer to a C Language variable, but acts only as a placeholder for input variables. A parameter marker is a question mark ( ? ) in the statement string, serving as a placeholder for input variables.
340
ESQL elements and statements The USING clauses of EXECUTE and OPEN statements identify host language storage. The values in this storage expand a statement string, replacing a substitution name or a parameter marker. You can design your program to execute the same prepared statement many times in a transaction, supplying different values for input variables for each execution. If you COMMIT or ROLLBACK the transaction, you must PREPARE the statement string again.
Authorization Must have DBA privileges or authorization for the SQL statement being used. Related statements EXECUTE, OPEN, CLOSE, FETCH
SET CONNECTION
Switches the application from one established connection to another. This resumes the connection associated with the specified connection_name, restoring the context of that database connection to the same state it was in when suspended. Syntax
SET CONNECTION
'connection_name'
DEFAULT
connection_name
The name of the connection as either a character literal or host variable. If the SET statement omits a connection name, the default is the name of the database. Connection names must be unique.
CONNECTION DEFAULT
Sets the DEFAULT connection as the current connection. Examples The first example shows how to establish a database as the current database:
The SET CONNECTION command sets the database associated with the connection named conn_1 to the status of current database. The connection named conn_1 must be associated with an established connection. Use SET CONNECTION DEFAULT to set current the database associated with the DEFAULT connection. In this example, the statement suspends the conn_1 connection, which had been current:
CONNECTION,
See also the last example for the DISCONNECT statement, which illustrates the CONNECT, SET and DISCONNECT statements in combination. 341
ESQL elements and statements Authorization None Related statements CONNECT, DISCONNECT
WHENEVER
Specifies actions for three SQL run-time exceptions. Syntax
WHENEVER
{ {
SQLERROR
SQLWARNING
CONTINUE
| { |
GOTO
GO TO
} }
host_lang_label
NOT FOUND
SQLERROR
SQLWARNING
The NOT FOUND exception is set when sqlca.sqlcode is set to SQL_NOT_FOUND. The SQLERROR exception is set when sqlca.sqlcode is set to a negative value. The SQLWARNING exception is set when sqlca.sqlwarn[ 0 ] is set to W after a statement is executed.
STOP
CONTINUE
GOTO
GO TO
host_lang_label
The STOP exception results in the ESQL program stopping execution. The CONTINUE exception results in the ESQL program continuing execution. The default exception is to CONTINUE.
GOTO | GO host_lang_label results in the ESQL program execution to branch to the statement corresponding to the host_lang_label.
Examples
/* ** Name WHENEVER routine to handle SQLERROR condition. */ EXEC SQL WHENEVER SQLERROR GOTO mainerr ;
/* ** */
EXEC SQL WHENEVER SQLERROR GOTO nodyn ; EXEC SQL WHENEVER NOT FOUND GOTO nodyn ;
Notes
You can place multiple WHENEVER statements for the same exception in a source file. Each WHENEVER statement overrides the previous WHENEVER statement specified for the same exception.
342
ESQL elements and statements in Backus Naur Form (BNF) Correct operation of a WHENEVER statement with a GOTO host_language_label or a is subject to the scoping rules of the C Language. The host_language_label must be within the scope of all SQL statements for which the action is active. The GO TO or GOTO action is active starting from the corresponding WHENEVER statement until another WHENEVER statement for the same exception, or until end of the file.
GO TO host_language_label
ESQL elements and statements in Backus Naur Form (BNF) BEGIN-END DECLARE SECTION
Syntax
begin declare section ::= EXEC SQL BEGIN DECLARE SECTION host_lang_type variable_name ; . . . END DECLARE SECTION ::= EXEC SQL END DECLARE SECTION
char
| | | | }
CLOSE
Syntax
close ::= EXEC SQL CLOSE cursor_name ;
343
CONNECT
Syntax
connect statement ::= CONNECT TO connect_string
[ [ [
] ]
CONNECT STRING
Syntax
connect_string ::=
DEFAULT
db_name
db_type:T:host_name:port_num:db_name
DECLARE CURSOR
Syntax
declare cursor ::= EXEC SQL DECLARE cursor_name CURSOR FOR
{ | }
query_expr ;
ORDER BY clause
][
prepared_statement_name
DISCONNECT
Syntax
disconnect statement ::= DISCONNECT
connection_name
CURRENT
ALL
DEFAULT
344
EXEC SQL
Syntax
EXEC SQL ::= EXEC SQL sql_statement ;
EXECUTE
Syntax
EXECUTE ::= EXEC SQL EXECUTE statement_name
[ ]
USING
{ [
SQL
DESCRIPTOR structure_name
|
;
:host_variable
[ [
INDICATOR
:ind_variable
... }
EXECUTE IMMEDIATE
Syntax
EXECUTE IMMEDIATE ::= EXEC SQL EXECUTE IMMEDIATE
statement_string
host_variable
FETCH
Syntax
fetch ::= EXEC SQL FETCH cursor_name
{ }
|
;
INTO :host_var_ref
[ [
INDICATOR
:ind_var_ref
...
GET DIAGNOSTICS
Syntax
get diagnostics statement ::= GET DIAGNOSTICS :param = header_info_item
, :param = header_info_item
] ,...
345
NUMBER
| | | | }
[,
:param = detail_info_item
...
CONDITION_NUMBER
| | | | | | | | | | | | | | | | }
RETURNED_SQLSTATE CLASS_ORIGIN SUBCLASS_ORIGIN ENVIRONMENT_NAME CONNECTION_NAME CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME CATALOG_NAME SCHEMA_NAME TABLE_NAME COLUMN_NAME CURSOR_NAME MESSAGE_TEXT MESSAGE_LENGTH MESSAGE_OCTET_LENGTH
346
OPEN
Syntax
open ::= EXEC SQL OPEN cursor_name
[ ]
USING
{ [
SQL
DESCRIPTOR structure_name
|
;
:host_variable
[ [
INDICATOR
:ind_variable
... }
PREPARE
Syntax
prepare ::= EXEC SQL PREPARE statement_name FROM statement_string ;
SET CONNECTION
Syntax
set connection statement ::= SET CONNECTION
connection_name
DEFAULT
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
WHENEVER
Syntax
whenever ::= EXEC SQL WHENEVER
{ {
SQLERROR
SQLWARNING
CONTINUE
| {
GOTO
GO TO
} }
host_lang_label
Compliance with industry standards Table 70: Compliance of SQL DDL and DML statements ODBC SQL grammar
SQL
BEGIN-END DECLARE SECTION
Progress extension
Notes Compliant if C language types used Embedded SQL only Embedded SQL onl. Embedded SQL only Embedded SQL only Embedded SQL only Embedded SQL only Embedded SQL only Embedded SQL only Embedded SQL only Embedded SQL only Embedded SQL only Embedded SQL only
CLOSE
Extended
prepared_stmt_name
DECLARE CURSOR
DESCRIBE
EXEC SQL
EXECUTE
GET DIAGNOSTICS
OPEN
PREPARE
348
Index
A
ABS function 74 ACOS function 74 ADD_MONTHS 75 ADD_MONTHS function 75 Aggregate functions 73 ALTER DATABASE SET PRO_ENABLE_64BIT_SEQUENCES Y statement 2 ALTER DATABASE SET PRO_ENABLE_LARGE_KEYS Y statement 1 ALTER SEQUENCE statement 2 ALTER TABLE statement 4 ALTER USER statement 6 Approximate numeric data types 197 ARRAY data types PRO_ELEMENT function 115 support 188 ASCII function 76 ASIN function 76 ATAN function 77 ATAN2 function 78 AUDIT INSERT statement 7 Backus Naur Form data types 215 DDL syntax 221 DML statements 222 ESQL elements and statements 343 expressions 215, 217 literals 218 query expressions 219 search conditions 221 SQL elements and statements 215 Basic predicates 208 query expressions in 208 BEGIN-END DECLARE SECTION 320 BETWEEN predicate 209 Bit string data types 199 AUDIT SET statement 8 AVG function 79
C
CALL statement 9, 12 CASE function 80 CAST function 82 CHAR function 84 Character data types 195 Character-string literals 204
Index CHR function 84 Clauses COLUMN_LIST 46 FOR UPDATE 56 FROM 50 GROUP BY 52 HAVING 54 ORDER BY 54 WHERE 52 WITH 55 CLOSE statement 321 COALESCE function 85 Column constraints 9 COLUMN_LIST clause 46 Commit statement 12 CONCAT function 85 Concatenation operator 196 CONNECT statement 321 Conventional identifiers 190 CONVERT function (ODBC Compatible) 86 CONVERT function (Progress Extension) 87 COS function 87 DECODE function 94 COUNT function 88 DEGREES function 94 CREATE INDEX statement 12, 13 Delimited identifiers 190 CREATE PROCEDURE statement 15 CREATE SEQUENCE statement 17 CREATE SYNONYM statement 19 CREATE TABLE statement 20 CREATE TRIGGER statement 24 CREATE USER statement 27 CREATE VIEW statement 28 CURDATE function 89 CURTIME function 89 DESCRIBE BIND VARIABLES statement 325 DESCRIBE SELECT LIST statement 326 DESCRIBE statement 325 DhSQLException 246 DhSQLException.getDiagnostics 246 DhSQLResultSet 247 DhSQLResultSet.insert 248 DhSQLResultSet.makeNULL 249
D
Data types ABL 187 approximate numeric 197 character 195 date-time 198 definition 195 exact numeric 197 OpenEdge SQL 187 DATABASE function 89 DatabaseMetaData 272 Date arithmetic expressions 212 Date formats 192 Date-time data types 198 Date-time formats 191 Date-time literals 204 DAYNAME function 91 DAYOFMONTH function 91 DAYOFWEEK function 92 DAYOFYEAR function 93 DB_NAME function 93 DECLARE CURSOR statement 323
Index2
Index DhSQLResultSet.set 250 DISCONNECT CATALOG statement 30 DISCONNECT statement 327 DROP INDEX statement 31 DROP PROCEDURE statement 32 DROP SYNONYM Statement 32 DROP SYNONYM statement 33 DROP TABLE statement 33 DROP TRIGGER statement 34 DROP USER statement 35 DROP VIEW statement 35 number 191 time 194 FROM clause 50
G
GET DIAGNOSTICS EXCEPTION statement 335 GET DIAGNOSTICS statement 334 GRANT statement 36 GREATEST function 96 GROUP BY clause 52
H
HAVING clause 54 HOUR function 96
E
Embedded SQL 319 Error Codes messages 144 SQLSTATE values 144 Escape clause in LIKE predicate 209 ESQL compliance with industry standards 347 statements 319 Exact numeric data types 197 EXEC SQL delimiter 330
I
Identifiers conventional 189 delimited 189 IFNULL function 97 IN predicate 210 query expressions in 210 Industry standards 231 INITCAP function 97
EXECUTE IMMEDIATE statement 331 INSERT function 98 EXECUTE statement 330 INSERT statement 39 EXISTS predicate 210 INSTR function 99 EXPfunction 95 Expressions date arithmetic 212 numeric arithmetic 211 Internationalization specific elements LIKE predicate 210
F
FETCH statement 332 FLOOR function 95 FOR UPDATE clause 56 Formats date 192 date-time 191
J
Java Class Reference close 244 err 246 execute 244 fetch 244 found 245 getDiagnostics 245 getValue 245 insert 245 Index3
Index makeNULL 244 open 244 rowCount 244 set 245 setParam 243 wasNULL 245 JDBC conformance datatype conversion 271 SQL-92 270 supported data types 269 MONTHS_BETWEEN function 108
N
NEXT_DAY function 109 NOW function 110 NULL predicate 209 NULLIF function 111 Number formats 191 Numeric arithmetic expressions 211 Numeric literals 203, 211 NVL function 111
L
Language elements 189 LAST_DAY function 100 LCASE function 100 LEAST function 101 LEFT function 101 LENGTH function 102 LIKE predicate 209 Literals character-string 204 date-time 204 numeric 203 time 205 timestamp 207 Literals syntax in BNF 218
O
ODBC data types and OpenEdge 287 date and time functions 313 numeric functions 311 Scalar functions 309 SQLGetInfo 289 string functions 309 system functions 315 OPEN statement 338 OpenEdge SQL reserved words 139 OpenEdge SQL system limits 161
LOCATE function 102 LOCK TABLE statement 40 LOG10 function 103 LOWER function 103 LPAD function 104 LTRIM function 105 Operators relational in quantified predicates 208 ORDER BY clause 54 OUTER JOIN predicate 211
P
PI function 112 POWER function 112 Predicates basic 208 BETWEEN 209 EXISTS 210 IN 210 LIKE 209 NULL 209 OUTER JOIN 211 quantified 208 PREFIX function 113
M
MAX function 105 MIN function 106 MINUTE function 106 MOD function 107 MONTH 107 MONTH function 107 MONTHNAME function 108 Index4
Index PREPARE statement 339 PRO_ARR_ESCAPE 115 PRO_ELEMENT function 115 SET PRO_SERVER LOG statement 60 SET SCHEMA statement 61 SET TRANSACTION ISOLATION LEVEL Statement 62 SHOW CATALOGS statement 63 SIGN function 124 SIN function 124 SQLCursor 251 SQLCursor.close 252 SQLCursor.fetch 252 SQLCursor.found 253 SQLCursor.getParam 254
Q
Quantified predicates 208 query expressions in 208 QUARTER function 116 Query Expressions in basic predicates 208 in IN predicate 210 in quantified predicates 208 Query Expressions syntax in BNF 219
R
RADIANS function 117 RAND function 117 Relational operators 207 in quantified predicates 208 REPEAT function 118 REPLACE function 118 Reserved words 139 REVOKE statement 42 RIGHT function 119 ROLLBACK statement 44 ROUND function 120 ROWID function 121 RPAD function 122 RTRIM function 123
SQLCursor.getValue 255 SQLCursor.makeNULL 256 SQLCursor.open 257 SQLCursor.registerOutParam 258 SQLCursor.rowCount 258 SQLCursor.setParam 259 SQLCursor.wasNULL 260 SQLGetInfo 289 SQLIStatement 261 SQLIStatement.execute 261 SQLIStatement.makeNULL 262 SQLIStatement.rowCount 263 SQLIStatement.setParam 264 SQLPStatement 265 SQLPStatement.execute 265 SQLPStatement.makeNULL 266 SQLPStatement.rowCount 267 SQLPStatement.setParam 268 SQLSTATE values 144 SQRT function 125 SUBSTR function 125 SUBSTRING function (ODBC Compatible) 127
S
Search conditions syntax in BNF 221 SECOND function 123 SELECT statement 45 SET CATALOG statement 56 SET CONNECTION statement 341 SET PRO_CONNECT LOG statement 57, 58, 59
Index5
Index SUFFIX function 128 SUM function 129 SYS_CHK_CONSTRS system table 184 SYS_CHKCOL_USAGE system table 183 SYS_KEYCOL_USAGE system table 184 SYS_REF_CONSTRS system table 184 SYS_TBL_CONSTRS system table 185 SYSCALCTABLE system table 167 SYSCOLAUTH system table 168 SYSCOLSTAT system table 169 SYSCOLUMNS core system table 166 SYSCOLUMNS_FULL system table 169 SYSDATATYPES system table 170 SYSDATE function 130 SYSDATESTAT system table 171 SYSDBAUTH system table 171 SYSFLOATSTAT system table 172 SYSIDXSTAT system table 172 SYSINDEXES core systemtable 167 SYSINTSTAT system table 173 SYSNCHARSTAT system table 168 SYSNUMSTAT system table 173 SYSNVARCHARSTAT system table 182 SYSPROCBIN system table 174 SYSPROCCOLUMNS system table 174 SYSPROCEDURES system table 175 SYSPROCTEXT system table 175 SYSREALSTAT system table 175 SYSSEQAUTH system table 176 SYSSEQUENCES system table 176 SYSSYNONYMS system table 177 SYSTABAUTH system table 177 SYSTABLES core system table 165 SYSTABLES_FULL system table 178 UCASE function 135 UPDATE statement 68 UPDATE STATISTICS statement 69 UPPER function 136 USER function 136 Index6 SYSTBLSTAT system table 179 System Catalog Tables descriptions 164 overview 163 System limits 161 System tables and descriptions 164 SYSTIME function 130 SYSTIMESTAMP function 130 SYSTIMESTAT system table 180 SYSTINYINTSTAT system table 180 SYSTRIGCOLS system table 181 SYSTRIGGER system table 181 SYSTSSTAT system table 182 SYSTSTZSTAT 182 SYSTSTZSTAT system table 182 SYSVIEWS system table 183
T
TAN function 131 Time formats 194 Time literals 205 Timestamp literals 207 TO_CHAR function 132 TO_DATE function 132 TO_NUMBER function 133 TO_TIME function 133 TO_TIMESTAMP function 134 TOP clause 49 TRANSLATE function 134
Index
W
WEEK function 137 WHENEVER statement 342
WITH clause 55
Y
YEAR function 137
WHERE clause 52
Index7
Index
Index8