学习Perl DBI -- 绑定(Bind)变量

    给SQL语句动态地传入值的方法叫绑定(Bind), 在写数据库有关的角本时, 这是很重要的一点, 在Perl中你可以在SQL中写一个问号表示不确定的值, 不管是在SELECT还是在Insert/Update/Delete语句中, 都一样. 如下所示:

my $sth = $dbh->prepare( "select tname from tab
        where tname like ?");
......
my $sth = $dbh->prepare("Delete from test where col1=?");

    接下来在执行之前要传入真实的值和类型, bind_param就是用来传入值的, 第一个参数为问题的位置, 从1开始数; 第二个参数为变量的值; 第三个参数是可选的, 为参数的类型. 如下所示:

use strict:
use DBI;
USE DBI qw(:sql_types);

$sth->bind_param(1, "TEMP%");
$sth->bind_param(2, 2000);
$sth->bind_param(3, 2500, { TYPE=> SQL_VARCHAR });
$sth->bind_param(3, 2500, SQL_VARCHAR);

$sth->execute();

    在Perl中是不能按名字来绑定变量的, 即"COL1 = :p1 OR COL2 = :P1'这样的条件要写成"COL1 = ? OR COL2 = ?", 并且要传入二次参数. 在调用函数或存贮过程时, 经常会有转出类型的参数, 这时可以用bind_param_inout来实现, 例如有一个过程"p_test(v1 in number, v2 out number, v3 out number)", 要调用它的话, 要用如下写法:

my ($v1, $v2, $v3);
my $sth = $dbi->prepare("BEGIN P_TEST(?,?,?); END;");
$v1 = 123;
$sth->bind_param(1, $v1);
$sth->bind_param_inout(2, \$v2, 50);
$sth->bind_param_inout(2, \$v3, 50);
$sth->execute();

    常用的绑定类型有SQL_CHAR, SQL_NUMERIC, SQL_DECIMAL, SQL_INTEGER, SQL_SMALLINT, SQL_FLOAT, SQL_REAL, SQL_DOUBLE, SQL_DATE, SQL_TIME, SQL_TIMESTAMP, SQL_VARCHAR, SQL_LONGVARCHAR, SQL_BINARY, SQL_VARBINARY, SQL_LONGVARBINARY, SQL_BIGINT, SQL_TINYINT, SQL_BIT, SQL_WCHAR, SQL_WVARCHAR, SQL_WLONGVARCHAR. 除了上面的bind_param调用外, 也有更直接方便的方法来传入参数, 如:

my $sth = $dbh->prepare("select * from tab
   where tname like ?");
$sth->bind_param(1, "", SQL_VARCHAR);
$sth->execute("TEMP%");
......
$dbh->do("insert into test (col1) values (?)", 123);
......

    不管何种语言, 这一块的处理基本相同, Java中也是以问题来代表一个动态值的.

留言 (1)

角本 -》“脚本”
问题 -》 问号

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • Go straight ahead and turn left at the second crossing.
  • 一直往前走, 在第二个十字路口往左拐.
  • Excuse me. Can you tell me how to get to Mr. Hu's restaurant?
  • 对不起, 你能告诉我怎么去胡先生的餐馆吗?
  • Go on for about 100 meters. It's on your left side. You can't miss it.
  • 往前走约100米, 在你左手边, 你不会错过的.
  • Which one is Mr. Jame's office?
  • 哪间是詹姆司先生的办公室?
  • It's Room 201 on the second floor.
  • 二楼201房间.