text:
� �Foa�, mimetypeapplication/epub+zipPK � �F META-INF/container.xml� �
This chapter describes the major features provided by Oracle Database gateways. Descriptions of these features are in the following topics:
SQL and PL/SQL Support
Heterogeneous Replication
Passthrough SQL
Result Set Support
Data Dictionary Translations
Date-Time Data Types
Two-Phase Commit Protocol
Piecewise LONG Data Type
SQL*Plus DESCRIBE Command
Constraints on SQL in a Distributed Environment
Oracle's Optimizer and Heterogeneous Services
Note:These features may not be available in all Heterogeneous Services gateways. Not only must there be generic support for these features, which Heterogeneous Services provides, but there must also be support added to the driver for them. Consult the appropriate gateway documentation to determine if a particular feature is supported for your gateway.
SQL statements are translated and data types are mapped according to capabilities. PL/SQL calls are mapped to non-Oracle system stored procedures. With SQL statements, if functionality is missing at the remote system, then either a simpler query is issued or the statement is broken up into multiple queries. Then, the desired results are obtained by postprocessing in the Oracle database.
Even though Heterogeneous Services can, for the most part, incorporate non-Oracle systems into Oracle distributed sessions, there are several limitations to this. Some of the generic limitations are:
There is no support for
CONNECT BY clauses in SQL statements.
ROWID support is limited; consult individual gateway documentation for more details. The Oracle Universal
ROWID data type is not supported in any gateway that uses Heterogeneous Services.
Large objects (LOBs), abstract data types (ADTs), and reference data types (REFs) are not supported.
Remote packages are not supported.
Remote stored procedures can have
out arguments of type
REF CURSOR but not
in or
in-out objects.
Oracle Heterogeneous Services agents do not support shared database links.
Note:In addition to these generic limitations, each gateway can have additional limitations. See the gateway documentation for individual gateways for a complete list of limitations of the product.
Data can be replicated between a non-Oracle system and Oracle Database using materialized views.
Note:There is another means of replicating information between Oracle and non-Oracle databases called Oracle Streams.
For information about using Oracle Streams, see Oracle Streams Concepts and Administration.
Materialized views instantiate data captured from tables at the non-Oracle master site at a particular time. This instant is defined by a refresh operation, which copies this data to Oracle Database and synchronizes the copy on the Oracle system with the master copy on the non-Oracle system. The materialized data is then available as a view on Oracle Database.
Replication facilities provide mechanisms to schedule refreshes and to collect materialized views into replication groups to facilitate their administration. Refresh groups permit refreshing multiple materialized views as if they were a single object.
Heterogeneous replication support is necessarily limited to a subset of the full Oracle-to-Oracle replication functionality:
Only the non-Oracle system can be the primary site. This is because materialized views can be created only on Oracle Database.
Materialized views must use a complete refresh. This is because fast refresh would require Oracle-specific functionality in the non-Oracle system.
Not all types of materialized views can be created to reference tables on a non-Oracle system. Primary key and subquery materialized views are supported, but
ROWID and
OBJECT ID materialized views are not supported. This is because there is no SQL standard for the format and contents of
ROWID, and non-Oracle systems do not implement Oracle objects.
Other restrictions apply to any access to non-Oracle data through Oracle's Heterogeneous Services facilities. The most important of these are:
Non-Oracle data types in table columns mapped to a fixed view must be compatible with (that is, have a mapping to or from) Oracle data types. This is usually true for data types defined by ANSI SQL standards.
A subquery materialized view may not be able to use language features restricted by individual non-Oracle systems. In many cases, Heterogeneous Services supports such language features by processing queries within Oracle Database. Occasionally the non-Oracle systems impose limitations that cannot be detected until Heterogeneous Services attempts to execute the query.
The following examples illustrate basic setup and use of three materialized views to replicate data from a non-Oracle system to an Oracle data store.
Note:For the following examples,
remote_db refers to the non-Oracle system that you are accessing from Oracle Database.
Modify these examples for your environment. Do not try to execute them as they are written.
Example 1: Create Materialized Views for Heterogeneous Replication
This example creates three materialized views that are then used in subsequent examples.
Create a primary key materialized view of table
CREATE MATERIALIZED VIEW pk_mv REFRESH COMPLETE AS SELECT * FROM customer@remote_db WHERE "zip" = 94555;
Create a subquery materialized view of tables
orders@remote_db and
CREATE MATERIALIZED VIEW sq_mv REFRESH COMPLETE AS SELECT * FROM orders@remote_db o WHERE EXISTS (SELECT c."c_id" FROM customer@remote_db c WHERE c."zip" = 94555 and c."c_id" = o."c_id" );
Create a complex materialized view of data from multiple tables on
CREATE MATERIALIZED VIEW cx_mv REFRESH COMPLETE AS SELECT c."c_id", o."o_id" FROM customer@remote_db c, orders@remote_db o, order_line@remote_db ol WHERE c."c_id" = o."c_id" AND o."o_id" = ol."o_id";
Example 2: Set Up a Refresh Group for Heterogeneous Replication
BEGIN dbms_refresh.make('refgroup1', 'pk_mv, sq_mv, cx_mv', NULL, NULL); END; /
Example 3: Force Refresh of All Three Materialized Views
BEGIN dbms_refresh.refresh('refgroup1'); END; /
See Also:Oracle Database Advanced Replication for a complete description of materialized views and replication facilities
The passthrough SQL feature enables you to send a statement directly to a non-Oracle system without first being interpreted by Oracle Database. This feature can be useful if the non-Oracle system allows for operations in statements for which there is no equivalent in Oracle.
This section contains the following topics:
Using the DBMS_HS_PASSTHROUGH Package
Considering the Implications of Using Passthrough SQL
Executing Passthrough SQL Statements
You can execute passthrough SQL statements directly on the non-Oracle system using the PL/SQL package
DBMS_HS_PASSTHROUGH. Any statement executed with this package is executed in the same transaction as standard SQL statements.
DBMS_HS_PASSTHROUGH package is a virtual package. It conceptually resides on the non-Oracle system. In reality, however, calls to this package are intercepted by Heterogeneous Services and are mapped to one or more Heterogeneous Services calls. The driver then maps these Heterogeneous Services calls to the API of the non-Oracle system. The client application invokes the procedures in the package through a database link in the same way as it would invoke a non-Oracle system stored procedure. The special processing done by Heterogeneous Services is transparent to the user.
See Also:Oracle Database PL/SQL Packages and Types Reference for more information about this package
When you execute a passthrough SQL statement that implicitly commits or rolls back a transaction in a non-Oracle system, the transaction is affected. For example, some systems implicitly commit the transaction containing a data definition language (DDL) statement. Because Oracle Database is bypassed, Oracle Database is unaware that a transaction was committed in the non-Oracle system. Consequently, the data at the non-Oracle system can be committed, while the transaction in Oracle Database is not.
If the transaction in Oracle Database is rolled back, data inconsistencies between Oracle Database and the non-Oracle system can occur. This situation results in global data inconsistency.
Note that if the application executes a typical
COMMIT statement, Oracle Database can coordinate the distributed transaction with the non-Oracle system. The statement executed with the passthrough facility is part of the distributed transaction.
The following table shows the functions and procedures provided by the
DBMS_HS_PASSTHROUGH package that enable you to execute passthrough SQL statements.
|Opens a cursor.
|Closes a cursor.
|Parses the statement.
IN variables.
OUT variables.
IN OUT variables.
|Executes a nonquery statement.
|Executes a nonquery statement without bind variables.
|Fetches rows from query.
|Retrieves column value from
SELECT statement or retrieves
OUT bind parameters.
Nonqueries include the following statements and types of statements:
To execute nonquery statements, use the
EXECUTE_IMMEDIATE function. For example, to execute a DDL statement on a non-Oracle system that you can access using the database link
salesdb, enter the following:
DECLARE num_rows INTEGER; BEGIN num_rows := DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@salesdb ('CREATE TABLE dept1 (n SMALLINT, loc CHARACTER(10))'); END;
The variable
num_rows is assigned the number of rows affected by the statements that were executed. For DDL statements, zero is returned. Note that you cannot execute a query with
EXECUTE_IMMEDIATE function and you cannot use bind variables.
Bind variables let you use the same SQL statement multiple times with different values, reducing the number of times a SQL statement needs to be parsed. For example, when you insert four rows in a table, you can parse the SQL statement once, and bind and execute the SQL statement for each row. One SQL statement can have zero or more bind variables.
To execute passthrough SQL statements with bind variables, you must:
Open a cursor.
Parse the SQL statement on the non-Oracle system.
Bind the variables.
Execute the SQL statement on the non-Oracle system.
Close the cursor.
Figure 3-1 shows the flow diagram for executing nonqueries with bind variables.
The syntax of the non-Oracle system determines how a statement specifies a bind variable. For example, on an Oracle system you define bind variables with a preceding colon. For example:
... UPDATE emp SET sal=sal*1.1 WHERE ename=:ename; ...
In this statement
ename is the bind variable. On non-Oracle systems, you may need to specify bind variables with a question mark. For example:
... UPDATE emp SET sal=sal*1.1 WHERE ename= ?; ...
In the bind variable step, you must positionally associate host program variables (in this case, PL/SQL) with each of these bind variables. For example, to execute the preceding statement, use the following PL/SQL program:
DECLARE c INTEGER; nr INTEGER; BEGIN c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@salesdb; DBMS_HS_PASSTHROUGH.PARSE@salesdb(c, 'UPDATE emp SET SAL=SAL*1.1 WHERE ename=?'); DBMS_HS_PASSTHROUGH.BIND_VARIABLE@salesdb(c,1,'JONES'); nr:=DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@salesdb(c); DBMS_OUTPUT.PUT_LINE(nr||' rows updated'); DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@salesdb(c); END;
The non-Oracle system can support
OUT bind variables. With
OUT bind variables, the value of the bind variable is not known until after the execution of the SQL statement.
OUT bind variables are populated after executing the SQL statement, the non-Oracle system must know that the particular bind variable is an
OUT bind variable before the SQL statement is executed. You must use the
BIND_OUT_VARIABLE procedure to specify that the bind variable is an
OUT bind variable.
After executing the SQL statement, you can retrieve the value of the
OUT bind variable using the
GET_VALUE procedure.
A bind variable can be both an
IN and an
OUT variable. This means that the value of the bind variable must be known before executing the SQL statement, but you can change the value after the SQL statement is executed.
IN OUT bind variables, you must use the
BIND_INOUT_VARIABLE procedure to provide a value before executing the SQL statement. After executing the SQL statement, you must use the
GET_VALUE procedure to retrieve the new value of the bind variable.
The difference between queries and nonqueries is that queries retrieve a result set from a
SELECT statement. The result set is retrieved by using a cursor.
Figure 3-2 illustrates the steps in a passthrough SQL query. After the system parses the
SELECT statement, each row of the result set can be retrieved with the
FETCH_ROW procedure. After the row is retrieved, use the
GET_VALUE procedure to retrieve the selected list of items into program variables. After all rows are retrieved, you can close the cursor.
You do not have to retrieve all the rows. You can close the cursor at any time after opening the cursor.
The following example executes a query:
DECLARE val VARCHAR2(100); c INTEGER; nr INTEGER; BEGIN c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@salesdb; DBMS_HS_PASSTHROUGH.PARSE@salesdb(c, 'select ENAME from EMP where DEPTNO=10'); LOOP nr := DBMS_HS_PASSTHROUGH.FETCH_ROW@salesdb(c); EXIT WHEN nr = 0; DBMS_HS_PASSTHROUGH.GET_VALUE@salesdb(c, 1, val); DBMS_OUTPUT.PUT_LINE(val); END LOOP; DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@salesdb(c); END;
After the
SELECT statement has been parsed, the rows are fetched and printed in a loop until the
FETCH_ROW function returns the value
Various relational databases enable stored procedures to return result sets (one or more sets of rows).
Traditionally, database stored procedures worked exactly like procedures in any high-level programming language. They had a fixed number of arguments which could be of types
OUT, or
IN OUT. If a procedure had
n arguments, it could return at most
n values as results. However, suppose that you wanted a stored procedure to execute a query such as
SELECT * FROM emp and return the results. The
emp table might have a fixed number of columns, but there is no way of telling, at procedure creation time, the number of rows it has. Because of this, no traditional stored procedure could be created that returned the results of this type of query. As a result, several relational database vendors added the ability to return results sets from stored procedures, but each relational database returns result sets from stored procedures differently.
Oracle has a data type called a
REF CURSOR. Like every other Oracle data type, a stored procedure can take this data type as an
IN or
OUT argument. With Oracle Database, a stored procedure must have an output argument of type
REF CURSOR. It then opens a cursor for a SQL statement and places a handle to that cursor in that output parameter. The caller can then retrieve from the
REF CURSOR the same way as from any other cursor.
Oracle Database can do a lot more than return result sets. The
REF CURSOR data type can be passed as an input argument to PL/SQL routines to be passed back and forth between client programs and PL/SQL routines or as an input argument between several PL/SQL routines.
This section contains the following topics:
Result Set Support for Non-Oracle Systems
Heterogeneous Services Support for Result Sets
Several non-Oracle systems allow stored procedures to return result sets, but they do so in different ways. Result set support for non-Oracle databases is typically based on one of the following two models.
Model 1: Result Set Support
When creating a stored procedure, you can explicitly specify the maximum number of result sets that can be returned by that stored procedure. While executing, the stored procedure can open anywhere from zero up to its specified maximum number of result sets. After the execution of the stored procedure, a client program gets handles to these result sets by using either an embedded SQL directive or by calling a client library function. After that, the client program can retrieve from the result set in the same way as from a typical cursor.
Model 2: Result Set Support
In this model, there is no specified limit to the number of result sets that can be returned by a stored procedure. Both Model 1 and Oracle Database have a limit. For Oracle Database, the number of result sets returned by a stored procedure can be at most the number of
REF CURSOR OUT arguments. For Model 1, the upper limit is specified using a directive in the stored procedure language. Another way that Model 2 differs from Oracle Database and Model 1 is that they do not return a handle to the result sets. Instead, they place the entire result set on the wire when returning from a stored procedure. For Oracle Database, the handle is the
REF CURSOR OUT argument. For Model 1, it is obtained separately after the execution of the stored procedure. For both Oracle Database and Model 1, after the handle is obtained, data from the result set is obtained by doing a fetch on the handle; there are several cursors open and the fetch can be in any order. In the case of Model 2, however, all the data is already on the wire, with the result sets coming in the order determined by the stored procedure and the output arguments of the procedures coming at the end. The entire first result set must be retrieved, then the entire second result set, until all of the results are retrieved. Finally, the stored procedure
OUT arguments are retrieved.
Result set support exists among non-Oracle databases in different forms. All of these must be mapped to the Oracle
REF CURSOR model. Due to the differences in behavior among the non-Oracle systems, Heterogeneous Services result set support acts in one of two different ways depending on the non-Oracle system to which it is connected.
Note the following about Heterogeneous Services result set support:
Result set support is part of the Heterogeneous Services generic code, but for the feature to work in a gateway, the driver has to implement it. Not all drivers have implemented result set support and you must verify that your gateway is supported.
Heterogeneous Services supports
REF CURSOR OUT arguments from stored procedures.
IN and
IN OUT arguments are not supported.
REF CURSOR OUT arguments are all anonymous reference cursors.
REF CURSORs that are returned by Heterogeneous Services do not have types.
Each result set returned by a non-Oracle system stored procedure is mapped by an Oracle driver to an
OUT argument of type
REF CURSOR. The client program detects a stored procedure with several
OUT arguments of type
REF CURSOR. After executing the stored procedure, the client program can fetch from the
REF CURSOR the same way as it would from a
REF CURSOR returned by an Oracle stored procedure. When connecting to the gateway as described in Section 220.127.116.11, Heterogeneous Services will be in cursor mode.
There is a maximum number of result sets that a particular stored procedure can return. The number of result sets returned is at most the number of
REF CURSOR OUT arguments for the stored procedure. It can return fewer result sets, but it can never return more.
For the system described in Section 188.8.131.52, there is no maximum number of result sets that can be returned. In the case of Model 1 (in Section 220.127.116.11), the maximum number of result sets that a procedure can return is known, and that the driver can return to Heterogeneous Services, is specified in the stored procedure by the number of
REF CURSOR OUT arguments. If, when the stored procedure is executed, fewer result sets than the maximum are returned, then the other
REF CURSOR OUT arguments are set to
Another problem for Model 2 database servers is that result sets must be retrieved in the order in which they were placed on the wire by the database. This prevents Heterogeneous Services from running in cursor mode when connecting to these databases. To access result sets returned by these stored procedures, Heterogeneous Services must be in sequential mode.
In sequential mode, the procedure description returned by the driver contains the following:
All the input arguments of the remote stored procedure
None of the output arguments
OUT argument of type
REF CURSOR (corresponding to the first result set returned by the stored procedure)
The client fetches from this
REF CURSOR and then calls the virtual package function
DBMS_HS_RESULT_SET.GET_NEXT_RESULT_SET to fetch the
REF CURSOR corresponding to the next result set. This function call repeats until all result sets are retrieved. The last result set returned will be the
OUT arguments of the remote stored procedure.
The primary limitations of sequential mode are:
Result sets returned by a remote stored procedure must be retrieved in the order in which they were placed on the wire.
When a stored procedure is executed, all result sets returned by a previously executed stored procedure are closed (regardless of whether or not the data was retrieved).
See Also:Your gateway-specific manual for more information about how result sets are supported through the gateway
Most database systems have some form of data dictionary. A data dictionary is a collection of information about the database objects that were created by various users of the system. For a relational database, a data dictionary is a set of tables and views that contain information about the data in the database. This information includes information about the users who are using the system and about the objects that they created (such as tables, views, and triggers). Almost all data dictionaries (regardless of the database system) contain the same information, but each database system organizes the information differently.
For example, the
ALL_CATALOG Oracle data dictionary view gives a list of tables, views, and sequences in the database. It has three columns: the first is called
OWNER, and it is the name of the owner of the object; the second is called
TABLE_NAME, and it is the name of the object; and the third is called
TABLE_TYPE, and it is the data type. This field has value
SEQUENCE and so forth depending on the object type. However, in Sybase, the same information is stored in two tables called
sysusers and
sysobjects whose column names are different from those of the Oracle
ALL_CATALOG table. Additionally, in Oracle Database, the table type is a string with a value such as
TABLE or
VIEW. With Sybase, it is a letter, for example,
U means user table;
S means system table;
V means view, and so forth.
If the client program requires information from the table
ALL_CATALOG on a Sybase system, it sends a query referencing
database_link to a gateway. Heterogeneous Services translates this query to an appropriate query on
systables and then sends the translated query to the Sybase system, for example:
SELECT SU."name" OWNER, SO."name" TABLE_NAME, DECODE(SO."type", 'U ','TABLE', 'S ', 'TABLE', 'V ', 'VIEW') TABLE_TYPE FROM "dbo"."sysusers"@remote_db SU, "dbo"."sysobjects"@remote_db SO WHERE SU."uid" = SO."uid" AND (SO."type" = 'V' OR SO."type" = 'S' OR SO."type" = 'U');
To relay the translation of a query on an Oracle data dictionary table to the equivalent one on the non-Oracle system data dictionary table, Heterogeneous Services needs data dictionary translations for that non-Oracle system. A data dictionary translation is a view definition (essentially a
SELECT statement) of one or more non-Oracle system data dictionary tables that look like the Oracle data dictionary table, with the same column names and the same formatting. Most data dictionary translations are not as simple as the preceding example. Often, the information is scattered over many tables, and the data dictionary translation is a complex join of those tables.
In some cases, an Oracle data dictionary table does not have a translation because the information does not exist on the non-Oracle system. In such cases, the gateway must not upload a translation, or the gateway might implement an alternative approach called mimicking. If the gateway mimics a data dictionary table, it informs Heterogeneous Services, and Heterogeneous Services will get the description of the data dictionary table by querying the local database. When asked to retrieve data, it will report that no rows were selected.
Oracle Database has five date-time data types:
Heterogeneous Services generic code supports Oracle date-time data types in SQL and stored procedures. Heterogeneous Services does not support these data types in data dictionary translations or queries involving data dictionary translations.
Even though Heterogeneous Services generic code supports date-time data types, support for a particular gateway depends on whether or not the driver for that non-Oracle system implemented date-time support. Support, even when the driver implements it, may be partial because of the limitations of the non-Oracle system. For more information, see your gateway-specific documentation.
You must set the timestamp formats of the non-Oracle system in the gateway initialization file. The parameters to set are
HS_NLS_TIMESTAMP_FORMAT and
HS_NLS_TIMESTAMP_TZ_FORMAT. You should also set the local time zone for the non-Oracle system in the initialization file by setting
See Also:Oracle Database SQL Language Reference for information about datetime data types
Heterogeneous Services provides the infrastructure to implement the two-phase commit protocol. The extent to which this is supported depends on the gateway and the remote system. For more information, see your gateway-specific documentation.
See Also:Oracle Database Administrator's Guide for more information about the two-phase commit protocol
Earlier versions of gateways had limited support for the
LONG data type.
LONG is an Oracle data type that can store up to 2 GB of character data or raw data (
LONG RAW). These earlier versions restricted the amount of
LONG data to 4 MB because they treated
LONG data as a single piece. This caused memory and network bandwidth restrictions on the size of the data that could be handled. Current gateways extended the functionality to support the full 2 GB of heterogeneous
LONG data. The gateways now manage the data piecewise between the agent and Oracle Database, eliminating the large memory and network bandwidth requirements.
HS_LONG_PIECE_TRANSFER_SIZE Heterogeneous Services initialization parameter can be used to set the size of the transferred pieces. For example, consider retrieving 2 GB of
LONG data from a heterogeneous source. A smaller piece requires less memory, but it requires more round-trips to retrieve all the data. A larger piece requires fewer round-trips, but it requires a larger amount of memory to store the intermediate pieces internally. The initialization parameter can be used to tune a system for the best performance, that is, for the best trade-off between round-trips and memory requirements. If the initialization parameter is not set, the system uses 64 KB as the default piece size.
Note:Do not confuse this feature with piecemeal operations on
LONG data on the client side. Piecemeal fetch and insert operations on the client side worked with the earlier versions of the gateways, and they continue to do so. The only difference on the client side is that, where earlier versions of the gateways were able to fetch a maximum of 4 MB of
LONG data, now they can retrieve the 2 GB of
LONG data. This is a significant improvement because 4 MB is only 0.2 percent of the data type's capacity.
You can describe non-Oracle system objects using the SQL*Plus
DESCRIBE command. However, there are some limitations. For example, using heterogeneous links, you cannot describe packages, sequences, synonyms, or types.
This section explains some of the constraints on SQL in a distributed environment. These constraints apply to distributed environments that access non-Oracle systems or remote Oracle databases.
This section contains the following topics:
Remote and Heterogeneous References
Important Restrictions
Note:Many of the rules for heterogeneous access also apply to remote references. For more information, see the distributed database section of the Oracle Database Administrator's Guide.
A statement can, with restrictions, be executed on any database node referenced in the statement or the local node. If all objects referenced are resolved to a single, referenced node, Oracle attempts to execute a query at that node. You can force execution at a referenced node by using the
/*+ REMOTE_MAPPED */ or
/*+ DRIVING_SITE */ hints. If a statement is forwarded to a node other than the node from where the statement was issued, the statement is said to be remote-mapped.
There is complete data type checking support for remote-mapped statements. The result provides consistent data type checking and complete data type coercion.
See Also:Section 4.5, "Oracle Database Server SQL Construct Processing"
The ways in which statements can be remote-mapped are subject to specific rules or restrictions. If these rules are not followed, an error occurs. As long as the statements issued are consistent with all these rules, the order in which the rules are applied does not matter. See Section 3.10.2 for these rules or restrictions.
Different constraints exist when you are using SQL for remote mapping in a distributed environment. This distributed environment can include remote Oracle databases as well as non-Oracle databases that are accessed through Oracle Database gateways.
The following section lists some of the different rules or restrictions that exist when you are using SQL for remote mapping in a distributed environment.
Note:In the examples that follow,
remote_db refers to a remote non-Oracle system while
remote_oracle_db refers to a remote Oracle Database.
Rule A: A data definition language statement cannot be remote-mapped.
In Oracle data definition language, the target object syntactically has no place for a remote reference. Data definition language statements that contain remote references are always executed locally. For Heterogeneous Services, this means it cannot directly create database objects in a non-Oracle database using SQL.
However, there is an indirect way using passthrough SQL as shown in the following example:
DECLARE num_rows INTEGER; BEGIN num_rows := DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@remote_db ( 'create table x1 (c1 char, c2 int)' ); END;
Rule B: INSERT, UPDATE and DELETE statements with a remote target table must be remote-mapped.
This rule is more restrictive for non-Oracle remote databases than for a remote Oracle database. This is because the remote system cannot fetch data from the originating Oracle database while executing data manipulation language (DML) statements targeting tables in a non-Oracle system.
For example, to insert all local employees from the local
emp table to a remote non-Oracle
emp table, use the following statement:
INSERT INTO emp@remote_db SELECT * FROM emp;
This statement is remote-mapped to the remote database. The remote-mapped statement sent to the remote database contains a remote reference back to the originating database for
emp. Such a remote link received by the remote database is called a callback link.
Note:Even though callback links are supported in generic Heterogeneous Services, they may not be implemented in all Heterogeneous Services agents. Refer to your database gateway documentation to determine if callback links work with the database gateway that you are using.
If callback links are not supported by a particular gateway, the previous
INSERT statements returns the following error:
ORA-02025: all tables in the SQL statement must be at the remote database
The workaround is to write a PL/SQL block. For example:
DECLARE CURSOR remote_insert IS SELECT * FROM emp; BEGIN FOR rec IN remote_insert LOOP INSERT INTO emp@remote_db (empno, ename, deptno) VALUES ( rec.empno, rec.ename, rec.deptno ); END loop; END;
Another special case involves session-specific SQL functions such as
USERENV, and
SYSDATE. These functions need to be executed at the originating site. A remote-mapped statement containing these functions contains a callback link. For a non-Oracle database for which callbacks are not supported, this can (by default) result in a restriction error.
For example, consider the following statement:
DELETE FROM emp@remote_db WHERE hiredate > sysdate;
The previous statement returns the following error message:
ORA-02070: database REMOTE_DB does not support special functions in this context
This can be resolved by replacing special functions with a bind variable. For example:
DELETE FROM emp@remote_db WHERE hiredate > :1;
Rule C: Object features like tables with nested table columns, ADT columns, Opaque columns, or Ref Columns cannot be remote-mapped.
Currently, these column types are not supported for heterogeneous access. Hence, this limitation is not directly encountered.
Rule D: SQL statements containing operators and constructs that are not supported at the remote site cannot be remote-mapped.
In the case of an
UPDATE, or
DELETE, this means that the SQL statement cannot be executed (see Rule B). However, you might still be able to execute the SQL statement if the unsupported operator or construct can be executed through a callback link.
In the case of a
SELECT, you can always execute a statement affected by this rule as long as none of the remaining rules require the statement to be remote mapped. The
SELECT statements affected by this rule are executed by fetching all the necessary data through a remote
SELECT operation, and processing the unsupported operator or construct locally using the local SQL engine.
A remote
SELECT operation is the operation that retrieves rows from the remote table as opposed to an operation that retrieves data from the local table. In the worse possible case of a remote
SELECT, Oracle does a full table scan. A full table scan is a fetch of all the data in the remote table across the network without any filtering (for example,
Full table scans are expensive and, therefore, Oracle attempts to avoid them. If there are indexes on the remote table that can be used, these indexes are used in a
WHERE clause predicate to reduce the number of rows fetched across the network.
You can check the SQL statement generated by Oracle Database by explaining the statement and querying the
OTHER column of the explain plan table for each
REMOTE operation.
See Also:Section 3.11.1 for more information on how to interpret explain plans with remote references
For example, consider the following statement:
SELECT COUNT(*) FROM emp@remote_db WHERE hiredate < sysdate;
The statement returns the following output:
COUNT(*) ---------- 14 1 row selected.
The remote table scan is:
SELECT hiredate FROM emp;
The predicate converted to a filter cannot be generated back and passed down to the remote operation because
sysdate is not supported by the
remote_db or evaluation rules. Thus
sysdate must be executed locally.
Note:Because the remote table scan operation is only partially related to the original query, the number of rows retrieved can be significantly larger than expected and can have a significant impact on performance.
Rule E: SQL statement containing a table expression cannot be remote-mapped.
This limitation is not directly encountered because table expressions are not supported in the heterogeneous access module.
Rule F: If a SQL statement selects LONG data, the statement must be mapped to the node where the table containing the LONG data resides.
Consider the following type of statement:
SELECT long1 FROM table_with_long@remote_db, dual;
The previous statement returns the following error message (if callback links are not supported):
ORA-02025: all tables in the SQL statement must be at the remote database
Rule G: The statement must be mapped to the node on which the table or tables with columns referenced in the FOR UPDATE OF clause resides when the SQL statement is of form "SELECT...FOR UPDATE OF..."
When the SQL statement is of the form
SELECT...FOR UPDATE OF..., the statement must be mapped to the node on which the table or tables with columns referenced in the
FOR UPDATE OF clause resides.
For example, consider the following statement:
SELECT ename FROM emp@remote_db WHERE hiredate < sysdate FOR UPDATE OF empno;
The previous statement returns the following error message if it cannot be remote-mapped:
ORA-02070: database REMOTE_DB does not support special functions in this context
Rule H: If the SQL statement contains a SEQUENCE or sequences, then the statement must be mapped to the site where each sequence resides.
This rule is not encountered for the heterogeneous access module because remote non-Oracle sequences are not supported.
Rule I: If the statement contains a user-defined operator or operators, then the statement must be mapped to the node where each operator is defined.
If the statement contains a user-defined operator, the entire statement needs to be remote-mapped to the database node where the operator is defined.
Rule J: A statement containing duplicate bind variables cannot be remote-mapped.
The workaround for this restriction is to use unique bind variables and bind by number.
Oracle's optimizer can be used with Heterogeneous Services. Heterogeneous Services collects certain table and index statistics information on the respective non-Oracle system tables and passes this information back to Oracle Database. The Oracle cost-based optimizer uses this information when building the query plan.
There are several other optimizations that the cost-based optimizer performs. The most important ones are remote sort elimination and remote joins.
This section contains the following topics:
Example: Using Index and Table Statistics
Example: Remote Join Optimization
Optimizer Restrictions for Non-Oracle Access
Consider the following statement where you create a table in the Oracle database with 10 rows:
CREATE TABLE T1 (C1 number);
Analyze the table using the
DBMS_STATS package. For example:
The preceding example assumes the schema name is
SCOTT and the table name is
T1. See the Oracle Database PL/SQL Packages and Types Reference for more information about the
DBMS_STATS package.
Create a table in the non-Oracle system with 1000 rows.
Issue the following SQL statement:
SELECT a.* FROM remote_t1@remote_db a, T1 b WHERE a.C1 = b.C1;
The Oracle optimizer issues the following SQL statement to the agent:
SELECT C1 FROM remote_t1@remote_db;
This fetches all 1000 rows from the non-Oracle system and performs the join in the Oracle database.
If we add a unique index on the column
C1 in the table
remote_t1, and issue the same SQL statement again, the agent receives the following SQL statement for each value of
C1 in the local
... SELECT C1 FROM remote_t1@remote_db WHERE C1 = ?; ...
? is the bind parameter marker. Also, join predicates containing bind variables generated by Oracle are generated only for nested loop join methods.
To verify the SQL execution plan, generate an explain plan for the SQL statement. First, load
utlxplan in the
admin directory.
Enter the following:
EXPLAIN PLAN FOR SELECT a.* FROM remote_t1@remote_db a, T1 b WHERE a.C1 = b.C1;
Execute the
utlxpls utility script by entering the following statement.
OPERATION REMOTE indicates that remote SQL is being referenced.
To find out what statement is sent, enter the following statement:
The following is an example of the remote join optimization capability of the Oracle database.
Note:The explain plan that uses tables from a non-Oracle system can differ from similar statements with local or remote Oracle table scans. This is because of the limitation on the statistics available to Oracle for non-Oracle tables. Most importantly, column selectivity is not available for non-unique indexes of non-Oracle tables. Because of the limitation of the statistics available, the following example is not necessarily what you encounter when doing remote joins and is intended for illustration only.
Consider the following example:
EXPLAIN PLAN FOR SELECT e.ename, d.dname, f.ename, f.deptno FROM dept d, emp@remote_db e, emp@remote_db f WHERE e.mgr = f.empno AND e.deptno = d.deptno AND e.empno = f.empno; @utlxpls
You should see output similar to the following:
PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost | Inst |IN-OUT| --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 2000 | 197K| 205 | |* 1 | HASH JOIN | | 2000 | 197K| 205 | | 2 | TABLE ACCESS FULL | DEPT | 21 | 462 | 2 | |* 3 | HASH JOIN | | 2000 | 154K| 201 | | 4 | REMOTE | | 2000 | 66000 | 52 | | 5 | REMOTE | | 2000 | 92000 | 52 | --------------------------------------------------------------------------- PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Query Block Name / Hint Alias (identified by operation id): ----------------------------------------------------------- 1 - sel$1 / D 2 - sel$1 / D 3 - sel$1 / F 4 -H�� sel$1 / F 5 - sel$1 / E Predicate Information (identified by operation id): PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- --------------------------------------------------- 1 - access("E"."DEPTNO"="D"."DEPTNO") 3 - access("E"."MGR"="F"."EMPNO" AND "E"."EMPNO"="F"."EMPNO")
Issue the following statement:
SET long 300 SELECT other FROM plan_table WHERE operation = 'REMOTE';
You should see output similar to the following:
The following are optimizer restrictions for non-Oracle system access:
There are no column statistics for remote objects. This can result in poor execution plans. Verify the execution plan and use hints to improve the plan.
There is no optimizer hint to force a remote join. However, there is a remote query block optimization that can be used to rewrite the query slightly in order to get a remote join.
The example from the previous section can be rewritten to the following form:
SELECT v.ename, d.dname, d.deptno FROM dept d, (SELECT /*+ NO_MERGE */ e.deptno deptno, e.ename ename emp@remote_db e, emp@remote_db f WHERE e.mgr = f.empno AND e.empno = f.empno; ) WHERE v.deptno = d.deptno;
This example guarantees a remote join because it has been isolated in a nested query with the
NO_MERGE hint.
This chapter suggests ways to optimize distributed SQL statements and improve the performance of distributed queries.
This chapter includes the following sections:
Note:For information about general data transfer performance, see Section 4.2, "Optimizing Data Transfers Using Bulk Fetch" and Section 4.3, "Optimizing Data Loads Using Parallel Load"
When a SQL statement accesses data from non-Oracle systems, it is said to be a heterogeneous distributed SQL statement. To optimize heterogeneous distributed SQL statements, follow the same guidelines as for optimizing distributed SQL statements that access Oracle databases only. However, you must consider that the non-Oracle system usually does not support all the functions and operators that Oracle supports.
The Oracle Database gateways tell Oracle (at connect time) which functions and operators they support. If the non-Oracle data source does not support a function or operator, then Oracle performs that function or operator. In this case, Oracle obtains the data from the other data source and applies the function or operator locally. This affects the way in which the SQL statements are decomposed and can affect performance, especially if Oracle is not on the same computer as the other data source. However, performance can be improved if you use the bulk fetch and bulk load features.
You can improve the performance of distributed queries by using the following strategies:
Choose the best SQL statement.
In many cases, there are several SQL statements that can achieve the same result. If all tables are on the same database, then the difference in performance between these SQL statements may be minimal. If the tables are located on different databases, then the difference in performance may be more significant. Also, note that the best SQL statement may change from one release to the next.
Use the query optimizer.
The query optimizer uses indexes on remote tables, considers more execution plans than the rule-based optimizer, and generally gives better results. With the query optimizer, performance of distributed queries is generally satisfactory. Only on rare occasions is it necessary to change SQL statements, create views, or use procedural code.
Use views.
In some situations, views can be used to improve performance of distributed queries. For example:
Joining several remote tables on the remote database
Sending a different table through the network
Retrieve data from the remote table in parallel
Use procedural code.
On rare occasions, it can be more efficient to replace a distributed query by procedural code, such as a PL/SQL procedure or a precompiler program.
Oracle's synchronous solutions for operating in a heterogeneous environment are Oracle Database gateways. The common component of Oracle Database for supporting these solutions is Heterogeneous Services. This chapter describes the architecture and functionality of the Heterogeneous Services component and its interaction with Oracle Database gateways.
This chapter contains the following topics:
At a high level, Oracle heterogeneous connectivity process architecture is structured as shown in Figure 2-1.
The Heterogeneous Services component in Oracle Database communicates with a Heterogeneous Services agent process which, in turn, communicates with the non-Oracle system. The code can be conceptually divided into three parts:
The Heterogeneous Services component in Oracle Database
This module performs most of the processing related to heterogeneous connectivity.
Agent generic code
This is code in the agent that is generic to all Heterogeneous Services products. This code communicates with the database and provides multithreading support.
The driver
This module communicates with the non-Oracle system. It is used to map calls from the Heterogeneous Services to the native API of the non-Oracle system, and it is not specific to Oracle systems.
A Heterogeneous Services agent is the process through which Oracle Database connects to a non-Oracle system. The agent process that accesses a non-Oracle system is called a gateway. Access to all gateways goes through the Heterogeneous Services component in Oracle Database and all gateways contain the same agent-generic code. Each gateway has a different driver linked in that maps the Heterogeneous Services to the client API of the non-Oracle system.
The agent process consists of two components. These are agent generic code and a non-Oracle system-specific driver. An agent exists primarily to isolate Oracle Database from third-party code. For a process to access the non-Oracle system, the non-Oracle system client libraries must be linked into it. In the absence of the agent process, these libraries would have to be directly linked into the Oracle database and problems in this code could cause Oracle Database to fail. An agent process isolates Oracle Database from any problems in third-party code. Even if a fatal error occurs in the thirde-party code, only the agent process will end.
An agent can be in the following places:
On the same computer as the non-Oracle system
On the same computer as Oracle Database
On a computer different from either of these two
Agent processes are started when a user session accesses a non-Oracle system through a database link. These connections are made using Oracle's remote data access software, Oracle Net Services, which enables both client/server and server/server communication. The agent process continues to run until the user session is disconnected or the database link is explicitly closed.
Multithreaded agents act differently. They must be explicitly started and shut down by a database administrator, instead of automatically being spawned by Oracle Net Services
There are two types of Heterogeneous Services agents:
An Oracle Database gateway is a gateway that is designed for accessing a specific non-Oracle system. Oracle provides gateways to access several commercially available non-Oracle systems. For example, an Oracle Database Gateway for Sybase is designed to access Sybase databases.
With Oracle Database gateways, you can access data anywhere in a distributed database system without being required to know either the location of the data or how it is stored. When the results of your queries are returned to you by Oracle Database, they are presented to you as if the data stores from which they were taken all resided within a remote instance of an Oracle distributed database.
In addition to Oracle Database gateways for various non-Oracle database systems, there is the Oracle Database Gateway for ODBC agent. This agent contains only generic code, and the customer is responsible for providing the necessary drivers. Oracle Database Gateway for ODBC enables you to use ODBC drivers to access non-Oracle systems that have an ODBC interface.
To access a specific non-Oracle system using Oracle Database Gateway for ODBC, you must configure an ODBC driver to the non-Oracle system. These drivers are not provided by Oracle. However, if the non-Oracle system supports the ODBC protocols, you can use Oracle Database Gateway for ODBC to access any non-Oracle system that can be accessed using an ODBC driver.
Oracle Database Gateway for ODBC has some limitations. Especially, when compared to a paticular target, the functionality and performance are limited.
This section discusses the components of Heterogeneous Services in Oracle Database. These components are:
The transaction service component of the Heterogeneous Services component enables non-Oracle systems to be integrated into Oracle Database transactions and sessions. When you access a non-Oracle system for the first time using a database link within your Oracle user session, you transparently set up an authenticated session in the non-Oracle system. At the end of your Oracle user session, the authenticated session in the non-Oracle database system is closed.
Additionally, one or more non-Oracle systems can participate in an Oracle distributed transaction. When an application commits a transaction, Oracle's two-phase commit protocol accesses the non-Oracle database system to transparently coordinate the distributed transaction. Even in those cases where the non-Oracle system does not support all aspects of Oracle two-phase commit protocol, Oracle can (with some limitations) support distributed transactions with the non-Oracle system.
The structured query language (SQL) service handles the processing of all SQL-related operations. The work done by the SQL service includes:
Mapping Oracle internal SQL-related calls to the Heterogeneous Services driver application programing interface (API). This API is then mapped by the driver to the client API of the non-Oracle system.
Translating SQL statements from Oracle's SQL dialect to the SQL dialect of the non-Oracle system.
Translating queries that reference Oracle data dictionary tables to queries that extract the necessary information from the non-Oracle system's data dictionary.
Converting data from non-Oracle system data types to Oracle data types and back.
Compensating for missing functionality of the non-Oracle system by issuing multiple queries to get the necessary data and doing postprocessing to get the desired results.
Heterogeneous Services components consist of generic code and must be configured to work with many different non-Oracle systems. Each gateway has configuration information stored in the driver module. The information is uploaded to the server immediately after the connection to the gateway is established. The configuration information includes:
Data dictionary translations are views on non-Oracle data dictionary tables. They help Heterogeneous Services translate references to Oracle data dictionary tables into queries that can retrieve the equivalent information from the non-Oracle data dictionary.
Heterogeneous Services initialization parameters serve two functions:
They give you a means of fine-tuning the gateway to optimize performance and memory utilization for the gateway and the Heterogeneous Services component.
They enable you to inform the gateway (and, thereby, Heterogeneous Services) how the non-Oracle system was configured (for example, in what language the non-Oracle system is running). They give information to Heterogeneous Services about the configurable properties of the non-Oracle system.
You can examine the Heterogeneous Services initialization parameters for a session by querying the view
V$HS_PARAMETER. Users can set initialization parameters in gateway initialization files.
Capabilities tell Heterogeneous Services about the limitations of the non-Oracle system (such as what types of SQL statements are supported) and how to map Oracle data types and SQL expressions to their non-Oracle system equivalents. In other words, they tell Heterogeneous Services about the non-configurable properties of the non-Oracle system. Capabilities cannot be changed by the user.
Configuration information is uploaded from an agent to the Heterogeneous Services component immediately after the connection to the agent is established. The configuration information is stored in Heterogeneous Services data dictionary tables. No further uploading occurs until something at the agent changes (for example, if a patch is applied or if the agent is upgraded to a new version).
The following sections describe:
Classes and Instances
Data Dictionary Views
Using Heterogeneous Services, you can access several non-Oracle systems from a single Oracle database. This is illustrated in Figure 2-2, which shows two non-Oracle systems being accessed.
Both agents upload configuration information, which is stored as part of the Heterogeneous Services data dictionary information on Oracle Database.
Although it is possible to store data dictionary information at one level of granularity by having completely separate definitions in the Heterogeneous Services data dictionary for each individual instance, this can lead to an unnecessarily large amount of redundant data dictionary information. To avoid this, Oracle organizes the Heterogeneous Services data dictionary by two levels of granularity, called class and instance.
A class pertains to a specific type of non-Oracle system. For example, you may want to access the class of Sybase database systems with Oracle Database. An instance defines specializations within a class. For example, you may want to access several separate instances within a Sybase database system. Each class definition (one level of granularity) is shared by all the particular instances (a second level of granularity) under that class. Further, instance information takes precedence over class information, and class information takes precedence over server-supplied defaults.
For example, suppose that Oracle Database accesses three instances of Sybase and two instances of Ingres II. Sybase and Ingres II each have their own code, requiring separate class definitions for Oracle Database to access them. The Heterogeneous Services data dictionary therefore would contain two class definitions, one for Sybase and one for Ingres II, with five instance definitions, one for each instance being accessed by Oracle Database.
Note that instance-level capability and data dictionary information are session-specific and are not stored in the Heterogeneous Services data dictionary of Oracle Database. However, instance-level initialization parameters can be stored in the database.
The Heterogeneous Services data dictionary views contain the following kinds of information:
Names of instances and classes uploaded into the Oracle data dictionary
Capabilities, including SQL translations, defined for each class or instance
Data Dictionary translations defined for each class or instance
Initialization parameters defined for each class or instance
You can access information from the Oracle data dictionary by using fixed views. The views are categorized into three main types:
Figure 2-3 shows a typical gateway process flow. The steps explain the sequence of events that occur when a client application queries the non-Oracle database system database through the gateway.
The client application sends a query using Oracle Net to Oracle Database.
Heterogeneous Services and the gateway converts the SQL statement into a SQL statement understood by the non-Oracle database system.
Oracle Database sends the query to the gateway using Oracle Net.
For the first transaction in a session, the gateway logs in to non-Oracle database system using a user name and password that is valid in the non-Oracle system.
The gateway retrieves data using non-Oracle database system SQL statements.
The gateway converts retrieved data into a format compatible with Oracle Database.
The gateway returns query results to Oracle Database, again using Oracle Net Services.
Oracle Database passes the query results to the client application using Oracle Net. The database link remains open until the gateway session is finished, or the database link is explicitly closed.
This guide describes Oracle's approach for information integration in a heterogeneous environment. Specifically, it describes Oracle Database gateways.
This preface contains these topics:
Documentation Accessibility
This guide is intended for the following users:
Database administrators who want to manage distributed database systems that involve Oracle to non-Oracle database links
Application developers who want to use the heterogeneous connectivity functionality in Oracle database
Readers who want a high-level understanding of Oracle's architecture for heterogeneous connectivity and how it works
To use this guide, you must be familiar with relational database concepts and basic database or applications administration. You must be familiar with the operating system environment under which database administrators are running Oracle software.
Our goal is to make Oracle products, services, and supporting documentation accessible to all users, including users that are disabled. To that end, our documentation includes features that make information available to users of assistive technology. This documentation is available in HTML format, and contains markup to facilitate access by the disabled community. Accessibility standards will continue to evolve over time, and Oracle is actively engaged with other market-leading technology vendors to address technical obstacles so that our documentation can be accessible to all of our customers. For more information, visit the Oracle Accessibility Program Web site at
Accessibility of Code Examples in Documentation
Screen readers may not always correctly read the code examples in this document. The conventions for writing code require that closing braces should appear on an otherwise empty line; however, some screen readers may not always read a line of text that consists solely of a bracket or brace.
Accessibility of Links to External Web Sites in Documentation
This documentation may contain links to Web sites of other companies or organizations that Oracle does not own or control. Oracle neither evaluates nor makes any representations regarding the accessibility of these Web sites.
Deaf/Hard of Hearing Access to Oracle Support Services
To reach Oracle Support Services, use a telecommunications relay service (TRS) to call Oracle Support at 1.800.223.1711. An Oracle Support Services engineer will handle technical issues and provide customer support according to the Oracle service request process. Information about TRS is available at
http://www.fcc.gov/cgb/consumerfacts/trs.html, and a list of phone numbers is available at
For more information, see the following:
Many of the examples in this guide use the sample schemas, which are installed by default when you select the Basic Installation option with an Oracle Database installation. See Oracle Database Sample Schemas for information about how these schemas were created and how to use them.
The following text conventions are used in this document:
|Boldface type indicates graphical user interface elements associated with an action, or terms defined in text or the glossary.
|Italic type indicates book titles, emphasis, or placeholder variables for which you supply particular values.
|Monospace type indicates commands within a paragraph, URLs, code in examples, text that appears on the screen, or text that you enter.
This section describes new features of the Oracle Database 11g Release 2 (11.2) and provides pointers to additional information. New features information from previous releases is retained to help those users migrating to the current release.
The following sections describe the new features in Oracle Database Heterogeneous Connectivity User's Guide:
New features for Oracle Database 11g Release 2 (11.2) in the Oracle Database Heterogeneous Connectivity User's Guide include:
CHAR Semantics
This feature allows any HS-based gateway to optionally run in
CHAR Semantics mode. Rather than always describing non-Oracle database columns as
BYTE), this new feature describes them as
CHAR) and
CHAR). The concept is similar to Oracle Database
CHAR Semantics.
Multi-byte character sets ratio suppression
This feature optionally suppresses the ratio expansion from the non-Oracle database involving multi-byte character set (for example, from
US7ASCII to
AL32UTF8, or from
KO16MSWIN949 to
KO16KSC5601). By default, Oracle Gateways assume the worst ratio to prevent data being truncated or insufficient buffer size situation.
This release fully supports IPv6 between Oracle Database and Oracle Database gateways. For some gateways, IPv6 is also supported between Oracle Database gateways and the non-Oracle targets.
Gateway IDLE timeout
This release allows some Gateways to specify a session idle timeout limit. When a gateway session is idle for more than the specified time limit, the gateway session is terminated automatically with any pending update rolled back (if the gateway has the proper rollback capability).
See Also:For additional information, consult the Oracle documentation for that specific gateway
New features for Oracle Database 11g Release 1 (11.1) in the Oracle Database Heterogeneous Connectivity User's Guide include:
Parallel data retrieval
The Heterogeneous Services agent architecture was enhanced for parallel data retrieval from remote non-Oracle databases. With this feature, gateway customers experience improved elapsed time for data retrieval and load.
This feature includes the new
DBMS_HS_PARALLEL package. Four new procedures are introduced with this package:
This procedure loads the data from a remote table to a local Oracle table in parallel. If the local Oracle table does not already exist, it is created automatically.
This procedure writes out a
CREATE TABLE template based on information gathered from the remote table. You can use the information to add any optimal Oracle
CREATE TABLE clauses.
This procedure creates (or replaces) a read-only view to be referenced for retrieving the data from a remote table in parallel.
This procedure drops the view and internal objects created by the
CREATE_OR_REPLACE_VIEW procedure. If the view has not already been created by the
CREATE_OR_REPLACE_VIEW procedure, an error message is returned.
Optimizer interface improvements
The statistics interface of Heterogeneous Services was enhanced to enable the Oracle optimizer to derive an equivalent execution plan for distributed SQL when dealing with a remote Oracle database and the agent. With this feature, customers experience similar or better elapsed time for distributed SQL across the gateways.
Heterogeneous Connectivity User's Guide
11g Release 2 (11.2)
Heterogeneous Connectivity User's Guide
11g Release 2 (11.2)


text:
Remember Me
Forgot your password?
Become a CBA Member
6/29/2015NEW-Presidential Fellowship Program
6/5/2015YLS Hosts Youth Law Academy
5/21/2015YLS Awarded Grant from ABA Young Lawyer's Division
7/7/2015SRP150707-Real Property Certification Examining Committee Meeting
7/22/2015ELE150722-The ADA at 25: A Celebration
9/11/2015EWC150911-Workers' Compensation Medical CLE
9/19/2015EDU150919 Trial Practice Bootcamp with UCONN Law Foundation
9/22/2015EDU150922 Back to Practice: Bruce Blackwell on Opportunities for Return
Sections and committees are the lifeblood of the CBA. Whether you're looking to network with fellow CBA members or colleagues, keep current in your practice area, or impact policy and legislation, sections and committees serve as your vehicle to success in your practice of law.
The CBA has 42 substantive sections you can join or more than 39 committees that you can be appointed to.
30 Bank Street
New Britain, CT 06050
Directions to the CBA
Phone: (860)223-4400
Fax: (860)223-4488
E-mail: email@example.com

subset: commoncrawl


text:
Oscar W. Lofton
Position: E
Height: 6-6 Weight: 218 lbs.
Born: April 2, 1938 in McCall Creek, MS
High School: Istrouma
College: SE Louisiana
Weighted Career AV (100-95-...): 4 (9744th overall since 1950)
Sponsor this page for $5 and help Pro-Football-Reference.com provide this service. Your message will replace this ad.
Output includes all games from 1920 to 2014.


text:
UT letter reprimands band director over 'battle' with athletics; Sousa put on paid leave
KNOXVILLE — Gary Sousa, the University of Tennessee's longtime director of bands who spoke out last week against what he saw as the encroachment of marketing and athletics on game-day band functions, is on administrative leave for the rest of this semester.
UT announced Sousa's paid leave Monday afternoon in a release that alluded to "insubordination, misrepresentation of facts and a lack of confidence in Sousa's ability to work constructively and collaboratively with others going forward. The administrative leave is pending a full review."
Interim director will be Don Ryder.
Sousa is a tenured faculty member.
As part of his duties, Sousa led the Pride of the Southland Band, whose members last week objected to what they saw as a decreasing role of the band at home and away football games. A communication last week from the band said it had been in a "bitter battle" with athletics department head Dave Hart.
UT last week termed as "disrespectful to the chancellor and the athletic director" efforts by Sousa and band members to go public with their criticism.
In a letter dated Monday, Chancellor Jimmy Cheek said Sousa had acted unprofessionally.
"...your media statements demanding my involvement, implying that my failure to do so would suggest I am not an advocate of the band, or an effective leader more generally are counterproductive," the letter states.
"You will not earn my support through threats, petulance, public disruption, or whining. You are a professional band director and a tenured faculty member; please act like it.
"I have copied the administrators in your supervisory reporting line -Dr. pappas, Dr. Lee, and Dr. Martin. In turn, I expect them to hold you accountable for the unprofessional and disruptive hysteria you have fomented in the past week. lf you raise your concerns through the proper channels, in a professional manner, you can rest assured that your concerns will be heard."
Drum major Jessica Henderson said students could not comment. Efforts to talk Monday with band members after practice were unsuccessful.
Cheek, in Monday's release, said, "We fully support the Pride of the Southland Band. We want every student musician to have a great experience and enjoy being part of a wonderful and cherished tradition."
In the UT release, the university said Sousa had promoted "misleading claims to alumni and band members" that created a "divisive and counterproductive environment."
"Sousa encouraged students and alumni to speak out against the Athletics Department over reduced playing time and reductions in travel and budget. This followed the UT vs. Georgia game in which the band played significantly more than in this year's previous home games."
Sousa has been director of bands since 1997. Ryder has been with the university 14 years and is director of the UT Symphonic Band.
More details as they develop online and in Tuesday's News Sentinel.
Related documents:
Letter from Jimmy Cheek to Gary Sousa
Subscribe to the News Sentinel
Need Help?
Call us at 1-877-304-7769.
Monday – Friday: 7 a.m. – 3 p.m. / Saturday & Sunday: 7 a.m. – 11 a.m.


text:
Cleveland's Local Gem: Urban Farming http://t.co/ETUfs00p @lnchhouse #Cleveland #Sustainability #LocalFood...
Scooped by
Alan Yoshioka
onto Vertical Farm - Food Factory
Get Started for FREE
Sign up with Facebook Sign up with Twitter
I don't have a Facebook or a Twitter account
Your new post is loading...
Your new post is loading...
Jerome Peloquin's curator insight, July 2, 12:21 PM
I think this is Vertigrow and if it is ... I believe they are out of business
Jerome Peloquin's curator insight, July 2, 12:28 PM
Aquaponics makes the case for the only real sustainable farming method available ...much more that traditional organic, much more even than Hydroponic ... and it produces both protein and vegetables. An aquaponic farm makes the perfect backdrop for a sustainable food experience.
Jerome Peloquin's curator insight, July 2, 12:24 PM
Cargil owns a number of great salt mines that would be excellent for this growing. Also, many urban areas have underground spaces that could accommodate a vertical strategy. Wonderful thermally stable, bio secure, and easily isolated from persts, etc.


text:
All hotels in Perrysburg, Ohio, United States of America
1 room, 2 adults
3484 Hanley Road, Perrysburg, OH, 43551, United States of America, 800-491-6126
Regency Inn
Lowest price$55
available on 07/06/15
Best Price Guarantee
Perrysburg motel in city center
- Free breakfast, free WiFi, and free parking
Main amenities
- 44 guestrooms
- Air conditioning
- Daily housekeeping
- Meeting room
- Picnic area
What's around
- Heart of Perrysburg
- Toledo Museum of Art (13.6 mi / 21.9 km)
- Toledo Zoo (15.3 mi / 24.6 km)
Out dated room furnishings, structure in need of repair.
Needs a stronger internet connection. Weak signal detracts from otherwise exceptional…
TripAdvisor Traveller Rating: 3.5
From 20 reviews
Enter dates to check prices
Hotel Info: 866-539-8117from $55
- Two double beds non smoking
- One king bed non smoking
Recommended hotels
At a glance
Key facts
Hotel size
- This hotel has 44 rooms
- This hotel is arranged over 2 floors
- Check-in time starts at 3 PM
- Check-out time is 11 AM
- Express check-out
Required at check in
- Credit card or cash deposit required
- Government-issued photo ID required
- Minimum check-in age is 21
Travelling with others
- Up to 2 children (11 years old and younger) stay free when occupying the parent or guardian's room, using existing bedding
- No cribs (infant beds)
- Pets not allowed
- Free WiFi in public areas
- Free WiFi in rooms
- Free self parking
- Accessible parking
In the hotel
Food and drink
- Free breakfast
Working away
- One meeting room
- Picnic area
- Disabled parking
- Braille or raised signage
In the room
Home comforts
- Air conditioning
- Coffee/tea maker
- Iron/ironing board
Freshen up
- Private bathroom
- Bathtub or shower
- Hair dryer (on request)
Be entertained
- Cable TV channels
Stay connected
- Free WiFi
- Free local calls
- Daily housekeeping
Regency Inn's small print
Also known as
- Regency Inn Perrysburg
- Regency Perrysburg
Optional extras
Onsite credit card charges are subject to an extra charge
Late check-out can be arranged for an extra charge of USD 15.00
We have included all charges provided to us by this hotel. However, charges can vary, for example, based on length of stay or the room you book.


text:
Rubicon Minerals Corporation is a Canada-based mineral exploration-stage company that explores for commercially viable gold and base metal deposits. The CompanyMore
$10 mil. - $25 mil.in Revenue
50 - 100EmployeesContact people at this company
advanced-stage goldMore
MiningMetals & MiningMetals & MineralsMore
Suite 1540-800 West Pender StreetVancouverBritish ColumbiaV6C 2V6Canadaview map
(604) 623-3333(604) 623-3355Fax
Pro2015_Iteration7.58[01] SEIDXWK-27


text:
Below are top resources on SparkPeople for Dried Bilberry.
It's easy to ignore your skin when it's doing its job right. For most people, basic washing and a little sunscreen is all they need. But when you have a problem with your skin, it can be all-consuming. Acne can break your self-confidence,... Read more
If you've ever scratched your arm or leg and left a trail of white flakes (who hasn't?), then you've seen the effects of dry skin. While uncomfortable, dry skin usually isn't "serious," but it can make a formerly-smooth... Read more
Wake up your taste buds! Cooking with herbs and spices will enhance the flavor of healthy foods without adding fat, salt, sugar, or calories. Herbs and spices contribute bright color, savory taste and sensational aroma.
Tips for using herbs and... Read more
Winter is here, and for many people that means dry, flaky and cracked skin. Many skincare experts advise switching to more moisturizing hair and skincare products during the blustery months to avoid these problems. But before you invest in high-price... Read more
It's 10 a.m., and your stomach starts that familiar growl, so you're tempted to grab a snack. Trouble is, those hunger pangs tend to come at a time when you're busy, so you're likely to absentmindedly reach for something quick... Read more
Craved chips; had dry roasted no salt almond instead!... Read more
Monistat also has an anti-chafing gel that dries like a powder... Read more
Need help. When serving size is 1/4 cup dry (i.e.rice) how do I convert that to amount when cooked?... Read more
You could use window chalk or dry erase marker to write positive messages on your mirrors. Something like: THIS CHICK IS AWESOME, and draw arrows pointing inward toward where your face would be when you look in the mirror.... Read more
I usually air dry my good clothes. Now that I lost a lil weight, should I start machine drying them to have them shrink? Or should I go all out shopping for new summer work clothes? Money is a lil tight for me right now....... Read more
Love dried tomatoes so when they become cheap buy & dry them & make my own sun dried tomatoes. That way I know what's in them... Read more
Polish chrome - Mineral deposits on chrome faucets & other tarnished chrome make haste in the presence of lemon--rub with a squeezed lemon half, rinse, and lightly buff with a soft cloth.Polish copper - A halved lemon dipped in salt or baking powder... Read more
This is a place for those who love home canning, freezing and drying foods from our own gardens , orchards, and local farm markets while Exercising and Eating Healthy !... Read more
The edible seeds of legumes like dry beans, dry peas, chickpeas, and lentils are called pulses, a name derived from the Latin word puls which means thick soup or potage. Pulses are very popular in Mexican, Middle Eastern, or East Indian cuisine and p... Read more
It's summer, and that means fruit trees, bushes, and berry plants are exploding with a bountiful harvest. A healthy goal is to eat a variety of these local and fresh fruits. If we fast forward to fall, the taste of sweet, j... Read more


text:
Marketing Attribution
Marketing, It's ComplicatedDecember 17, 2014
Three quarters of digital marketers say their job has become more complicated. The other 25% must be whiz kids.
Mobile Attribution Is a Work in ProgressJuly 21, 2014
Marketers discuss the daunting task of—and potential solutions for—tracing sales back to mobile campaigns.
Four Strategies for Lead GenerationMarch 10, 2014
Marketers from Publishers Clearing House and Dormeo discuss the importance of a call-to-action, rethinking cost per lead, and why multichannel is a must.
Latest Jobs:
Company of the Week
SK&A is a leading provider of U.S. healthcare information solutions and databases. As part of IMS Health, SK&A researches and maintains contact and profiling data for over 2 million healthcare providers, including 800,000+ prescribers. SK&A's data supports research and marketing initiatives for life sciences, medical device, managed healthcare, direct marketing, publishing, education and more. SK&A's proprietary databases are telephone-verified twice per year from its world class Research Centers. SK&A enables multi-channel marketing and sets the standard for data quality and reliability. SK&A's customers include many of America's most recognized healthcare, publishing and pharmaceutical institutions.
Featured Listings
SK&A is a leading provider of U.S. healthcare information solutions and databases. As ...


text:
50 magis puppy 41 magispuppy modern 40 dogshow auction event charity bestinshow contest party midcentury 7 design 5 eeroaarnio 3 dog blackandwhite inspiration boffurniture education library bright puppystool furniture school colour
47 magis,puppy 40 midcentury,puppy event,modern contest,midcentury event,midcentury bestinshow,modern dogshow,magis contest,magis party,puppy magispuppy,modern contest,event
Mod Livin' 40 bof_furniture Daniel_isBORED Tom Ridoux Pinjacolada zhazha0601 ella+elliot | Toronto | Vancouver KMR's suburban adventure minibergh unjenesaisquoideco
Flickr Hive Mind is a data mining tool for the Flickr database of photography. Flickr Hive Mind is a search engine as well as an experiment in the power of Folksonomies. All thumbnail images come directly
from Flickr, none are stored on Flickr Hive Mind. These photos
are bound by the copyright and license of their owners, the thumbnail links take to you to the photos
(as well as their copyright and license details) within Flickr. Because some other search engines (Google, etc.) index parts of
Flickr Hive Mind, you may have been led here from one of them. Welcome to Flickr Hive Mind, almost certainly the best search engine for photography on the web. If you are a Flickr
user and use Flickr Stats you
may have seen people being led to your photos via Flickr Hive Mind (as a Referrer).
Flickr requires that I inform you that Flickr Hive Mind uses the Flickr API, but is neither endorsed nor certified by them.
There are literally hundreds of other web tools built around the Flickr API, see
Flickr Bits for a bunch of examples.
If you are unhappy with your photos' presence on this site, you can (a)
make your photos private for yourself, friends, and family. These settings will be instantly honored by
Flickr Hive Mind and all other API-driven applications. (b) Hide your photos globally from text and tag searches on 3rd party sites that use the Flickr API, via your preference settings on Flickr. See the privacy tab at:
http://flickr.com/account/. To also remove yourself from searches for specific user names, you will need to set your Flickr profile to be hidden from searches. Flickr has finally created a single page with all these settings, this is much easier to do now and is the preferred method - it will shut down all API driven sites.
(c) Finally, you can
Banish Yourself
From Flickr Hive Mind. To banish yourself from Flickr Hive Mind, you must first authenticate to Flickr, which lets Flickr Hive Mind identify who you are. Once logged in, come back to this area
and there will be a link to banish you. If there are any problems email me at nosflickrhivemind ... at ... fiveprime ... dot ... org. (a few people with weird characters in their user names may have had problems)Log In To Flickr Now
Flickr Hive Mind is a data mining tool for the Flickr photography database, allowing search by: tags(keywords); Flickr photography groups; Flickr users, their contacts, and favorites; free text; the Flickr Explore algorithm for interestingness. Flickr Hive Mind can also be an effective tool to identify photography with licenses that allow non-commercial (and sometimes) commercial use. Written by:
Nathan Siemers.
Inspired by (and thanks to) Flickr Leech.
Dedicated to
Anna and her Flickritis.
If you find your login does not work, perhaps your browser has disabled the cookies that I use to track your session. Try telling your browser to accept them.
Flickr Hive Mind stores no
personal information nor photos,
but some general time and IP address information ends up in my apache server logs. For additional details see the privacy policy.
Any revenue generated through advertisement on this site is used only to cover the cost of keeping the site online, beyond that Fiveprime donates to charitable organizations (also, there are no ads on User pages). Flickr Hive Mind is currently consuming about 13.6 terabytes of network bandwidth per year (not including the photos themselves)!


text:
List Price:
See all shipping options
In Stock Online
- Usually …
ships within 1-2 Days
learn more
Our Price
The quantity discount will be reflected in your shopping cart
The Kino Flo ParaZip 400 Ship Case is a heavy duty reinforced wheeled case that holds the ParaZip 4-tube fluorescent fixture, cables and accessories.
Get exclusive access to expert tips, special offers and coupons.
42 West 18th Street New York, NY10011
© 2015 Adorama Camera, Inc. All rights reserved.
Encountered problems with this site? Contact the webmaster


text:
MLB Playoffs 2008
Print without images
Thursday, October 23, 2008
Updated: October 24, 9:23 PM ET
What if Beltran had swung the bat?
By Mark Simon
Carlos Beltran's strikeout against Adam Wainwright was only his third in 27 at-bats in the NLCS.
What happened:
Adam Wainwright threw "the best curveball of my life" and caught Carlos Beltran looking with the bases loaded for the final out of the series. The Cardinals won the game 3-1 and the series 4-3, then went on to upset the Tigers in the World Series.
But what if
Beltran had swung?
The newly released bestselling book "First Swing of the Mets Dynasty" tells the story of the game that launched the Mets into baseball supremacy, and the hanging curveball that Carlos Beltran crushed for a three-run walk-off double, putting the Mets into the World Series.
It tells how the 2007 Mets lived up to the accomplishments of the previous year's World Series sweep of the Tigers, edging out the Phillies for the division title with a strong performance in the season's final days. It has an inside look at the 2008 run to the postseason, in which the Mets again came through in the season's final days to claim a division title.
Your Turn
If Beltran had swung the bat, how would things have turned out differently?
Share your alternative ending
Everyone lamented how the rich got richer when the Mets, coming off their two titles, properly positioned themselves for Johan Santana, who won the NLCS MVP in his first season with the team. Santana's devastating changeup made the biggest difference in series wins over the Brewers and Dodgers.
It tells how Hank Steinbrenner fumed for days after the conclusion of the 2008 season. "The Mets got all the breaks, and now they think they've taken over this town!"
And it shares that Phillies shortstop Jimmy Rollins, bitter at the disappointment that came with two straight seasons of near misses, requested he be traded just prior to the start of the Mets' third straight World Series appearance. "I have to admit it," he finally acknowledged. "They're the team to beat."


text:
Top Definition
When one takes a sweater or shirt, turns it upside down and wears it as pants. Legs go through the arm holes. Sewing up the neck hole is optional.
She took that old sweater and turned it in to sweet skants!
بواسطة McQuaids مارس 17, 2010
9 more definitions
Skant is a skank (prostitute) that can't get anything.
Look at that skant working the corner.
بواسطة Amanda ابريل 9, 2005
I new and horrifying "trend" of wearing a shirt as pants. A model was actually pictured wearing a skant in ZINK magazine.
When you're tired of putting your arms into your sweaters' sleeves, try putting your legs in instead- and you've got a skant!
بواسطة Bluedemon فبراير 25, 2011
A short and sweeter way of saying 'sick cunt' to your boys/ mates/ bros
Boy 1: fuck check out that guys muzz its a mad gee up!
Boy 2: yeah whatta skant!!
Boy 2: yeah whatta skant!!
بواسطة Jaznn Le ديسمبر 27, 2014
when you get your trousers pulled down
shame, u got skanted!!!!
بواسطة xxbeckyxx يوليو 5, 2005
Someone who has characteristics of a meth abuser
Damn all skant with that scar on you face
بواسطة John Mercurio مايو 12, 2008
The wearing of pants (most commonly jeans) underneath a skirt as to avoid revealing underwear during flareups. Commonly seen casualwear of dancers.
Them skants hide all the booty, sugar, why don't you give a brotha some love?!
بواسطة tornredcarpet فبراير 24, 2008


text:
Matt Kemp - Wednesday February 5, 2014; Celebs out at the Clippers-Heat game. The Miami Heat defeated the Los Angeles Clippers by the final score of 116-112 at Staples Center in downtown Los Angeles, CA. - Los Angeles, California, United States - Wednesday 5th February 2014
This hilarious black comedy details the antics of an accidental serial killer portrayed by Robert Carlyle.
Sarah Jessica Parker is still apologising to anger fans for posting an Instagram picture which fuelled 'Sex and the City 3' rumours.
With their debut studio album 'The Way Back Up' set to drop this week on July 10th 2015 through Island Records.
A number of Bobbi Kristina Brown's relatives have been banned from visiting her in hospice.
Former actress Amanda Peterson has died at the age of 43.
Katy Perry and John Mayer were spotted together at The Grateful Dead's farewell shows this weekend.
Ciara and Russell Wilson are dating but there's been absolutely no funny business.


text:
Dear Sierran,
Isn't Governor Jerry Brown an environmentalist?
That question, or some version of it, has come to me at various times over the last 20 months from Club members around the state. It typically comes with a tone of incredulity after the governor has said or done something that seems counter to what members expected when they voted for him.
In recent months, the inquiries have been a bit more frequent and the question has been bandied about more often among environmental lobbyists working in the State Capitol.
Why now?
Governor Brown has been especially busy going on the offensive against environmental causes lately. His targets have ranged from the San Joaquin-Sacramento River Delta (big tunnels at huge costs to the environment) to the California Environmental Quality Act (big failed push to weaken it).
In a single recent day, Brown touted fracking as a fabulous opportunity and announced he would "borrow" $500 million for the general fund from money specifically raised to reduce climate disrupting pollution. His administration followed that just days later with the news that it had worked out a deal that we fear gives anti-environment politicians in Nevada too much control over the fate of Lake Tahoe.
So, isn't Governor Brown an environmentalist?
The question makes me think about how the biggest gains for the environment in this state have been won. None was initiated by a governor.
The California Coastal Act, which ensures that beaches along the length of the state are accessible to all Californians, was the product of a combination of legislation and a ballot initiative pushed by stalwart environmentalists, including Club members, who to this day continue to advocate for the coast.
Governor Brown's earlier attempt to build a canal around the delta to move more water from Northern California to Southern California, potentially depriving the delta ecosystem of the flows it needs, was defeated on a statewide ballot in 1982 by a coalition that included environmentalists and delta farmers.
The first tailpipe pollution standard addressing climate disrupting pollutants came about from legislation first proposed by a couple of small environmental organizations and carried by a relatively new legislator. Until just before the legislature delivered the bill to then-Governor Gray Davis's desk, there was no certainty he would sign it.
These are just a few examples. But they prove a point: The biggest gains in California's environmental policies have been initiated by a few smart people outside the Governor's office, and carried to the finish line by a lot of smart people, including voters, who worked hard and believed to their core that California's unique environment is worth protecting.
Occasionally, a governor had to be persuaded to sign a bill or take an action to get the cause over the finish line. But by then it was the only clear choice he had.
I don't know if Governor Brown is an environmentalist. I do know, though, that if we are to keep making environmental progress in this state, it will be because Californians--including Club members--haven't let one guy in one job discourage them from getting clean air, clean water, healthy forests, a thriving delta, and a Lake Tahoe free of pollution.
Kathryn Phillips, Director
Sierra Club California
Sierra Club California is the Sacramento-based legislative and regulatory advocacy arm of the 13 California chapters of the Sierra Club.


text:
My wife and I stayed here one night on way to safari camps. Nice place, decent room, nice grounds with pool. Dinner only OK (below safari camp quality). Breakfast good. Didn't need staff, but don't remember them. No cocktail hour or particular ambiance. We were only people staying there, so maybe that was a factor.
- Reservation Options:
- TripAdvisor is proud to partner with Expedia, Hotels.com, Booking.com, Travelocity and Odigeo so you can book your House of Waine reservations with confidence. We help millions of travelers each month to find the perfect hotel for both vacation and business trips, always with the best discounts and special offers.
- Also Known As:
- House Of Waine Hotel Nairobi
- Hotel Of Waine
- Of Waine Hotel


text:
Thermax CP5, DV12 Carpet Cleaning Wand & Floor Tool, Part 29-771-00
Item Code: 29-771-00
Brand: Thermax
Availability: In stock
This is a carpet cleaning wand and floor tool meant to fit the Thermax CP-5, and the DV-12 carpet extractors. Convenient egronomic handle allows comfortable use of the machine, and the metal wands and floor tool are built to last for years, even in the most extreme environments. Genuine Thermax Part 29-771-00.
Rating: (0 Review)


text:
1935 Ford Pickup If you are interested in this truck or have any questions, please call Dean at 208-989-8005 The truck drives great as it is or... More
Two tops, power steering, power brakes, power seat, power windows, A/C. Nice paint, interior and chrome. Frame-on restoration in early 2000s. This Thunderbird is not... More
DAILY DRIVER, V8, RUST FREE CLASSIC! This is a sweet South Georgia truck with good body, rust free on top and underneath. Strong engine... More
Additional information coming soon!... More
Additional information coming soon!... More
Up for sale in our Tampa Showroom is a very iconic pony car the 2008 Ford Mustang GT Bullitt. Made famous from the 1968... More
Up for sale in our Tampa Showroom is the return of the legend the 2007 Shelby GT500 Super Snake. 40 years after its original... More
For sale in our Chicago showroom is a 1970 Ford Mustang Convertible. The 1970 Ford Mustangs received a less aggressive style and went back... More
This 1931 Ford Roadster Pick Up is located in our Louisville KY showroom. This one of a kind built from scratch roadster is... More
For sale in our Chicago showroom is a 1957 Ford Custom 70D 2-Door Business Sedan. This unique vehicle has undergone a full frame-on... More
This desirable 1940 Ford Deluxe convertible really has the look, but is also a reliable cruiser you can drive all night. This car came... More
Ford F-800 dump, 38K original miles, gas V8, 5/2, 25500 GVW, air brakes, runs, drives, stops and dumps great.$3,500 Cold Springs Farm, 717-259-0187 East Berlin,PA... More
1934 Ford 4 Door Sedan Street Rod 350 CID Chevy Small Black V-8 Lots of Chrome and Polished Parts All Steel Ford Body Vintage A/C and Heat Power Steering... More
1930 Ford Model A Deluxe Roadster For Sale or Trade Lovely Model A roadster that drives well and was meticulously restored and preserved by long-time... More
1973 Ford Mustang Convertible For Sale or Trade Red Pony convertible, with original black vinyl interior and black convertible top in good condition. Mechanically sound... More