2012-03-08 88 views
2

我想複製表中的單個記錄,修改記錄中的某些字段並插入到同一個表中。該表有90列。Perl DBI插入並選擇

想到在一條語句中使用insert..select,但有90列,我需要在選擇查詢中告訴列名。我如何在perldbi中以更好的方式做到這一點。請給我一個例子。

回答

3

獲取和使用NAME statement attribute

my $sth = $dbh->prepare('SELECT * FROM my_table where 1=0'); 
$sth->execute; 
my $cols = $sth->{NAME}; 

然後使用$的cols來構建你的INSERT ...選擇使用一些替代函數注入在選擇你的修改緩存爲您的表中的列名。

my %mods_for_column = ('foo' => 'foo+10', 'bar' => 'trim(bar)'); 
my $inscols = join(',', @$cols); 
my $selcols = join(',', 
    map { exists($mods_for_column($_)) ? $mods_for_column($_) : $_ } @$cols 
); 
my $sql = "insert into my_table ($inscols) select $selcols from my_table where mumble..."; 
+0

這應該是'$ mods_for_column {$ _}'而不是'mods_for_column($ _)'。在那裏隱藏着一個令人討厭的bug。如果'%mods_for_column'包含'baz => 0'呢?更好地使用「存在」而不是檢查真相。 – 2012-03-08 09:41:13

+0

非常感謝您的信息。我想用foo取代'foo'=>'0'。 foo是表格中的數字字段。當我在地圖中有零時它不工作。 – Arav 2012-03-08 23:10:26

+0

@davorg:這就是我沒有嘗試輸入代碼的原因:(我編輯了包含你的建議的示例 – dbenhur 2012-03-10 23:41:01