2014-09-12 3 views
0

Моя проблема заключается в использовании perl для загрузки локального файла в базу данных db2. содержимого файла так же, как:Использование perl не может загрузить файл

john|man|eight|usa 
pis|woman|seven|china 

раскола по «|», я просто хочу загрузить его в базу данных DB2. Вот код:

use strict; 
use DBI; 
use DBD::DB2; 

sub main { 
    $dbh = getConnect($dataSource); 
    if (defined $dbh) { 
     print "success\n"; 
    } else { 
     print "failed。\n"; 
     exit(1); 
    } 
    print "loading file……\n"; 

    run_sql(); 

    return closeConnect($dbh); 
} 

sub run_sql { 
    my $sqlStr = ""; 

    $sqlStr = " 
load from '$DATA_FILE' of del modified by codepage=1208 coldel| insert into $TABLE 
" 
     ; 
    print "$sqlStr \n"; 
    my $sth = $dbh->prepare($sqlStr) or return $FALSE; 
    my $ret = $sth->execute(); 
    $sth->finish(); 
    if ($ret) { 
     print "success!"; 
     return $TRUE; 
    } else { 
     print "failed!"; 
     exit(1); 
    } 

} 
main(); 

, когда я запустить этот сценарий, он cant't work.can someboday помочь мне!

+1

Что такое сообщение об ошибке? Является ли инструкция LOAD фактически понятной DB2, или она имитируется средствами клиентского интерфейса? (Если вы использовали Informix, вы бы так не могли LOAD, это утверждение, что различные интерфейсные модули моделируют, считывают файл, разбивают данные и кодируют инструкцию INSERT, используя, конечно, заполнители, чтобы получить данные в базу данных.) Ваш скрипт неполный; вы не показываете '$ dataSource', но это, вероятно, не имеет значения. Вы должны убедиться, что у вас есть ошибки печати DBI. Вам, вероятно, не нужно использовать DBD :: DB2; '- просто использовать DBI;' достаточно. –

+0

сообщение об ошибке: load from 'd: \ tpa_link.sum.txt' of del, измененный copdeage = 1028 coldel | Вставить в sdata.dbo.tpa_link_sum DBD :: DB2 :: st выполнить не удалось: [IBM] [драйвер CLI] [DB2/NT] SQL0104N SQLSTATE = 42601 – John

+0

Это выглядит как возможное значение для расширенного оператора, а не сообщения об ошибке. Это должно иметь пятизначное значение SQLSTATE и некоторый текст, описывающий проблему. По крайней мере, используйте '$ dbh -> {PrintError} = 1;', чтобы включить отчет об ошибках из DBI. Рассмотрим работу с DBI_TRACE = 3 или даже выше (9?) И анализ того, что он говорит. –

ответ

0

LOAD не является заявление SQL, который может быть получен, так что это не может быть выполнено с помощью DBI (или любой другой SQL-только интерфейс (например, JDBC). LOAD это утилита, что CLP DB2 знает, как выполнить.

Если вы можете выполнить только с помощью SQL, вы могли бы рассмотреть вопрос об использовании ADMIN_CMD to call the LOAD utility для вас, но это имеет недостаток в том, что он требует, чтобы файл данных будет находиться на сервере базы данных.

в качестве альтернативы вы можете рассмотреть вопрос о попытке использовать perl's system() вызов для использования DB2 CLP. This SO answer shows how для этого. Обратите внимание, что если ваш файл данных не находится на e сервер базы данных, вам необходимо убедиться, что вы указываете CLIENT в своем заявлении на загрузку (т. LOAD CLIENT from $datafile ...)

 Смежные вопросы

  • Нет связанных вопросов^_^