Author: byterock
Date: Thu Jul 24 12:20:19 2008
New Revision: 11585
Modified:
dbd-oracle/trunk/Changes
dbd-oracle/trunk/Oracle.pm
dbd-oracle/trunk/dbdimp.c
Log:
update to the pod
Modified: dbd-oracle/trunk/Changes
==============================================================================
--- dbd-oracle/trunk/Changes (original)
+++ dbd-oracle/trunk/Changes Thu Jul 24 12:20:19 2008
@@ -1,4 +1,5 @@
=head1 Changes in DBD-Oracle 1.22(svn rev xxxx) 2008
+ Update to connection part of POB from John Scoles
Fix to test suite to bring it up to standard from Martin Evans
Fix for memory hemorrhage in bind_param_inout_array found by Ricky Egeland, Fix by John Scoles
Fix for a typo in oracle.xs from Milo van der Leij
Modified: dbd-oracle/trunk/Oracle.pm
==============================================================================
--- dbd-oracle/trunk/Oracle.pm (original)
+++ dbd-oracle/trunk/Oracle.pm Thu Jul 24 12:20:19 2008
@@ -42,7 +42,7 @@
bootstrap DBD::Oracle $VERSION;
- $drh = undef; # holds driver handle once initialised
+ $drh = undef; # holds driver handle once initialized
sub CLONE {
$drh = undef ;
@@ -967,16 +967,55 @@
DBD::Oracle is a Perl module which works with the DBI module to provide
access to Oracle databases.
-Since version 1.22 it only supports Oracle clients 9 or greater. You still can connect to an
-Oracle 8 DB you just have to use a newer client.
+=head1 Which version DBD::Oracle is for me?
+
+Since version 1.22 DBD::Oracle only supports Oracle clients 9 or greater. Sorry for this it was just getting to hard to
+maintain even more so with the many new functions being introduced in 10g and 11g.
+If you are still stuck with an older version of Oracle or its client you might want to look at the table below.
+
+ +---------------------+--------------------------------------------+
+ | | Oracle Version |
+ +---------------------+----+-------------+---------+------+--------+
+ | DBD::Oracle Version | <8 | 8.0.3~8.0.6 | 8iR1~R2 | 8iR3 | 9i~11g |
+ +---------------------+----+-------------+---------+------+--------+
+ | 0.1~16 | Y | Y | Y | Y | Y |
+ +---------------------+----+-------------+---------+------+--------+
+ | 1.17 | Y | Y | Y | Y | Y |
+ +---------------------+----+-------------+---------+------+--------+
+ | 1.18 | N | N | N | Y | Y |
+ +---------------------+----+-------------+---------+------+--------+
+ | 1.19 | N | N | N | Y | Y |
+ +---------------------+----+-------------+---------+------+--------+
+ | 1.20 | N | N | N | Y | Y |
+ +---------------------+----+-------------+---------+------+--------+
+ | 1.21 | N | N | N | Y | Y |
+ +---------------------+----+-------------+---------+------+--------+
+ | 1.22 | N | N | N | N | Y |
+ +---------------------+----+-------------+---------+------+--------+
+
+As there are dozens and dozens of different versions of Oracle's clients I did not bother to list any of them, just the major release versions of Oracle that are out there.
+
+Note that one can still connect to any Oracle version with the older DBD::Oracle versions the only problem you will have is that some of the newer OCI and Oracle features available in later DBD::Oracle releases will not be available to you.
+
+So to make a short story a little longer;
+
+ 1) If you are using Oracle 7 or early 8 get a 9 client and you can use any DBD::Oracle version.
+ 2) If you have to use an Oracle 7 client then DBD::Oracle 1.17 should work
+ 3) Same thing for 8 up to R2, use 1.17, if you are lucky and have the right patch-set you might go with 1.18.
+ 4) For 8iR3 you can use any of the DBD::Oracle versions up to 1.21. Again this depends on your patch-set, If you run into trouble go with 1.19
+ 5) After 9i you can use any version you want.
+ 6) For you Luddites out there ORAPERL still works and is still included but not updated or supported anymore.
+ 7) It seems that the 10g client can only connect to 9 and 11 DBs while the 9 can go back to 7 and even get to 10. I am not sure what the 11g client can connect to.
=head1 CONNECTING TO ORACLE
This is a topic which often causes problems. Mainly due to Oracle's many
and sometimes complex ways of specifying and connecting to databases.
-(James Taylor and Lane Sharman have contributed much of the text in
-this section.)
+James Taylor and Lane Sharman have contributed much of the text in
+this section. Unfortunately it is only really relative for connecting into older Oracle (<9) versions.
+Most of this stuff is well out of date but it will be left in for now.
+See the next section L</CONNECTING TO ORACLE II> for some more up to date connection hints.
=head2 Connecting without environment variables or tnsnames.ora file
@@ -991,16 +1030,15 @@
1526 and 1521 in that order (e.g., new then old). You can check which
port(s) are in use by typing "$ORACLE_HOME/bin/lsnrctl stat" on the server.
-
=head2 Oracle Environment Variables
-Oracle typically uses two environment variables to specify default
-connections: ORACLE_SID and TWO_TASK.
+Oracle typically no longer needs two environment variables to specify default
+connections: ORACLE_SID and TWO_TASK.
ORACLE_SID is really unnecessary to set since TWO_TASK provides the
same functionality in addition to allowing remote connections.
- % setenv TWO_TASK T:hostname:ORACLE_SID # for csh shell
+ % setenv //xxx.yyy.zzz:1521/ORACLE_SID # for csh shell
$ TWO_TASK=T:hostname:ORACLE_SID export TWO_TASK # for sh shell
% sqlplus username/password
@@ -1023,6 +1061,9 @@
will use the info stored in the SQL*Net v2 F<tnsnames.ora>
configuration file for local or remote connections.
+Support for 'T:' syntax of Oracle SQL*Net V1 is only supported on older 7 clients and I have my doubts it will even work
+if the DB or client has been patched and I know it will not work on any later clients.
+
The ORACLE_HOME environment variable should be set correctly.
In general, the value used should match the version of Oracle that
was used to build DBD::Oracle. If using dynamic linking then
@@ -1064,7 +1105,7 @@
B<Note:> Some of these formats may not work with Oracle 9+.
BEGIN {
- $ENV{ORACLE_HOME} = '/home/oracle/product/7.x.x';
+ $ENV{ORACLE_HOME} = '/home/oracle/product/10.x.x';
$ENV{TWO_TASK} = 'DB';
}
$dbh = DBI->connect('dbi:Oracle:','scott', 'tiger');
@@ -1113,6 +1154,93 @@
trying to do it.)
+=head1 CONNECTING TO ORACLE II
+
+If you are reading this it is assumed that DBD::Oracle has been successfully installed on you PERL instance and
+you are having some problems connecting to Oracle.
+
+First off you will have to tell DBD::Oracle where the binaries reside for the Oracle client it was compiled against.
+This is the case when you encounter a
+
+ DBI connect('','system',...) failed: ERROR OCIEnvNlsCreate.
+
+error in Lunix or in Windows when you get
+
+ OCI.DLL not found
+
+The solution to this problem in the case of Linux is to ensure your 'ORACLE_HOME' environment variable points to the correct directory.
+
+ export ORACLE_HOME=/app/oracle/product/xx.x.x
+
+For Windows solution is to add this value to you PATH
+
+ PATH=c:\app\oracle\product\xx.x.x;%PATH%
+
+
+If you get past this stage and get a
+
+ ORA-12154: TNS:could not resolve the connect identifier specified
+
+error then the most likely cause is DBD::ORACLE cannot find your .ORA (TNSNAMES.ORA, LISTENER.ORA, SQLNET.ORA) files. This can be solved by setting the
+TNS_ADMIN environment variable to the directory where these files can be found.
+
+If you get to this stage you then either of the following errors;
+
+ ORA-12560: TNS:protocol adapter error
+ ORA-12162: TNS:net service name is incorrectly specified
+
+
+usually means that DBD::Oracle can find the listener but the it cannot connect to the DB because the listener cannot find the DB you asked for.
+
+=head2 Connection Examples Using DBD::Oracle
+
+It is best to not use ORACLE_SID or TWO_TASK as both of these are rather out of date. You are better off keeping it simple like the following examples
+
+ $dbh = DBI->connect('dbi:Oracle:DB','username','password');
+
+ $dbh = DBI->connect('dbi:Oracle:DB','username/password','');
+
+ $dbh = DBI->connect('dbi:Oracle:','username@DB','password');
+
+ $dbh = DBI->connect('dbi:Oracle:host=foobar;sid=DB;port=1521', 'scott/tiger', '');
+
+
+For those who really want to use ORACLE_SID and TWO_TASK here are examples of it in use;
+
+Given this TNS entry;
+
+ DB.TEST =
+ (DESCRIPTION =
+ (ADDRESS =
+ (PROTOCOL = TCP)
+ (HOST = xxx.xxx.xxx.xx)
+ (PORT = 1523))
+ (CONNECT_DATA = (SID = DB) )
+)
+
+and this code
+
+ BEGIN {
+ $ENV{ORACLE_SID} = 'DB';
+ }
+
+ $dbh = DBI->connect('dbi:Oracle:','username/password','');
+
+you will be able to connect to DB. Note this may not work for Windows.
+
+TWO_TASK works the same way except it should override the value in ORACLE_SID so this
+
+ BEGIN {
+ $ENV{ORACLE_SID} = 'DB';
+ $ENV{TWO_TASK} = 'DB.TEST';
+
+ }
+
+ $dbh = DBI->connect('dbi:Oracle:','username/password','');
+
+will work as well. Note this may not work for Windows.
+
+
=head2 Optimizing Oracle's listener
[By Lane Sharman <[email protected]>] I spent a LOT of time optimizing
@@ -2797,13 +2925,13 @@
=item NULL
The table cell is created, but the cell holds no locator or value.
-If your LOB field is in this state then there is no LOB Locator that DBD::Oracle can work with so it will return a
+If your LOB field is in this state then there is no LOB Locator that DBD::Oracle can work so if your encounter a
DBD::Oracle::db::ora_lob_read: locator is not of type OCILobLocatorPtr
-error.
+error when working with a LOB.
-To correct this you must use an SQL UPDATE statement to reset the LOB column to a non-NULL (or empty LOB) value with either EMPTY_BLOB or EMPTY_CLOB as in this example;
+You can correct this by using an SQL UPDATE statement to reset the LOB column to a non-NULL (or empty LOB) value with either EMPTY_BLOB or EMPTY_CLOB as in this example;
UPDATE lob_example
SET bindata=EMPTY_BLOB()
@@ -2833,7 +2961,6 @@
an 'ORA-01062: unable to allocate memory for define buffer' error. One solution is to set the size of 'LongReadLen' to a lower value.
-
For example give this table;
CREATE TABLE test_long (
@@ -3170,7 +3297,7 @@
ORA-01691 unable to extend lob segment sss.ggg by nnn in tablespace ttt
error, while attempting to insert a LOB, this means the Oracle user has insufficient space for LOB you are trying to insert.
-One solution it to use "alter database datafile 'sss.ggg' resize nnnn" to increase the available memory for LOBs.
+One solution it to use "alter database datafile 'sss.ggg' resize Mnnn" to increase the available memory for LOBs.
=head2 Persistent & Locator Interface Caveats
@@ -3216,12 +3343,6 @@
created them is valid. When all references to the original statement
handle are lost, the handle is destroyed and the locators are freed.
-B<Warning:> Currently multi-byte character set issues have not been
-fully worked out. So these methods may not do what you expect if
-either the Perl data is utf8 or the CLOB is a multi-byte character set
-(including uft8). The current behaviour in these situations may not be
-correct and is B<subject to change>. I<Testing and patches are most welcome.>
-
=over 4
=item ora_lob_read
Modified: dbd-oracle/trunk/dbdimp.c
==============================================================================
--- dbd-oracle/trunk/dbdimp.c (original)
+++ dbd-oracle/trunk/dbdimp.c Thu Jul 24 12:20:19 2008
@@ -528,14 +528,14 @@
OCINlsEnvironmentVariableGet_log_stat( &charsetid, 0, OCI_NLS_CHARSET_ID, 0, &rsize ,status );
if (status != OCI_SUCCESS) {
oci_error(dbh, NULL, status,
- "OCINlsEnvironmentVariableGet(OCI_NLS_CHARSET_ID) Check ORACLE_HOME and NLS settings etc.");
+ "OCINlsEnvironmentVariableGet(OCI_NLS_CHARSET_ID) Check NLS settings etc.");
return 0;
}
OCINlsEnvironmentVariableGet_log_stat( &ncharsetid, 0, OCI_NLS_NCHARSET_ID, 0, &rsize ,status );
if (status != OCI_SUCCESS) {
oci_error(dbh, NULL, status,
- "OCINlsEnvironmentVariableGet(OCI_NLS_NCHARSET_ID) Check ORACLE_HOME and NLS settings etc.");
+ "OCINlsEnvironmentVariableGet(OCI_NLS_NCHARSET_ID) Check NLS settings etc.");
return 0;
}
@@ -563,7 +563,7 @@
charsetid, ncharsetid, status );
if (status != OCI_SUCCESS) {
oci_error(dbh, NULL, status,
- "OCIEnvNlsCreate. Check ORACLE_HOME env var, NLS settings, permissions, etc.");
+ "OCIEnvNlsCreate. Check ORACLE_HOME (Linux) env var or PATH (Windows) and or NLS settings, permissions, etc.");
return 0;
}
@@ -601,7 +601,7 @@
charsetid, ncharsetid, status );
if (status != OCI_SUCCESS) {
oci_error(dbh, NULL, status,
- "OCIEnvNlsCreate. Check ORACLE_HOME env var, NLS settings, permissions, etc.");
+ "OCIEnvNlsCreate. Check ORACLE_HOME (Linux) env var or PATH (Windows) and or NLS settings, permissions, etc");
return 0;
}
}
@@ -620,7 +620,7 @@
if (status != OCI_SUCCESS) {
oci_error(dbh, NULL, status,
- "OCIInitialize. Check ORACLE_HOME env var, Oracle NLS settings, permissions etc.");
+ "OCIInitialize. Check Check ORACLE_HOME (Linux) env var or PATH (Windows) and or NLS settings, permissions, etc");
return 0;
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.