我在Perl中运行DBI并且无法弄清楚当我运行预准备语句时,我可以判断返回的行数是否为0.
我意识到我可以在我的while循环中设置一个计数器来获取我的行,但我希望有一个不那么难看的方法.
我在Perl CGI脚本中运行SQLite数据库,DBD :: SQLite正在访问该脚本.这是在Apache上作为直接CGI运行的.
DBI连接正常,选择能够运行.但是,当我尝试插入时,我得到一个带有以下错误的骰子:
DBD::SQLite::st execute failed: unable to open database file(1) at dbdimp.c line 402 at index.cgi line 66
Run Code Online (Sandbox Code Playgroud)
我已经尝试将数据库文件权限更改为666以尝试修复此问题,但我仍然收到错误.
有什么建议?
我正在尝试使用Strawberry Perl中的CPAN shell 安装DBD :: Oracle.我最初遇到错误,因为Makefile找不到OCI库,所以我从Oracle安装了即时客户端.我认为这将解决这个问题,但现在我得到的错误和警告的大混合物中Oracle.h,dbdimp.h,Oracle.c,Oracle.xsi,和Oracle.xs.
有关如何进行的任何建议?我的计算机上现有的Oracle软件是否存在问题?我对Perl相当新,所以任何帮助都表示赞赏.
编辑 - 我将以下整个输出包括在内:
cpan> install DBD::Oracle
Database was generated on Fri, 04 Dec 2009 16:12:46 GMT
Running install for module 'DBD::Oracle'
Running make for P/PY/PYTHIAN/DBD-Oracle-1.23.tar.gz
Checksum for C:\strawberry\cpan\sources\authors\id\P\PY\PYTHIAN\DBD-Oracle-1.23.tar.gz ok
Scanning cache C:\strawberry\cpan\build for sizes
...............................................................-------------DONE
CPAN.pm: Going to build P/PY/PYTHIAN/DBD-Oracle-1.23.tar.gz
Multiple copies of Driver.xst found in: C:/strawberry/perl/site/lib/auto/DBI/ C:\strawberry\perl\vendor\lib/auto/DBI/ at Makefile.PL line 37
Using DBI 1.609 (for perl …Run Code Online (Sandbox Code Playgroud) 这是一个难以解释的(并且非常奇怪),所以请耐心等待.我将解释这个问题,并解决它,但我想看看是否有人可以解释为什么它的工作方式:)
我有一个使用mod_perl的Web应用程序.它使用MySQL数据库,我定期将数据写入数据库.它是模块化的,因此它也有自己的"数据库"类型的模块,我处理连接,更新等.database :: db_connect()子例程用于连接数据库,并AutoCommit设置为0.
我创建了另一个Perl应用程序(独立守护程序),它定期从数据库中提取数据,并根据返回的数据执行各种任务.我在其中包含了database.pm模块,所以我不必重写/复制所有内容.
我遇到的问题是:
应用程序在启动时连接到数据库,然后永远循环,每隔X秒从数据库中获取数据.但是,如果数据库中的数据被更新,我的应用程序仍然会返回"旧"数据,这是我对数据库的初始连接/查询.
例如 - 我有3行,"Name"列的值为'a','b'和'c' - 用于每条记录.如果我更新其中一行(例如,从命令行使用mysql客户端)并将名称从"c"更改为"x",我的独立守护程序将无法获取该数据 - 它仍然会返回/ b/c MySQL的.我用tcpdump捕获了数据库流量,我肯定可以看到MySQL确实正在返回那些数据.我也尝试过将SQL_NO_CACHE与SELECT一起使用(因为我不知道发生了什么),但这也无济于事.
然后,我修改了我的独立守护进程中的数据库连接字符串,并设置AutoCommit为1.突然,应用程序开始获取正确的数据.
我很困惑,因为我认为AutoCommit只影响INSERT/UPDATE类型的语句,并且对SELECT语句没有影响.但它看起来确实如此,我不明白为什么.
有没有人知道为什么SELECT语句在AutoCommit设置为0 时不会从数据库返回'updated'行,为什么在AutoCommit设置为1 时它会返回更新的行?
这是我在独立守护程序中使用的简化(取出错误检查等)代码,并且不返回更新的行.
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
use Data::Dumper;
$|=1;
my $dsn = "dbi:mysql:database=mp;mysql_read_default_file=/etc/mysql/database.cnf";
my $dbh = DBI->connect($dsn, undef, undef, {RaiseError => 0, AutoCommit => 0});
$dbh->{mysql_enable_utf8} = 1;
while(1)
{
my $sql = "SELECT * FROM queue";
my $stb = $dbh->prepare($sql);
my $ret_hashref = $dbh->selectall_hashref($sql, "ID");
print Dumper($ret_hashref);
sleep(30); …Run Code Online (Sandbox Code Playgroud) 我有这个问题 select * from table where ID in (1,2,3,5...)
如何使用占位符与DBI构建此查询?
例如 :
my @list = (1, 2, 3, 4, 5);
my $sql = "select * from table where ID in (?)";
$sth->prepare($sql);
$sth->execute();
Run Code Online (Sandbox Code Playgroud)
我应该发送什么参数来执行?它是一个由,其他东西分隔的列表或字符串吗?
有没有办法以编程方式发现 ODBC 连接的命名参数?
例如,使用“ODBC Driver 17 for SQL Server”,ODBC 数据源管理器(在 Windows 中)允许使用“登录 ID”和“密码”进行身份验证,但是在以编程方式连接时,我们需要分别使用uid=和pwd=。这两个配置点在配置文档(例如https://db.rstudio.com/databases/microsoft-sql-server/)中明确列出,但驱动程序支持的其他几个配置选项较少或不- 记录。
(对于 SQL Server,还有更多文档,包括https://docs.microsoft.com/en-us/sql/connect/odbc/windows/driver-aware-connection-pooling-in-the-odbc-driver-for -sql-server?view=sql-server-ver15,列出了其他几个参数(尽管不是它们可能的值)。这适用于这个驱动程序,但由于此页面尚未针对驱动程序 17 更新,我们必须假设所有选项不变。)
可以通过编程方式了解哪些驱动程序可用,以及哪些预定义数据源可用:
odbc::odbcListDrivers()
# name attribute value
# ...truncated...
# 33 ODBC Driver 17 for SQL Server UsageCount 1
# 34 ODBC Driver 17 for SQL Server APILevel 2
# 35 ODBC Driver 17 for SQL Server ConnectFunctions YYY
# 36 ODBC Driver 17 for SQL Server CPTimeout 60 …Run Code Online (Sandbox Code Playgroud) 我知道:
$sth->fetchrow_hashref 从数据库返回获取的行的hashref,$sth->fetchrow_arrayref 从数据库返回获取的行的arrayref,和$sth->fetchrow_array 从数据库返回获取的行的数组.但我想知道有关这些的最佳实践.我们什么时候应该使用fetchrow_hashref?什么时候应该使用fetchrow_arrayref?什么时候应该使用fetchrow_array?
我有用户ID,密码,数据库名称和数据源详细信息.我想与Perl连接到MSSQL服务器.我刚刚使用了以下代码段,但是我收到了错误消息.
#!/usr/bin/perl -w
use strict;
use DBI;
my $data_source = q/dbi:ODBC:192.168.3.137/;
my $user = q/bharani/;
my $password = q/123456/;
# Connect to the data source and get a handle for that connection.
my $dbh = DBI->connect($data_source, $user, $password)
or die "Can't connect to $data_source: $DBI::errstr";
Run Code Online (Sandbox Code Playgroud)
我的错误是:
DBI connect('192.168.3.137','bharani',...) failed: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (SQL-IM002) at my sqlconnect.pl line 14
Can't connect to dbi:ODBC:192.168.3.137: [Microsoft][ODBC Driver Manager] Data source name not found …Run Code Online (Sandbox Code Playgroud) 我不能%ENV在我的Perl脚本上使用var来使用Oracle库.
BEGIN {
$ORACLE_HOME = "/usr/lib/oracle/10.2.0.3/client64";
$LD_LIBRARY_PATH = "$ORACLE_HOME/lib";
$ORACLE_SID="prod";
$ENV{ORACLE_SID}=$ORACLE_SID;
$ENV{ORACLE_HOME}= $ORACLE_HOME;
$ENV{LD_LIBRARY_PATH}= $LD_LIBRARY_PATH;
};
Run Code Online (Sandbox Code Playgroud)
如果我打印$ENV{'ORACLE_HOME'},$ENV{'LD_LIBRARY_PATH'}一切似乎没问题但是,当我运行我的脚本时,我有错误:
install_driver(Oracle)失败:无法为模块DBD加载'/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so':: Oracle:libclntsh.so.10.1:无法打开共享对象文件:否这样的文件或目录位于/usr/lib64/perl5/DynaLoader.pm第200行.(eval 3)第3行编译在(eval 3)第3行的require中失败.也许在预期的地方没有安装所需的共享库或dll在persistence.perl第22行
在网上搜索我发现在Perl上设置env变量的正确方法是使用%ENVhash.
导出ORACLE_HOME并LD_LIBRARY_PATH通过unix shell(export LD_LIBRARY_PATH=...)它可以正常工作.有什么建议?
一位同事告诉我,执行SQL语句总是将数据放入RAM/swap由数据库服务器.因此,选择大的结果集是不实际的.
我以为这样的代码
my $sth = $dbh->prepare('SELECT million_rows FROM table');
while (my @data = $sth->fetchrow) {
# process the row
}
Run Code Online (Sandbox Code Playgroud)
逐行检索结果集,而不将其加载到RAM.但我在DBI或MySQL文档中找不到任何引用.结果集是如何真正创建和检索的?它对简单的选择和连接是否有效?