我试图准备一个 pragma 语句:
$sth = $dbh->prepare (q{pragma table_info(?)})
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
DBD::SQLite::db prepare failed: near "?"
Run Code Online (Sandbox Code Playgroud)
准备字符串有什么问题?
我正在尝试创建一个包含两个表的数据库:客户和交易(一个客户可以做很多交易,一个交易只能由一个客户完成)。我正在使用以下 Perl 代码:
my $dbh = DBI->connect("dbi:SQLite:dbname=$RealBin/active.db","","")
or die $DBI::errstr;
my @ddl = (
"CREATE TABLE IF NOT EXISTS customer (
id INTEGER PRIMARY KEY UNIQUE,
id_1 INTEGER,
id_2 INTEGER,
name TEXT
)",
"CREATE TABLE IF NOT EXISTS transaction (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER REFERENCES customer(id),
)"
);
for my $sql (@ddl){
$dbh->do($sql);
}
Run Code Online (Sandbox Code Playgroud)
当我运行我的脚本时,我收到以下错误:
DBD::SQLite::db do failed: near "transaction": syntax error at
t/oneToMany.t line 28 (#1)
DBD::SQLite::db do failed: near "transaction": syntax error at t/oneToMany.t line …Run Code Online (Sandbox Code Playgroud) 我需要使用DBI连接对象序列化一个数组,以使用共享内存与其他进程共享.但反序列化不起作用.
使用可存储的qw /冻融/;
my @connections;
for(my $c = 0;$c < 5;$c++) {
my $conn = DBI->connect($dsn,$user,$password,{'AutoCommit' => 1, 'RaiseError' => 1, 'PrintError' => 0});
push(@connections,$conn);
}
my $shm = freeze(@connections);
my $obj = thaw($shm);
Run Code Online (Sandbox Code Playgroud)
返回错误:全局符号
"$ drh"需要明确的包名(您是否忘记在(eval 33)第6行声明"我的$ drh"?).
我正在尝试这样做,但它不起作用
my $sql2 = "SELECT CODE_ID,NAME_CODE,SUM(INR_COL + OUT_COL) AS \"TOTAL SUM\" FROM nwsa WHERE trunc(REPORT_DATE) = to_date('?','dd-mm-yyyy')AND CODE_ID IN (?,?,?,?,?,?,?,?,?,?,?)GROUP BY CODE_ID,NAME_CODE";
$sth ->prepare($sql2);
my $t= "06-01-2017";
$sth->execute($t,'A12A','A12B','A12C','A12D','A12E','A12EB','A12F','A12G','A12I','A12O','A12U');
Run Code Online (Sandbox Code Playgroud) 我在尝试将数据插入表中时遇到奇怪的错误,同时处理从不同表中获取的数据:
DBI::st=HASH(0x56261b345948)->_prepare(...): attribute parameter '0' is not a hash ref at /usr/lib/x86_64-linux-gnu/perl5/5.24/DBD/Pg.pm line 277.
Run Code Online (Sandbox Code Playgroud)
似乎导致它的行是上面代码片段中的$ dbh-> do():
my $sth = $dbh->prepare(
"SELECT (name, model), serial, firmware, timestamp FROM devicelog
WHERE id = $id AND fleet = $fleet AND timestamp >
(SELECT timestamp FROM devicelog WHERE fleet = $fleet AND id = $id ORDER BY timestamp DESC LIMIT 1)
- INTERVAL '50 seconds'"
);
$sth->execute();
while (my @row = $sth->fetchrow_array())
{
if (param('savetemplate'))
{
$dbh->do('INSERT INTO template (fleet, id, name, model, …Run Code Online (Sandbox Code Playgroud) 嘿,我正在编写一个需要从数据库获取数据的 perl 脚本。但是当我得到一个返回值时,它会返回到一个数组中,所以我取消引用它。但它仍然什么也没打印出来。我在 sqlplus 中运行了该命令,它在那里工作没有问题。我不知道如何解决这个问题
代码:
my $sth = $dbh->prepare("select XMLRECORD from F_COMPANY") or
die "Couldnt prepare statement: " . $dbh->errstr;
$sth->execute();
# loop through the returned data
while( my ($row) = $sth->fetchrow_array()){
print "@$row\n";
}
Run Code Online (Sandbox Code Playgroud)
输出:实际上什么都没有
有一些使用DBI模块的Perl代码 - (代码在工作,如果需要我可以在早上发布) - 但主要是试图了解DBI需要对行进行更新 - 以及得到错误,或确认已执行UPDATE.
(下面只是一个基本的例子,如果你愿意,可以随意提供自己的示例和示例DDL ...只需要一些我知道的代码.我通过Perl PtkDB调试器运行我的代码,并且可以"看到"它生成并执行的SQL - 甚至粘贴在MySQL consol中并执行它......但它在Perl中什么都不做,甚至认为select语句正在工作.主要是想更好地了解DBI如何处理UPDATE到MySQL,如果DBI中有任何内置功能可以使调试更加简单.谢谢!)
所以,请提供一个完整的Perl脚本:
样本表
<COL01>Id <COL02>FirstName <COL03>LastName
<ROW01-COL01>1 <ROW01-COL02>John <ROW01-COL03>Smith
<ROW02-COL01>2 <ROW02-COL02>Jane <ROW02-COL03>Doe
Run Code Online (Sandbox Code Playgroud)
更新(1):有问题的代码如下.我改变的唯一的事情是删除与问题和配置信息无关的代码(例如数据库名称,用户,密码等),并使变量的值生成超级简单.此代码由其他人和遗留代码库创建.
use strict;
use warnings;
use DBI;
sub dbOpen {
my $dsn;
my $dbh;
$dsn = "DBI:mysql:database=databasename;host=localhost;port=3306";
$dbh = DBI->connect( $dsn, "root", "password" ) ||
print STDERR "FATAL: Could not connect to database.\n$DBI::errstr\n";
$dbh->{ AutoCommit } = 0;
return($dbh);
} # END sub dbOpen
my $Data;
$Data = &dbOpen();
my …Run Code Online (Sandbox Code Playgroud)