2012-04-18 50 views
1

我正在將與Sybase交互的Perl腳本從DBLIB DB接口遷移到CTLIB。 DBLIB和CTLIB都支持nsql方法。通過使用nsqlnsql查詢後Sybase :: CTLib(Perl)中的列(字段)名稱

$qry = 'Select * from A'; 
@data = $dbh->nsql($qry,{}); 
$string = $dbh->dbcolname($colid) 

我怎麼能在CTLIB得到列名 -

在DBLIB我可以使用nsql得到列名這樣的嗎?

$qry = 'Select * from A'; 
@data = $dbh->nsql($qry,"ARRAY"); 
#Replacement of dbcolname? 

有一種方法來獲取列名,如果我從nsql請求散列而不是ARRAY。他們的哈希鍵是列名。但是我只想用ARRAY調用來獲取字段名稱。

回答

0

在CTlib中沒有原生的方法。唯一的解決辦法是重寫你自己的版本的NSQL。它可以從CTLib的源頭分支出來。

0

對於DBI是:

$sth = $dbh->prepare($query) or die "Prepare exception: $DBI::errstr"; 
$rv = $sth->execute() or die "Execute exception: $DBI::errstr"; 
$res = $sth->fetchall_arrayref();      

# Array reference with cols captions, which were retrived 
$names = $sth->{NAME};   

# Array reference with types of cols, which were retrived   
$types = $sth->{TYPE};        
$sth->finish(); 

對於的Sybase :: CTLIB試>>

@names = $dbh->ct_col_names

檢索當前查詢的列名。如果當前查詢不是select語句,則返回一個空數組。

@types = $dbh->ct_col_types([$doAssoc])

檢索列類型當前正在執行的查詢。如果$ doAssoc不爲0,則返回一個散列(又名關聯數組),其列名稱/列類型對。


@dat = $dbh->dbnextrow([$doAssoc [, $wantRef]])

檢索一行。 dbnextrow()返回一個標量數組,每個列值一個。如果$ doAssoc不爲0,則dbnextrow()會返回一個散列(又名關聯數組),其中列名稱爲 /值對。這減輕了程序員不必調用dbbind()或dbdata()。

+0

感謝您的回答。這適用於DBI。但由於項目限制,我不能使用DBI。我正在尋找CTLib解決方案。 – Mohit 2012-04-18 14:13:43

+0

@MohitJain - 查看我的更新回答 – 2012-04-18 14:26:53

+0

剛剛嘗試過。但是這些方法不適用於nsql。它們與ct_execute和ct_results一起工作良好。 – Mohit 2012-04-18 14:47:46