首页 | 摘要显示 | 上一页 1 2 3 4 5 6 7 8 9 10 11 下一页

Developer Archives

学习Perl DBI -- 语句的高级属性

    1, NUM_OF_FIELDS -- 查询返回的字段个数

    在执行之后, 就可以用这个属性获得SELECT语句返回的字段数了, 如下所示:

$sth->execute();
print("Number of fields: $sth->{NUM_OF_FIELDS}\n");

    2, NAME, NAME_UC, NAME_LC -- 取得字段名

    这些属性是一个数组, NAME返回的是大小写混合的列名, NAME_UC是大写, NAME_LC是小写. 使用方法如下所示:

$sth = $dbh->prepare( "SELECT * FROM megaliths" );
$sth->execute();
for ( $i = 1 ; $i <= $sth->{NUM_OF_FIELDS} ; $i++ ) {
  print "Column $i is called $sth->{NAME}->[$i-1]\n";
}

    3, NULLABLE -- 是否允许为空

    使用方法同上, 0表示非空, 1表示可以为空, 2表示未知.

    4, TYPE(类型), PRECISION(精度), SCALE(小数点)

    使用方法同上.

    5, NUM_OF_PARAMS -- 需要绑定的变量个数

    在Prepare之后可以用这个属性取得需要绑定的变量的个数, 如下所示:

$sth = $dbh->prepare(...);
print("Bind Count: $sth->{NUM_OF_PARAMS}\n");

学习Perl DBI -- Array Insert/Update/Delete

    在DBI的较新版本和DBD的最新版本(如: DBD Oracle V1.19)中就支持了Array DML操作, 这样可以大幅提高应用程序的性能, 在Perl中我们可以通过bind_param_array和execute_array来实现, 如下代码所示:

my (@rowstats, $rv);

$dbh->{AutoCommit} = 0;

my @col1 = (.....);
my @col2 = (.....);

my $sth = $dbconn->prepare(
    "INSERT INTO T_PERLARRAY VALUES (?, ?)");

$sth->bind_param_array(1, \@col1);
$sth->bind_param_array(2, \@col2);
$rv = $sth->execute_array(
    {ArrayTupleStatus => \@rowstats});

    如果执行成功, $rv将是执行的次数, 如果失败将会是undef. 而rowstats这个数据将返回每一次调用所影响的记录数, 但在Oracle中, 常常得不到这个数, 所有值都被置成-1. 如果有几行执行失败, 时那么rowstats中对应的值将是一个数组, 第一个值为错误代码, 第二个值为错误信息. 先来看一下成功的例子:

print("Return: $rv\n") if (defined($rv));
print("Status: @rowstats\n");

# Return: 5
# Status: -1 -1 -1 -1 -1

    现在假设数据组的第三个值太大, 不能插入到数据库中, 则输出如下:

print("Return: $rv\n") if (defined($rv));
print("Status: @rowstats\n");

# Status: -1 -1 ARRAY@... -1 -1

    用如下代码就可以取到错误代码和错误信息:

if (ref $rowstats[2])
{
  print("errcode: $rowstats[2]->[0]\n");
  print("errmsg : $rowstats[2]->[1]\n");
}

    有空时写个例子比较一下速度. 这个功能现在的Bug还比较多, 如PrintError设为0并不起作用等, 还得等以后的版本来修补.

January 10, 2007

学习Perl DBI -- 真正的Array DML支持

    在早期的DBD Oracle (1.18)以前, Array DML的接口是假的, 其实是一条一条地执行的, 而DBD Oracle的主要编写人员也受到了很多开发人员的质问. 在DBD-Oracle v1.19的更改列表中, 我看到了下面的几行:

=head1 Changes in DBD-Oracle 1.18 (svn rev 6697)

  Added support for native Oracle Array interface thanks Kristian Nielsen
  Added suppot for LOB Locators from Jeffrey Klein.
  Updated README.win32.txt for Oracle 10xe and new Visual C++ version
  Updated README.lunix.txt for work-araound for UTF8 bug
  Fixed a number of compile warings  

    于是我在本机上验证了一把, 我们只要用SQL_TRACE去看一下执行次数就可以了, 如果是真正的Array DML, 那执行数次应当是1次, 否则应当是很多次. 在这儿我的数组的长度是10, 执行的输出结果如下:

Return: 10
Status: -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

    从下面的SQL_TRACE的结果(用tkprof格式化过)来看, 本机的DBD-Oracle v1.19已经的确支持真正的Array DML了.

INSERT INTO T_PERLARRAY
VALUES
(:p1, :p2)

call     count  ...      query    current        rows
------- ------  ... ---------- ----------  ----------
Parse        1  ...          0          0           0
Execute      1  ...          1         21          10
Fetch        0  ...          0          0           0
------- ------  ... ---------- ----------  ----------
total        2  ...          1         21          10

    如果你想用Perl来高效地编写数据装载程序, 就请升级DBD-Oracle吧.

Perl程序的一个小问题 -- Command not found

    今天发现以前能跑的一个角本, 突然不能跑了. 于是我被要求去看了一下为什么不能跑了? 找到角本后, 直接运行报"Command not found"的错误, 但是我看文件是存在的, 并且执行的权限也是有的, 如下所示:

$ p1.pl
p1.pl: Command not found
$ ls -la p1.pl
-rwxrwxr-x   1 oracle   dba  ...... p1.pl

    用vim打开程序一看, 原来第一行中的perl解释器的路径不对:

#!/usr/share/bin/perl -w
#

    从而导致了运行perl程序时报"Command not found", 将其更改为准确的值后, 就可以跑了:

#!/usr/local/bin/perl -w
#

    原因应当是开发人员开发的机器上的perl安装路径和正式用的机器上的perl的安装路径不一致, 在没有详细测试的情况下就将角本放上去了, 从而引起了问题. 这么小的一件事情, 如果我们没有收到邮件或忽略它的话, 可能导致很多的定时角本不能跑, 也有可能引起很大的问题.

January 15, 2007

学习Perl DBI -- 以SYSDBA或SYSOPER连接到Oracle

    在连接9i或以上版本的Oracle数据库时, 必须指定SYSDBA或SYSOPER选项, 当你的Perl角本需要以SYS用户连接时, 如何指定呢?

#!/usr/bin/perl -w
#
use DBI;

# Get a database connection Handle.
my $dbconn = DBI->connect("dbi:Oracle:",
     '/','/', {ora_session_mode=>2});
......

    当ora_session_mode的值指定为2时表示以SYSDBA连接, 指定值为4时表示以SYSOPER来连接.

    最近越来越发现Perl的好处, 以后将改用Perl来写些小角本, 并将源代码共享给大家.

上一页 1 2 3 4 5 6 7 8 9 10 11 下一页

当前分类: Developer

Creative Commons License
本站版权: 共用创作 CC
署名-非商业性-相同方式分享
本站基于MT-3.36免费版
(©)版权所有, 2004 - 2008, www.AnySQL.net, 保留所有权利.
MSN: loufangxin(a)msn.com, Mail: anysql(at)126.com/support(at)iamdba.com, Skype ID:anysql