如何使用Perl连接到SQL Server

如何使用Perl连接到SQL Server,sql,oracle,perl,Sql,Oracle,Perl,我是Perl新手,正在尝试创建一个脚本,该脚本连接到我的Oracle SQL Server数据库,并通过电子邮件返回表查询的结果。我的数据库连接部分有问题。你知道我该从哪里开始吗?任何示例代码都将不胜感激。谢谢,下面是一些使用Perl DBI模块连接到Oracle的示例代码。根据需要调整数据库名称、用户名和密码 #!/usr/bin/perl use strict; use DBI; my $dbName = 'mydb'; my $username = 'username'; my $pas

我是Perl新手,正在尝试创建一个脚本,该脚本连接到我的Oracle SQL Server数据库,并通过电子邮件返回表查询的结果。我的数据库连接部分有问题。你知道我该从哪里开始吗?任何示例代码都将不胜感激。谢谢,

下面是一些使用Perl DBI模块连接到Oracle的示例代码。根据需要调整数据库名称、用户名和密码

#!/usr/bin/perl
use strict;
use DBI;

my $dbName = 'mydb';
my $username = 'username';
my $password = 'password';
my $options =  { RaiseError => 1 };
my $dbh = DBI->connect("dbi:Oracle:${dbName}", $username, $password, $options);

$dbh是一个数据库句柄,可用于执行所有您喜欢的查询。有关可用方法的简要说明,请参阅at CPAN。

首先,您应该了解文件,它以

ORA11 =
 (DESCRIPTION = 
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.0)(PORT = 1521))
   )
 (CONNECT_DATA =
   (SERVICE_NAME = ORA12)
 )
)
如果您恰好在不同的计算机上,请检查服务器主机上的上述连接

现在您可以使用ORA11作为数据库名称

  my $DB = DBI->connect(
    "dbi:Oracle:",
    "USER/PASSWORD\@ORA11",
    "",
    {
      # ChopBlanks => 1,
      # AutoCommit => 0,
    },
  );
或者使用完整的连接字符串而不是ORA11:


更多的连接选项可以在

中找到,我有几十个执行Oracle、Sybase和MS SQL查询的脚本;甚至有些脚本在多个数据库上执行查询并合并结果,或者基于先前查询的结果为一个数据库构建查询。。。但是,在经过了许多天的努力之后,Perl库才能发挥良好的作用

对于我们这些真正的黑客来说,我们首先使用Oracle SQL命令行客户端sqlplus.exe,这使得这种方法很简单,但远远不够漂亮:

my $run_sql = 'sqlplus.exe -s DBuser/DBpwd@DBname < SQLfile.sql';
my $SQLfile = "temp.sql"; 

sub GET_EMP_LIST
{
  my $status = $_[0];
  my $sql_text = "
  set linesize 150
  set pagesize 0
  set numf 99999999999
  set feedback off
  SELECT  
    EMP.FIRST          || ',' ||
    EMP.LAST           || ',' ||
    EMP.PHONE          || ',' ||
    EMP.SALARY
  FROM 
    PERSONNEL.EMPLOYEES  EMP
  WHERE
    (EMP.STATUS = '$status')
  \;";

  open (SQL, $FileOpenWrite, "$SQLfile");
  print SQL $sql_text;
  close (SQL_TEXT);
  my @Results = "$run_SQL";
  unlink $SQLfile;
  return @Results;
}

#MAIN

@Employees = GET_EMP_LIST "Active";
for (@Employees)
{
  my $temp = chomp $_;
  $temp =~ s/\s+//g;        #get rid of white spaces
  my ($FIRST, $LAST, $PHONE, $SALARY) = split /,/, $temp;

  .... do something with it ....
}
就像我说的,远不是很漂亮,但是快速简单,并且使用SQL查询工具,比如TOAD,您可以在集成到脚本之前在拖放程序中生成SQL


我知道很多人会说这是一个糟糕的解决方案,但我们引入了包含数十万行数据的数据。

试试看,你会发现一个例子,SQL Server是Microsoft的RDBMS的品牌,而不是Oracle的。根据我的经验,到目前为止,最难的部分是非perl部分:安装Oracle客户端库。我必须告诉库如何使用一个模糊的配置文件进行连接,并在DBI connect字符串中引用该配置,而不是像我希望的那样直接从perl脚本传递主机名和端口。Oracle构建起来非常困难,我最终通过DBD::ODBC进行路由,这涉及到与perl脚本相去甚远的更多配置。哦,我多么希望DBD::Oracle::PurePerlOracle和Microsoft SQL Server是两种不同的数据库产品。你在用哪一个?只是出于好奇,你想用什么操作系统连接?谢谢Kirby。当我从命令行运行这个perl脚本时,我收到了一条消息:无法通过包DBI找到对象方法connect也许您忘记加载DBI了?在main.pl第8行。你知道怎么解决吗?thanksI忽略了DBI的使用;线请查看更新的答案。还请记住,我的回答假设您已经安装了Oracle客户端库和Perl模块DBD::Oracle。不,我没有下载这些东西。。。我该怎么做?谢谢
my $run_sql = 'sqlplus.exe -s DBuser/DBpwd@DBname < SQLfile.sql';
my $SQLfile = "temp.sql"; 

sub GET_EMP_LIST
{
  my $status = $_[0];
  my $sql_text = "
  set linesize 150
  set pagesize 0
  set numf 99999999999
  set feedback off
  SELECT  
    EMP.FIRST          || ',' ||
    EMP.LAST           || ',' ||
    EMP.PHONE          || ',' ||
    EMP.SALARY
  FROM 
    PERSONNEL.EMPLOYEES  EMP
  WHERE
    (EMP.STATUS = '$status')
  \;";

  open (SQL, $FileOpenWrite, "$SQLfile");
  print SQL $sql_text;
  close (SQL_TEXT);
  my @Results = "$run_SQL";
  unlink $SQLfile;
  return @Results;
}

#MAIN

@Employees = GET_EMP_LIST "Active";
for (@Employees)
{
  my $temp = chomp $_;
  $temp =~ s/\s+//g;        #get rid of white spaces
  my ($FIRST, $LAST, $PHONE, $SALARY) = split /,/, $temp;

  .... do something with it ....
}