Arrays postgresql insert语句中的perl数组
我想我的代码中有一个逻辑问题。我有一个带有模板、值、行、列的mongodb。例如$record->{template}它是T1和$record->{column}1和$record->{row}我有一些日期(“d.m.Y”)。我需要根据$record->{row}和$record->{column}排列@insert_数据值 问题是我不能在insert语句中使用@insert_data[1]或@insert_data[2]或..等,但我不明白为什么,也不明白如何解决我的问题Arrays postgresql insert语句中的perl数组,arrays,perl,postgresql,mongodb,if-statement,Arrays,Perl,Postgresql,Mongodb,If Statement,我想我的代码中有一个逻辑问题。我有一个带有模板、值、行、列的mongodb。例如$record->{template}它是T1和$record->{column}1和$record->{row}我有一些日期(“d.m.Y”)。我需要根据$record->{row}和$record->{column}排列@insert_数据值 问题是我不能在insert语句中使用@insert_data[1]或@insert_data[2]或..等,但我不明白为什么,也不明白如何解决我的问题 while (my
while (my $record = $collection->next){
if($record->{template} eq "T1"){
my @insert_data;
if($record->{column} == 1 and $record->{row} != 0){
#my @insert_data[1] = $record->{VALUE};
}
if($record->{column} == 2 and $record->{row} != 0){
#my @insert_data[2] = $record->{VALUE};
}
if($record->{column} == 3 and $record->{row} != 0){
#my @insert_data[3] = $record->{VALUE};
}
if($record->{column} == 4 and $record->{row} != 0){
#my @insert_data[4] = $record->{VALUE};
}
if($record->{column} == 5 and $record->{row} != 0){
#my @insert_data[5] = $record->{VALUE};
}
if($record->{column} == 6 and $record->{row} != 0){
#my @insert_data[6] = $record->{VALUE};
}
$stmt->execute(@insert_data[1],@insert_data[2],@insert_data[3],@insert_data[4],@insert_data[5],@insert_data[6],$record->{template});
} elsif($record->{template} eq "T5"){
} elsif($record->{template} eq "T10"){
}
}
}
谢谢 我注意到您没有给我们任何错误消息,但我认为这些信息可能有用:
@array\u name[integer]
是一个单元素数组切片。
$array\u name[integer]
是数组中的标量值
我建议您将值传递到
execute
语句中,而不是数组。我注意到您没有给我们任何错误消息,但我认为这些信息可能有用:
@array\u name[integer]
是一个单元素数组切片。
$array\u name[integer]
是数组中的标量值
我建议您将值传递到
execute
语句中,而不要传递数组。如果将数组的连续槽传递给方法,那么这样做就大错特错了。您永远不需要将func($a[1]、$a[2]、…$a[n]、…
传递给子对象。单独传递它们将确保使用参数槽,这样您可能不会比预期更早地遇到$record->{template}
,但也会遇到切片表示法。(@a[1..6]
)
除非您正在执行Perl 6(不是),否则数组的插槽都是标量,因此需要标量符号($
)来分配给插槽
如:$insert_data[1]
此外,在遗留COBOL之外的任何地方,这段代码都是可怕的:在任何现代语言中,您都不需要分支来访问结构
my $col = $record->{column}; # cache frequently referenced item.
if ( $record->{row} != 0 and $col > 0 and $col < 7 ) {
$insert_data[ $col ] = $record->{VALUE};
}
请记住,切片表示法(@a[$i..$j]
)意味着它将发送6个位置值作为参数。这可能很重要,因为在您的实现和我的实现中,如果$record->{column}
为1,那么数组就是[unde,$record->{VALUE}]
;它只包含两个元素,分别位于偏移量0和偏移量1处
如果没有切片表示法,您将在$record->{template}
之前传递两个参数,这可能是意外的。但是切片表示法确保数组中实际分配了多少个插槽,结果表达式将占据6个位置(其中5个为undef
)
但最重要的是,对于像你这样的新手,通常:
use strict;
use warnings;
这需要放在代码的顶部。如果你不理解一个导致脚本死机的错误,你可以很容易地在perlfaq
中查找它,用谷歌搜索解决方案也很容易
如果您不理解警告
发出的消息,也可以在代码顶部插入此库:
use diagnostics -verbose;
这可能会给你比你想读的更多的解释。如果你将数组的连续槽传递给一个方法,你就大错特错了。你不应该需要传递
func($a[1],$a[2],…$a[n],…
传递给子对象。单独传递它们将确保使用参数槽,这样您可能不会比预期更早遇到$record->{template}
,但切片表示法也会如此。(@a[1..6]
)
除非您正在执行Perl 6(不是),否则数组的插槽都是标量,因此需要标量符号($
)来分配给插槽
如:$insert_data[1]
此外,在遗留COBOL之外的任何地方,这段代码都是可怕的:在任何现代语言中,您都不需要分支来访问结构
my $col = $record->{column}; # cache frequently referenced item.
if ( $record->{row} != 0 and $col > 0 and $col < 7 ) {
$insert_data[ $col ] = $record->{VALUE};
}
请记住,切片表示法(@a[$i..$j]
)意味着它将发送6个位置值作为参数。这可能很重要,因为在您的实现和我的实现中,如果$record->{column}
为1,那么数组就是[unde,$record->{VALUE}]
;它只包含两个元素,分别位于偏移量0和偏移量1处
如果没有切片表示法,您将在$record->{template}
之前传递两个参数,这可能是意外的。但是切片表示法确保数组中实际分配了多少个插槽,结果表达式将占据6个位置(其中5个为undef
)
但最重要的是,对于像你这样的新手,通常:
use strict;
use warnings;
这需要放在代码的顶部。如果你不理解一个导致脚本死机的错误,你可以很容易地在perlfaq
中查找它,用谷歌搜索解决方案也很容易
如果您不理解警告
发出的消息,也可以在代码顶部插入此库:
use diagnostics -verbose;
这可能会给你比你想读的更多的解释。最好在
$stmt->execute
之后添加检查
$stmt->execute(@insert_data[1..6], $record->{template}) or die $stmt->errstr;
使用strict;
也会有帮助。在$stmt->execute
之后添加检查将非常有用
$stmt->execute(@insert_data[1..6], $record->{template}) or die $stmt->errstr;
使用strict;
也会有帮助。谢谢你的回答。我理解错的地方和其他解释。如果你能帮助我,我还有一个问题……我忘了提到所有数据都是相关的。我需要在同一行插入所有数据。例如:$record->{row}=1和$record->{column}[1..6]=我的postgresql数据库中有一条记录。现在,postgresql中有6条记录。谢谢你的回答。我理解错在哪里以及其他解释。如果你能帮助我,我还有一个问题…我忘了提到所有数据都是相关的。我需要在同一行中插入所有数据。例如