File: 55nested.t

package info (click to toggle)
libdbd-oracle-perl 1.83-3
  • links: PTS, VCS
  • area: contrib
  • in suites: sid
  • size: 1,724 kB
  • sloc: ansic: 8,354; perl: 7,868; makefile: 20
file content (128 lines) | stat: -rw-r--r-- 3,845 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!perl

use strict;
use warnings;

use lib 't/lib';
use DBDOracleTestLib qw/ oracle_test_dsn db_handle /;

use Test::More;

use DBI;
use DBD::Oracle qw(ORA_RSET);

$| = 1;

my $dbh = db_handle( { PrintError => 0 } );

if ($dbh) {
    plan tests => 29;
}
else {
    plan skip_all => 'Unable to connect to Oracle';
}

# ref cursors may be slow due to oracle bug 3735785
# believed fixed in
#	 9.2.0.6 (Server Patch Set)
#	10.1.0.4 (Server Patch Set)
#	10.2.0.1 (Base Release)

{

my $outer = $dbh->prepare(
    q{
    SELECT object_name, CURSOR(SELECT object_name FROM dual)
    FROM all_objects WHERE rownum <= 5}
);
ok( $outer, 'prepare select' );

ok( $outer->{ora_types}[1] == ORA_RSET, 'set ORA_RSET' );
ok( $outer->execute,                    'outer execute' );
ok( my @row1 = $outer->fetchrow_array, 'outer fetchrow' );
my $inner1 = $row1[1];
is( ref $inner1, 'DBI::st', 'inner DBI::st' );
ok( $inner1->{Active}, 'inner Active' );
ok( my @row1_1 = $inner1->fetchrow_array, 'inner fetchrow_array' );
is( $row1[0], $row1_1[0], 'rows equal' );
ok( $inner1->{Active}, 'inner Active' );
ok( my @row2 = $outer->fetchrow_array, 'outer fetchrow_array' );
ok( !$inner1->{Active}, 'inner not Active' );
ok( !$inner1->fetch,    'inner fetch finished' );
is( $dbh->err, -1, 'err = -1' );
like( $dbh->errstr, qr/ defunct /, 'defunct' );
ok( $outer->finish, 'outer finish' );
is( $dbh->{ActiveKids}, 0, 'ActiveKids' );

#########################################################################
# Same test again but this time with 2 cursors
#########################################################################

$outer = $dbh->prepare(
    q{
    SELECT object_name,
           CURSOR(SELECT object_name FROM dual),
           CURSOR(SELECT object_name FROM dual)
      FROM all_objects WHERE rownum <= 5}
);
ok( $outer, 'prepare select' );

ok( $outer->{ora_types}[1] == ORA_RSET, 'set ORA_RSET' );
ok( $outer->{ora_types}[2] == ORA_RSET, 'set ORA_RSET' );
ok( $outer->execute,                    'outer execute' );
ok( @row1 = $outer->fetchrow_array, 'outer fetchrow' );
$inner1 = $row1[1];
my $inner2 = $row1[2];
is( ref $inner1, 'DBI::st', 'inner DBI::st' );
is( ref $inner2, 'DBI::st', 'inner DBI::st' );

ok( $inner1->{Active}, 'inner Active' );
ok( $inner2->{Active}, 'inner Active' );
ok( @row1_1 = $inner1->fetchrow_array, 'inner fetchrow_array' );
ok( my @row2_1 = $inner2->fetchrow_array, 'inner fetchrow_array' );
is( $row1[0], $row1_1[0], 'rows equal' );
is( $row1[0], $row2_1[0], 'rows equal' );

#########################################################################
# Fetch speed test: START
#########################################################################

$dbh->{RaiseError} = 1;

sub timed_fetch {
    my ( $rs, $caption ) = @_;
    my $row_count = 0;
    my $tm_start  = DBI::dbi_time();
    $row_count++ while $rs->fetch;
    my $elapsed = DBI::dbi_time() - $tm_start;

    note "Fetched $row_count rows ($caption): $elapsed secs.";

    return $elapsed;
}

##################################################
# regular select
##################################################
my $sql1 = q{
    SELECT object_name
    FROM (SELECT object_name FROM all_objects WHERE ROWNUM<=70),
         (SELECT           1 FROM all_objects WHERE ROWNUM<=70)
};
$outer = $dbh->prepare($sql1);
$outer->execute();
my $dur_std = timed_fetch( $outer, 'select' );

##################################################
# nested cursor
##################################################
$outer = $dbh->prepare("SELECT CURSOR($sql1) FROM DUAL");
$outer->execute();
my $ref_csr = $outer->fetchrow_arrayref->[0];
my $dur_ref = timed_fetch( $ref_csr, 'nested cursor' );

#########################################################################
# Fetch speed test: END
#########################################################################

}