Before a single SQL statement can execute, a client application that submits this statement must somehow establish connection with RDBMS. The connection can be established through a variety of mechanisms — ranging from proprietary call-level interface to the buzz-of-the-day like Java Database Connectivity and .NET Providers.
While not being in the domain of SQL proper, application programming interface concepts should be understood by anyone serious enough to go to the trouble of learning RDBMS and their native SQL.
The call-level interface (CLI) standard was created by the subcommittee of the SQL Access Group (SAG). SAG was formed in 1989 with its declared purpose "to define and promote standards for database interoperability." The group included Oracle, Informix, and Hewlett-Packard, among others. The list keeps growing and now includes virtually every sizable company exploring the database field.
At about the same time, Microsoft, Lotus, Sybase, and DEC joined the effort in creating the SQL Connectivity specification, which later made its way into SAG base specification.
The CLI standard was published as a work in progress in 1992, and that same year Microsoft shipped the first commercial implementation of the standard CLI specification — Open DataBase Connectivity for Windows version 1.0. In this release, the original specification was extended and divided into three compatibility layers, the core of which corresponded directly to the SAG CLI standard.
In 1994, after several transformations, the original SAG CLI specification (amended and expanded) was dubbed X/Open Preliminary Specification. Microsoft released ODBC for Windows version 2.0 the same year. That year also marks the release of the ODBC Software Development Kit (SDK) for non-Windows platforms by Visigenic Software, under an exclusive source-code license.
In 1993 ODBC was accepted as a base document for the SQL/CLI by the ISO/ANSI SQL committees. In 1995 it was completed as ISO/IEC document 9075-3:1995 Information Technology–Database Languages–SQL–Part 3: Call-Level Interface (SQL/CLI). Later it was expanded to include SQL99 standard extensions. The standard was commercialized as Microsoft ODBC 3.0 in 1996.
In the SQL/CLI standard terminology we are speaking about binding styles — e.g., embedded SQL, module language, and direct invocation — which represent traditional binding mechanisms.
Embedded SQL, discussed in more detail in Chapter 15, received its name because SQL statements were directly embedded into the host language program. Before an application that contained Embedded SQL can be compiled and executed, it had to go through a precompiling process, using a vendor-supplied precompiler.
Module Language refers to the compiled modules stored on the server, utilizing C, PL/1, Cobol, or Java, as well as vendor-proprietary languages like Oracle's PL/SQL or Microsoft/Sybase Transact-SQL.
Direct Invocation defined a set SQL statements that can be executed directly in RDBMS, using some specific vendor-defined mechanism.
The absence of the common standard hindered development of portable applications and reuse of the code, when almost the entire application had to be rewritten to accommodate peculiarities of the RDBMS access and handling of returned data.
The CLI/SQL standard allows for relative independence from a proprietary database interface, through encapsulation of all vendor-specific details into a number of uniform functions. Table 16-1 provides a list of SQL/CLI functions (over 50), as defined by the standard.
SQL/CLI Function |
Conforms to the Standard |
Description |
---|---|---|
Allocating and De-allocating Resources |
||
SQLAllocHandle() |
SQL/CLI |
Allocates environment, connection, statement, or descriptor handle. |
SQLAllocEnv() |
SQL/CLI |
Allocates environment resources, returns handle. |
SQLAllocConnect() |
SQL/CLI |
Allocates connection resources, returns handle. |
SQLAllocStmt() |
SQL/CLI |
Allocates statement resources, returns handle. |
SQLFreeHandle() |
SQL/CLI |
Releases allocated environment, connection, etc., by handle. |
SQLFreeEnv() |
SQL/CLI |
Releases allocated environment resources. |
SQLFreeConnect() |
SQL/CLI |
Releases allocated connection resources. |
SQLFreeStmt() |
SQL/CLI |
Stops statement processing and frees all the resources associated with its handle. |
Opening and Closing Database Connections |
||
SQLConnect() |
SQL/CLI |
Connects to a specific driver. |
SQLDisconnect() |
SQL/CLI |
Terminates database connection established with SQLConnect. |
SQLDriverConnect() |
ODBC |
Connects to a specific driver; if connection parameters are omitted, displays Driver Manager dialog box. |
SQLBrowseConnect() |
ODBC |
Returns hierarchy of connection attributes. |
SQL Statement Execution |
||
SQLExecDirect() |
SQL/CLI |
Executes an SQL statement (without preparation). |
SQLPrepare() |
SQL/CLI |
Prepares an SQL statement for execution. |
SQLExecute() |
SQL/CLI |
Executes a prepared SQL statement. |
SQLCancel() |
SQL/CLI |
Cancels SQL statement execution. |
SQLBindParameter() |
ODBC |
Allocates storage for parameters in SQL statements. |
SQLParamData() |
SQL/CLI |
Supplies parameters value at runtime. |
SQL/CLI Function |
Conforms to the Standard |
Description |
SQLDescribeParam() |
ODBC |
Describes a specific parameter in the statement. |
SQLNumParams() |
SQL/CLI |
Returns a number of parameters for a statement. |
SQLNativeSql() |
ODBC |
Returns text of an SQL statement, as it is translated by the ODBC driver. |
SQLCloseCursor() |
SQL/CLI |
Closes opened cursor (by handle). |
SQLSetCursorName() |
SQL/CLI |
Defines cursor name. |
SQLGetCursorName() |
SQL/CLI |
Retrieves cursor name. |
SQLSetScrollOptions() |
ODBC |
Sets scroll options for a cursor. |
SQLPutData() |
SQL/CLI |
Sends part or all of the data for a parameter. |
Attributes Management |
||
SQLSetConnectAttr() |
SQL/CLI |
Sets connection attribute. |
SQLGetConnectAttr() |
SQL/CLI |
Retrieves value of the connection attribute. |
SQLSetEnvAttr() |
SQL/CLI |
Sets environment attribute. |
SQLGetEnvAttr() |
SQL/CLI |
Retrieves value of the environment attribute. |
SQLSetStmtAttr() |
SQL/CLI |
Sets statement attribute. |
SQLGetStmtAttr() |
SQL/CLI |
Retrieves value of the statement attribute. |
Setting and Retrieving Descriptor Fields |
||
SQLGetDescField() |
SQL/CLI |
Returns the value of a single descriptor field. |
SQLGetDescRec() |
SQL/CLI |
Returns the value of multiple descriptor fields. |
SQLSetDescField() |
SQL/CLI |
Sets the value of a single descriptor field. |
SQLSetDescRec() |
SQL/CLI |
Sets the value of multiple descriptor fields. |
Query Results Retrieval |
||
SQLRowCount() |
SQL/CLI |
Returns the number of rows affected by SQL statement. |
SQLDescribeCol() |
SQL/CLI |
Describes a column in a resultset. |
SQLColAttribute() |
SQL/CLI |
Describes the attributes of a column in a resultset. |
SQLBindCol() |
SQL/CLI |
Assigns storage of a specific data type for a return value. |
SQLFetch() |
SQL/CLI |
Returns a resultset. |
SQLFetchScroll() |
SQL/CLI |
Returns scrollable resultset. |
SQLGetData() |
SQL/CLI |
Returns part or whole of a column's value for single row in the resultset. |
SQLSetPos() |
ODBC |
Positions cursor at specific location within a fetched resultset. |
SQL/CLI Function |
Conforms to the Standard |
Description |
SQLBulkOperations() |
ODBC |
Performs bulk operations. |
SQLMoreResults() |
ODBC |
Returns additional resultsets, if they exist. |
SQLGetDiagField() |
SQL/CLI |
Returns additional diagnostic information (single record). |
SQLGetDiagRec() |
SQL/CLI |
Returns additional diagnostic information (multiple records). |
Accessing Systems Catalogs |
||
SQLColumnPrivileges() |
ODBC |
Returns list of columns and associated privileges. |
SQLColumns() |
X/Open |
Returns list of columns for the specified table. |
SQLForeignKeys |
ODBC |
Returns list of all columns that comprise the foreign keys for the table, if any. |
SQLPrimaryKeys() |
ODBC |
Returns list of all columns that comprise the primary key for the table, if any. |
SQLProcedureColumns() |
ODBC |
Returns list of input/output parameters and columns included into returned resultset. |
SQLProcedures() |
ODBC |
Returns list of all stored procedures and functions from a data source. |
SQLSpecialColumns() |
X/Open |
Returns information about optimal set of columns that uniquely identifies a row in the table, or a list of the columns updated automatically when any value in a row is updated. |
SQLStatistics() |
SQL/CLI |
Returns statistic information for specific table, as well as the list of all indices for the table. |
SQLTablePrivileges() |
ODBC |
Returns list of tables and all the privileges for the specific table. |
SQLTables() |
X/Open |
Returns list of table names from the data source. |
Transaction Management |
||
SQLEndTran() |
SQL/CLI |
Commits or rolls back a transaction. |
Drivers and Data Source Information |
||
SQLDataSources() |
SQL/CLI |
Returns list of all available data sources. |
SQLDrivers() |
ODBC |
Returns list of all installed drivers on the system. |
SQL/CLI Function |
Conforms to the Standard |
Description |
SQLGetInfo() |
SQL/CLI |
Returns information about a specific driver and the data source. |
SQLGetFunctions() |
SQL/CLI |
Returns list of all functions supported by the driver. |
SQLGetTypeInfo() |
SQL/CLI |
Returns information about all supported data types. |
Note |
ODBC standard does not address security concerns; in fact, unless encryption is used, all information sent through API calls is up for grabs. Using an ODBC driver with built-in encryption alleviates this potential problem. |