DBD-Teradata

 view release on metacpan or  search on metacpan

doc/tdatdbd.html  view on Meta::CPAN

most other general purpose DLLs reside, it keeps the *.lib and header files
in its own installation directory path. E.g., if you installed
the Teradata Client software to <code>C:\Program Files\NCR\Teradata Client</code>,
then the *.lib files will be located in
<code>C:\Program Files\NCR\Teradata Client\cli\lib</code>, and the header files
in <code>C:\Program Files\NCR\Teradata Client\cli\inc</code>. To successfully
build DBD::Teradata::Cli, you'll need to make sure that
the &lt;install-path&gt;\cli\inc directory has been added to your
INCLUDE environment variable. In addition, you'll need
to create a new environment variable TDAT_DBD_CLI_LIB set to
the &lt;install-path&gt;\cli\lib directory prior to nmake'ing
DBD::Teradat::Cli. Most importantly,
<b>IF YOUR TERADATA CLIENT INSTALL PATH CONTAINS SPACES,
TDAT_DBD_CLI_LIB MUST BE SET TO THE ABBREVIATED PATHNAME.</b>
You can determine that value using the "dir /X" command.
If TDAT_DBD_CLI_LIB is not set, DBD::Teradata::Cli will default
to 'C:\\PROGRA~1\\NCR\\TERADA~1\\cli\\lib' (the abbreviated
form of 'C:\Program Files\NCR\Teradata Client\cli\lib'.<p>

Also note that 'nmake' will generate various messages from the
Windows compiler/linker as it builds the
XS portion of DBD::Teradata::Cli. If header or library
files are not found during the compile/link, the install process
may fail.<p>

If you need to install DBD::Teradata::Cli on several platforms with
identical (or nearly identical) hardware, operating system,
and Perl versions, you can use PPM (available from
<a href='ftp://ftp.activestate.com/PPM/'>ActiveState</a>) to create an installable binary
distribution of DBD::Teradata::Cli, including the XS generated libraries,
on the build platform, and then install them via

<pre>
ppm install DBD-Teradata-Cli.ppd
</pre>

on other machines that do not have
a compiler installed. The process for building the
PPM is described at
<a target='_blank' href='http://aspn.activestate.com/ASPN/docs/ActivePerl/5.8/faq/ActivePerl-faq2.html#how_to_make_ppm_distribution'>Creating PPM Packages</a>
at the ActiveState website.<p>

<i><b>NOTE:</b> This process has not yet been tested by Presicient.</i><p>

<h3>DBD::Teradata::Cli Restrictions/Limitations</h3>

All the CLI operational considerations described in
<a target='_blank' href='http://www.info.ncr.com/Teradata/eTeradata-BrowseBy.cfm?page=Teradata%20Tools%20and%20Utilities'>
<i>"Teradata Call-Level Interface Version 2
Reference for Network-Attached Systems"</i></a> apply.<p>

Presicient recommends using the latest TTU 8.1 CLI libraries, regardless
of the version of Teradata server to which you will be connecting.<p>

CLI is *not* threadsafe on Unix platforms prior to TTU 8.0.<p>

There appears to be an issue with Linux and TTU 8.0 which causes
the CLI adapter to fail at initialization with an ICULOADERROR;
TTU 8.1 appears to function properly<p>

Rewindable cursors aren't supported, and updatable
cursors may have some issues with regard to updating the last
bufferful of a resultset. Both should be considered
unsupported at present.<p>

Double buffering is disabled in CLI mode, which may cause
some performance degradation for large result sets.<p>

The connection DSN must use a named server address, as CLI does not
support numeric IP address specification. Existing applications
which specified a fully qualified "COPn" hostname will be properly
modified by DBD::Teradata to trim the COPn suffix before passing the
hostname to CLI.<p>

Support for large request sizes appears to be limited to SQL sessions
(at least through V2R6.0.x), thus the <code>RequestSize</code>
parameter for <code>tdat_UtilitySetup()</code> is currently
ignored for CLI based connections.<p>

<a name="behavior"></a>
<h2>Usage Guide</h2><p>
<a name="dsn"></a>
<h3>Data-Source Name</h3><p>

The dsn string passed to <code>DBI-&gt;connect()</code> must be of the following form:<p>
<pre>
     dbi:Teradata:host[:port]
</pre><p>

where
<ul>
<li><b>host</b> is a TCP/IP address in human-readable or (<i>deprecated</i>) dotted-decimal format,
<li><b>port</b> is an optional TCP/IP port number to use (default is 1025,
the most common value)
</ul><p>
DBD::Teradata supports the random COPx selection
algorithm. Users are advised to set an environment variable that is assigned the maximum
COP number for the host, e.g., if the server TDAT has 4 gateway addresses, then
on Windows the variable would be set as

<pre>
set TDAT=4
</pre>

and on *nix
<pre>
export TDAT=4
</pre>
<p>

<a name="cst"></a>
<h3>Connections, Sessions And Transactions</h3><p>

Multiple connections to a Teradata database are supported.
Please note that
<ul>
<li>Applications using the <b>tdat_UtilitySetup</b> interface specify
the number of sessions to use as an attibute to that method.<p>
<li>DBI's current support for threading does <b>not</b> support
sharing connections between threads. Hence, if you intend to use
a connection in a thread, <b>the connection must be created in that
thread</b>. For example, rather than creating a connection pool
from which any thread can select a random connection, you must create
a thread pool, each with its own connection, and select a thread
as needed. However, you may find the <a target = '_blank' href='http://search.cpan.org/~darnold/DBIx-Threaded-0.10/lib/DBIx/Threaded.pm'>DBIx::Threaded</a>
module useful for passing connections amongst threads.<p>

<li>Various other factors may limit the number of connections which
may be established by an application (e.g., open file descriptor
count limits)<p>
</ul>
<p>
Connections may be made in either Teradata or ANSI mode. To specify the
desired mode, the <a href="#tdmode"><code><b>tdat_mode</b></code></a> attribute can be supplied
during <code>connect()</code>, set to either <code>'ANSI', 'TERADATA', or
'DEFAULT'</code>. If no mode is specified, or the mode is set to 'DEFAULT',
then the current DBMS default mode will be used.
Refer to the <a target = '_blank' href="http://www.info.ncr.com">Teradata SQL documents</a>
for all the differences between ANSI and Teradata behavior.<p>

RunStartup execution and session reconnection are not supported.<p>

Teradata account strings can be provided by simply appending a
single comma, followed by the single-quoted account string,
to the password string, e.g.,<br>
<pre>
     use DBI;
     my $dbh = DBI->connect(
          "dbi:Teradata:some.host.com",
          "user",
          "passwd,'\$H&Lmyaccount'")
          or die "Cannot connect\n";
     # more DBI calls...
</pre>


The following features are supported:<p>
<ul>
<li>Multiple open statements on a single connection
<li><a href="#cursors">Updatable cursors</a>
<li><a href="#sprocs">Stored procedures</a>
<li>transaction-spanning read-only cursors (via tdat_keepresp)
<li><a href="#dbccons">Remote Console</a> sessions
<li>Fastload
<li>EXPORT (<i>aka</i> Fastexport)
<li>MLOAD (<i>aka</i> Multiload)
<li>MONITOR (<i>aka</i> PM/API)
</ul>

In the event of unexpected session disconnection (e.g., network failure, or a session
that has been forced off the database), some platforms (notably UNIXen)
may receive a SIGPIPE signal. Currently, DBD::Teradata does not catch this signal,
and the application may die unexpectedly if it does not catch it.<p>

<a name="fastenc"></a>
<h4>Encrypted Logon Performance</h4><p>

In pure Perl mode, encrypted logons require complex Math::BigInt computations
which can take significant time (several seconds) to execute. While Math::BigInt
extensions exist which could significantly improve encryption performance,
there appear to be library incompatibilities which cause various spurious
failures, including failure of socket libraries, and sudden application exit
without any error indication. As an alternative, DBD::Teradata implements
a weaker form of encryption as the default behavior; however, stronger
encryption can be enforced by setting the <b><code>TDAT_DBD_SLOWNC</code></b>
environment variable to a nonzero value. Be advised that setting this flag
will add several seconds to logon times.
<p>

<a name="charsets"></a>
<h3>Connection Character Sets</h3><p>
DBD::Teradata provides UNICODE support
via the UTF8 character set. To use UNICODE, an application may explicitly
set the <a href="#charset"><code>tdat_charset</code></a> connection attribute
to 'UTF8' at <code>connect()</code>. If no character set is specified, then
the Teradata system default will be used, and can be determined by the application
after connection by referencing the <code>$dbh->{tdat_charset}</code> attribute,
or calling <code>$dbh->tdat_charSet()</code> driver specific method.<p>

The current connection character set can be queried using either the
<a href='#charsetfunc'><code>$dbh->tdat_CharSet()</code></a> or
<a href='#charsetfunc'><code>$sth->tdat_CharSet()</code></a> driver specific
methods. The returned values is the current character set string in
uppercase, usually either 'ASCII' or 'UTF8'.<p>
While DBD::Teradata will perform the neccesary translations internally,
application writers should be aware of the following when using UTF8:
<ul>
<li>Database object names are currently limited to LATIN1 (<i>aka</i> ASCII)<p>

<li>DBD::Teradata will process VARTEXT input/output in the same character set
as the current connection, for both normal and utility processing.<p>

<li>Utility connections generated by tdat_UtilitySetup use the same
character set as the "master" connection.<p>

<li>The PRECISION attribute for returned data specifies <b>the length in <i>bytes</i></b>
for CHAR and VARCHAR data types.<p>

<li>The precision specified for CHAR and VARCHAR in USING clauses is also the
<b>length in <i>bytes</i></b><p>

<li>Any PRECISION attribute supplied when binding CHAR or VARCHAR parameters

doc/tdatdbd.html  view on Meta::CPAN

<li>schmon
<li>showlocks
<li>sysinit
<li>rebuild
<li>tpccons
<li>updatespace
<li>vprocmanager
</ul></td></tr></table>
<p>
(Refer to the <i>Teradata RDBMS Utilities</i>, volumes 1 and 2, for details
on each of these utilities)<p>
To use these utilities via remote console, you must first configure your
DBMS to permit selective execution of the utility by<p>
<ol>
<li>Creating a CONSOLE database<p>
<li>Create a null MACRO within the CONSOLE database with the same name
as the utility you wish to run, and GRANT EXECUTE access to any users
you wish to have remote console access to the utility, e.g.,<p>
<pre>
CREATE MACRO CONSOLE.gtwglobal() (;);
GRANT EXECUTE ON CONSOLE.gtwglobal TO some_user;
</pre>
</ol><p>
Using the remote console capability requires some special programming
considerations. Most importantly, a new <b><code>Prompt</code></b> attribute
has been added to the <a href="#stmtinfo">tdat_stmt_info</a> statement attribute
structure which indicates whether the remote console protocol has solicited
user input. Refer to the TdTestConsole.pm test module included in the
DBD::Teradata bundle for an example.<p>

Note that several console utilities will output ANSI terminal
escape sequences, which may present an undesirable display behavior.
<p>

Finally, be aware that some console utilities operate in <b><i>full duplex</i></b>
mode, whereby they issue PROMPT parcels before they have completely
sent all of their output display data (a protocol artifact from
early support for serial line ANSI terminals). For console utilities
which provide such dynamic display updates, handling of input
requires <p>
<ul>
<li>using the non-blocking tdat_FirstAvailList and tdat_Realize driver
specific functions to execute and fetch on the console connection<p>
<li>aborting any outstanding request posted to the console session
prior to sending any prompted data to the console connection<p>
<li>properly keeping track of when a PROMPT has been received and is
outstanding<p>
</ul><p>
See the TdTestConsole.pm module included with DBD::Teradata bundle.
<p>
<a name="dblbuf"></a>
<h3>Double Buffering</h3><p>

Double buffering (i.e., issuing a CONTINUE to the DBMS while the
application is still fetching data from the last received set of rowdata)
is supported, and is the default behavior. However, once a session executes
a SELECT...FOR CURSOR statement, double buffering is disabled for <b>all</b>
queries in the session. Double buffering is <i>not</i> supported for CLI adapter
connections.

<a name="cursors"></a>
<h3>Using Updatable Cursors</h3><p>
<ul>
<li>Cursor syntax is only supported in ANSI mode (i.e., <code>tdat_mode => 'ANSI'</code> during connect).<p>

<li>To open a cursor for positioned operations,
the <code><b>FOR CURSOR</b></code> clause must be appended to the cursor
<code>SELECT</code> statement.<p>

<li>Cursor names are generated internally; <code>DECLARE CURSOR</code> syntax is <b>not</b> supported.
The internally generated cursor name can be retrieved via the <b>CursorName</b> statement handle
attribute.<p>

<li>To apply an update or delete at the current position for a cursor,
the <code><b>WHERE CURRENT OF $sth-&gt;{CursorName}</b></code> clause must
be appended to the UPDATE or DELETE statement.<p>

<li>All the restrictions of updatable cursors described in the SQL Preprocessor manual
also apply. Especially note that <b>commit or rollback will implicitly close all
updatable cursors, and all read-only cursors not prepared with the <a href="#keepresp">tdat_keepresp</a> attribute
enabled!</b><p>

<li>The current row of the cursor will be invalidated whenever a <code>DELETE...WHERE CURRENT</code>
is successfully executed on the cursor.
The cursor must be explicitly advanced via any of the <code>fetch()</code> functions before continuing
with positioned operations.<p>

<li>Remember to turn off AutoCommit mode when using updatable cursors!<p>

<li>Note that using updatable cursors may adversely impact performance of other
non-cursor queries concurrently or subsequently opened on the same connection, since
supporting positioned updates precludes the ability to double-buffer responses
(as described above).<p>

<li>Due to an apparent anomoly in the PREPARE of positioned statements by the DBMS, positioned
statements must be prepare()'d either<p>

<ol>
<li>before any updatable cursor statement is execute()'d<p>

<li>after the associated cursor statement has been execute()'d <b>and</b> fetch()'d<p>
</ol>
</ul>
<p>

A simple example:
<pre>
$cursth = $dbh-&gt;prepare('SELECT * FROM mytable WHERE col1 > 12345 FOR CURSOR');
$updsth = $dbh-&gt;prepare("UPDATE mytable SET col3 = 'Invalid' WHERE CURRENT OF $cursth->{CursorName}");
$cursth->execute;
while ($cursth->fetch) {
    $updsth->execute;
}
$dbh->commit;
</pre>
<p>


<a name="sprocs"></a>
<h3>Stored Procedures</h3><p>
<ul>
<li>A minimum Teradata Release V2R4.0 is required for stored procedure support.<p>

<li>DBD::Teradata supports large <code>CREATE/REPLACE PROCEDURE</code> statements
up to approx. 6 megabytes in length.<p>

<li>The statement level attributes <code>tdat_sp_save</code> and <code>tdat_sp_print</code>
are used to enable or disable saving of procedure text, and console PRINT statements,
respectively.<i>Note that Teradata has deprecated the PRINT statement as of V2R5.0.1, and
PRINT statements are now always ignored.</i><p>

<li><code>CREATE/REPLACE PROCEDURE</code> is a data-returning statement. Applications
should check the statement <code>Warning</code> attribute to determine if any
compilation errors occurred. In the event of compilation errors, the individual
errors are available in single column rows which can be retrieved by simply
<code>fetch</code>'ing on the statement handle and displaying the single column
of each row. E.g.,<p>
<pre>
$sth = $dbh->prepare(
'CREATE PROCEDURE DbiSPTest(IN Parent INTEGER, OUT Child INTEGER,
    INOUT Sibling integer, IN CommentString CHAR(20))
BEGIN
    Declare Level Integer;
    Set Level = Parent;
    DELETE FROM SPLTEST All;
    WHILE Level &lt; Parent + Sibling DO
        Insert into spltest values(:level, :CommentString);
        Set level = level + 1;
    END WHILE;
    Set Child = Level;
END;', { tdat_sp_save =&gt; 1 });
$sth-&gt;execute;
$stmtinfo = $sth-&gt;{tdat_stmt_info};
$stmthash = $$stmtinfo[1];
if ($$stmthash{Warning}) {
    print $$stmthash{Warning}, "\n";
    while ($row = $sth-&gt;fetchrow_arrayref) {
        print $$row[0], "\n";
    }
}
</pre>

doc/tdatdbd.html  view on Meta::CPAN

There are some additional attributes that the user can either supply to
various DBI calls, or query on database or statement handles:<p>

<a name="active"></a>
<h4>tdat_active</h4>
<i>Read-only on connection handle</i><br>
When non-zero, indicates the connection handle has results which need to be
"Realized". Refer to the discussion on <a href="#firstlist">tdat_First_AvailList</a>
for details. <i>Note that this is different than the DBI's 'Active' attribute.</i><p>

<a name="bufsize"></a>
<h4>tdat_bufsize</h4>
<i><b>Deprecated</b>; use <a href='#reqsize'>tdat_reqsize</a> and <a href='#respsize'>tdat_respsize</a> instead.<br>
Read/write on connection or statement handle; statement handle inherits default from parent connection.</i><br>
Specifies the maximum request and response buffer size in bytes. See <a href='#reqsize'>tdat_reqsize</a>
and <a href='#respsize'>tdat_respsize</a> for usage details.<p>

<a name="charset"></a>
<h4>tdat_charset</h4>
<i>Write on connect(), Read-only on connection handle</i><br>
Determines the connection character set. May be any of 'ASCII', 'UTF8', or 'EBCDIC'.
If not defined, the Teradata system default it used. Can be queried after
connection to determine the current connection character set.<p>

<a name="compatible"></a>
<h4>tdat_compatible</h4>
<i>Write-only connection or statement attribute.</i><br>
Used to establish a minimum version compatibility. When set to a driver version string,
e.g., tdat_compatible => '1.12', causes certain behaviors that may have changed since
that release level to be restored.
(<i>Currently only applies to result value of $sth->execute() and $dbh->do(), or the
optimization of $dbh->prepare() for non-data returning statements</i>).<p>

<a name="format"></a>
<h4>tdat_FORMAT</h4>
<i>Read-only on statement handle.</i><br>
Returns an arrayref of returned column format specification strings,
as specified by either FORMAT qualifiers in SELECT statements of various
DDL statements.<p>

<a name="formatted"></a>
<h4>tdat_formatted</h4>
<i>Statement handle attribute, set on prepare.</i><br>
When set to a non-zero value, causes result values to be returned in DBMS formatted form
(i.e., uses FIELD mode instead of record mode requests). Only effective on DBC/SQL sessions.<p>

<a name="hostid"></a>
<h4>tdat_hostid</h4>
<i>Read-only on connection handle</i><br>
Returns the host group ID to which the session has been connected.<p>

<a name="keepresp"></a>
<h4>tdat_keepresp</h4>
<i>Write-only prepare() attribute.</i><br>
When set to a non-zero value, causes a KEEPRESP parcel to be issued with the request to the
DBMS. This useful for<p>
<ul>
<li>executing the EXPORT'd query on the control session of a fastexport (<b>Note</b> that the new
tdat_UtilitySetup() interface for EXPORT eliminates the need for the application to specify
this attribute).
<li>executing transaction-spanning read-only cursors (SELECT's without a FOR CURSOR suffix.).
</ul><p>
The latter case permits an application to execute a SELECT statement as a read-only cursor,
which remains open after subsequent commit or rollback operations, either via AutoCommit'ed
INSERT/UPDATE/DELETE/etc. statements, or by explicit commit() or rollback() calls. <b>NOTE</b>
that the application must <b>explicitly finish() the associated statement handle, even
after all rows have been retrieved from the cursor;</b> otherwise the cursor will remain open,
consuming both client and server resources, until the associated connection has been disconnected.
<p>
Example:
<pre>
my $selsth = $dbh->prepare('SELECT * from alltypetst', { tdat_keepresp => 1 });
my $updsth = $dbh->prepare('UPDATE alltypetst SET col2 = 1 WHERE col1 = ?');
my $row;
$selsth->execute;
while ($row = $selsth->fetchrow_arrayref) {
    if ($$row[0]%100 == 0) {
        $updsth->execute($$row[0]);
        $dbh->commit;
    }
}
$selsth->finish;

</pre>
<p>

<a name="lsn"></a>
<h4>tdat_lsn</h4>
<i>Write-only connect() attribute, Read-only on connection handle.</i><br>
When specified on connect():
<ul>
<li>if specified with a value of zero, causes the session to allocate an LSN from the DBMS,
which can be queried after successful connection using the tdat_lsn attribute.
<li>if specified with a non-zero value, causes the session to associate with the provided
LSN value.
</ul>
If not specified during connect(), no LSN action is performed, and querying tdat_lsn after
connection will return <code>undef</code>.

After connect(), the LSN value can be queried via the database handle tdat_lsn attribute.
<p>

<a name="mlmask"></a>
<h4>tdat_mlmask</h4>
<i>Write-only on statement handle</i><br>
A scalar bitmask, or an arrayref of bitmasks, used with MLOAD utility
sessions to indicate which MLOAD jobs a given input record is associated
with. Refer to the <a href="tdatdbdml.html">Multiload detail</a> page for a detailed
description and example code.<p>

<a name="tdmode"></a>
<h4>tdat_mode</h4>
<i>Set at connect(), connection handle attribute.</i><br>
Sets the session mode, either 'ANSI', 'TERADATA', or 'DEFAULT', upon connection. If not specified,
or set to DEFAULT, the current DBMS default mode is used. After connection, the application
can query the attribute to determine which mode the session is operating in.<p>

<a name="moreres"></a>
<h4>tdat_more_results</h4>
<i>Read-only statement handle attribute.</i><br>
Indicates if there are more results to retrieve from a statement handle. When a fetch operation returns
undef, a non zero tdat_more_results value indicates more Teradata statements are available
for fetching on the statement handle.<p>

<a name="nocli"></a>
<h4>tdat_no_cli</h4>
<i>Write-only connect() attribute</i><br>

doc/tdatdbd.html  view on Meta::CPAN

<li>support for MLOAD
<li>support for MP utilities
<li>support for large stored procedures
<li>support for COPx name resolution
</ul><p>

Release 2.1.8:<p>
<ul>
<li>support for FIELD mode (tdat_formatted)
<li>fix to fallback to xxxCOP1 hostnames
</ul><p>

Release 2.1.7:<p>
<ul>
<li>fix USING TIMESTAMP/TIME columns
<li>improved PREPARE optimization
</ul><p>

Release 2.1.6:<p>
<ul>
<li>fix DATAINFO for VARCHAR/TIMESTAMP types
<li>fix garbage trailing chars in DATAINFO's
</ul><p>

Release 2.1.5:<p>
<ul>
<li>fix MONITOR SQL EXPLAIN processing
</ul><p>

Release 2.1.4:<p>
<ul>
<li>fix numeric IP addresses
<li>fix FAILURE behavior in ANSI mode
</ul><p>
Release 2.1.3:<p>
<ul>
<li>add support for new array binding i/f
<li>make tdat_compatible stmt level attribute
<li>support COP1 lookup
<li>support DBCCONS partition
<li>support ARM LINUX float format
</ul><p>
Release 2.1.2:<p>
<ul>
<li>fix host addr regex
<li>fix MONITOR SQL processing
</ul><p>
Release 2.1.1:<p>
<ul>
<li>remove comments during prepare
</ul><p>
Release 2.1.0:<p>
<ul>
<li>improvments to PM API interface, including support for V2R4.1 PM API enhancements
<li>optimize prepare() of non-data returning requests
<li>minor fix for SQLSTATE mapping
</ul><p>
Release 2.0.4:<p>
<ul>
<li>fixed bug in tdat_UtilitySetup operation when no Checkpoint specified
<li>added support for transaction-spanning read-only cursors (ie, KEEPRESP)
<li>added SQLSTATE support (i.e., $drh/$dbh/$sth->state returns valid values)
<li>fixed non-conforming rowcount return value for $sth->execute and $dbh->do
</ul><p>
Release 2.0:<p>
<ul>
<li>first commercial release
</ul><p>

<a name="tips"></a>
<h2>Tips & Tricks</h2><p>
<ul>
<li>Review the various included test scripts and modules for examples of using the various
feature of DBD::Teradata.<p>

<li>Keep in mind that some DDL statements may return errors that are actually acceptable in
some cases, e.g., a "precautionary" DROP TABLE returning a 3807 error if the table doesn't exist.<p>

<li>For optimal performance when bulkloading via non-blocking multisession mode, turn off
AutoCommit and explicitly commit() at periodic intervals.<p>

<li>If you need to re-execute a previously prepared <b>and executed</b> data returning
statement <b><i>before the returned rowset has been completely consumed</i></b>, you <b>must</b>
use <code>sth-&gt;finish()</code> first.<p>

<li>Consider setting <b>both</b> <code>PrintError</code> and <code>RaiseError</code>
to zero during <code>DBI-&gt;connect()</code>, and explicitly checking for errors
yourself; otherwise, you may exit unexpectedly or get spurious error messages in the output
when you're just doing a "precautionary" DROP on a non-existant database object.<p>

<li>SHOW commands return carriage returns (i.e., "\r") where newlines ("\n")
would normally be expected; remember to apply a quick substitute to the returned data before
displaying.<p>

<li><a target = '_blank' href='http://www.presicient.com/dbixchart'>DBIx::Chart</a> can be a useful tool for
doing quick data visualizations directly from your SQL.<p>

<li><a target = '_blank' href='http://www.presicient.com/sqlpp'>SQL::Preproc</a> provides the ability to use
embedded SQL without the additional DBI wrappers, and has been tested with Teradata.<p>

</ul>
<p>
<a name="todo"></a>
<h2>TO DO List</h2><p>
The following list includes features under consideration for future releases
(This list is <b>not</b> to be considered a promise to implement any of these
items; it is provided only to solicit feedback).

<ul>
<li>DBI metadata enhancements (<code>primary_keys()</code> metadata)
<li>Reconnection
<li>LOB support
<li>CREATE/REPLACE UDF/XSP support
<li>V2R6.2 VARDECIMAL/BIGINT datatypes
<li>quoted identifiers
<li>single sign on
<li>scrollable cursors
</ul>
<p>

<a name="refs"></a>
<h2>References</h2><p>

<ul>
<li><a target = '_blank' href="http://dbi.perl.org/">Official DBI Site</a>
<li><a target = '_blank' href="http://www.cpan.org">CPAN</a>
<li><a target = '_blank' href="http://www.perl.org">Perl.org</a>
<li><a target = '_blank' href="http://www.activestate.com">ActiveState</a> (for Perl software for Windows)
<li><a target = '_blank' href="http://www.info.ncr.com">Teradata Online Docs</a>
</ul>

<a name="copy"></a>
<h2>Copyright</h2><p>

Copyright (c) 2001-2006 <a target = '_blank' href="http://www.presicient.com">Presicient Corp.</a>, USA<br>
</td>
<td width='5%'> </td>
</tr></table>
<hr>
<small>
Teradata&reg; is a registered trademark of NCR Corporation.
</body></html>



( run in 0.870 second using v1.01-cache-2.11-cpan-39bf76dae61 )