2
# Contributor(s): Xiaoou Wu <xiaoou.wu@oracle.com>
4
package Data::ObjectDriver::Driver::DBD::Oracle;
8
use base qw( Data::ObjectDriver::Driver::DBD );
10
use Data::ObjectDriver::SQL::Oracle;
11
use Data::ObjectDriver::Errors;
12
use DBD::Oracle qw(:ora_types);
17
$dbh->{LongReadLen} = 1024000;
18
$dbh->{FetchHashKeyName} = 'NAME_lc';
19
return bless $dbh, 'Data::ObjectDriver::Driver::DBD::Oracle::db';
22
sub bind_param_attributes {
23
my ($dbd, $data_type) = @_;
24
if ($data_type && $data_type eq 'blob') {
25
return { ora_type => ORA_BLOB };
33
if ($msg && $msg =~ /ORA-00001/i) {
34
return Data::ObjectDriver::Errors->UNIQUE_CONSTRAINT;
40
## Oracle doesn't support auto-increment, it needs a SEQUENCE to emulate
41
## this feature. For usage, please see NOTES.
44
my ($class, $dbh, $sth, $driver) = @_;
45
my $seq = $dbd->sequence_name($class, $driver);
46
my ($last_insert_id) = $dbh->selectrow_array("SELECT $seq.CURRVAL "
48
return $last_insert_id;
53
my ($class, $driver) = @_;
54
my $datasource = $class ->datasource;
55
my $prefix = $driver->prefix;
56
$datasource = join('', $prefix, $datasource) if $prefix;
57
join '_', $datasource,
60
$class->properties->{primary_key},
72
my $sql = "INSERT INTO $table("
75
. join(',', map {'?'} @$cols)
77
my $sth = $dbh->prepare($sql);
78
foreach my $row (@{ $rows_ref || []}) {
85
sub sql_class { 'Data::ObjectDriver::SQL::Oracle' }
87
package Data::ObjectDriver::Driver::DBD::Oracle::db;
91
## Inherit the DB class from DBI::db.
94
## Oracle doesn't allow a SELECT statement without FROM.
97
my $has_select = ($stmt =~ m/^\s*SELECT\b/io);
98
my $has_from = ($stmt =~ m/\bFROM\b/io);
99
$stmt .= " FROM DUAL" if ($has_select and !$has_from);
103
sub selectrow_array {
106
$stmt = _adjust_stmt($stmt);
108
$self->SUPER::selectrow_array(@_);
117
Data::ObjectDriver::Driver::DBD::Oracle - Oracle Driver for Data::ObjectDriver
121
This module overrides methods of the Data::ObjectDriver::Driver::DBD module
122
with Oracle specific implementation.
126
Oracle doesn't support auto-increment, so before you use this feature, you
127
should create a sequence and a trigger to work with it.
129
For example, you want field ID in table WINES be auto-increment, then create:
132
CREATE SEQUENCE WINES_ID_SEQ
134
MAXVALUE 999999999999999999999999999
140
CREATE OR REPLACE TRIGGER WINES_ID_TR
141
BEFORE INSERT ON WINES
144
SELECT WINES_ID_SEQ.NEXTVAL INTO :NEW.ID FROM DUAL;
149
This module is free software;
150
you may redistribute and/or modify it under the same
151
terms as Perl itself.
153
=head1 AUTHOR & COPYRIGHT
156
copyright (c) 2009 Xiaoou Wu E<lt>xiaoou.wu@oracle.comE<gt>.