2015-11-06 59 views
0

我想運行這是擺在1.SQL文件時,此命令是我的代碼:perl DBI支持這樣的@file_name命令嗎?

$sth=$dbh->do(q { @1.sql }); 

但這種代碼是不工作:

有輸出:

DBI::db=HASH(0xf18edc0) trace level set to 0x0/2 (DBI @ 0x0/0) in DBI 1.634-ithread (pid 10389) 
    -> do in DBD::_::db for DBD::Oracle::db (DBI::db=HASH(0xf18ee50)~0xf18edc0 ' @1.sql ') thr#eebf010 
    dbd_st_execute (STMT TYPE 0) (out0, lob0)... 
Statement Execute Mode is 32 (COMMIT_ON_SUCCESS) 
    -> DESTROY for DBD::Oracle::st (DBI::st=HASH(0xf18f190)~INNER) thr#eebf010 
     ERROR: 900 'ORA-00900: invalid SQL statement (DBD ERROR: error possibly near <*> indicator at char 1 in ' <*>@1.sql ')' (err#1) 
    <- DESTROY= undef at run.pl line 12 
    !! ERROR: 900 'ORA-00900: invalid SQL statement (DBD ERROR: error possibly near <*> indicator at char 1 in ' <*>@1.sql ')' (err#0) 
    <- do= undef at run.pl line 12 
DBD::Oracle::db do failed: ORA-00900: invalid SQL statement (DBD ERROR: error possibly near <*> indicator at char 1 in ' <*>@1.sql ') [for Statement " @1.sql "] at run.pl line 12. 
DBD::Oracle::db do failed: ORA-00900: invalid SQL statement (DBD ERROR: error possibly near <*> indicator at char 1 in ' <*>@1.sql ') [for Statement " @1.sql "] at run.pl line 12. 
! -> DESTROY for DBD::Oracle::db (DBI::db=HASH(0xf18edc0)~INNER) thr#eebf010 
     ERROR: 900 'ORA-00900: invalid SQL statement (DBD ERROR: error possibly near <*> indicator at char 1 in ' <*>@1.sql ')' (err#0) 
! <- DESTROY= undef during global destruction 

回答

1

不,這不起作用(顯然)。某些DBI驅動程序支持多種語句(通過ODBC想到MySQL和SQL Server),但我不認爲Oracle會這樣做。無論如何,你仍然必須自己處理文件閱讀部分。正如您在DBI docs中看到的那樣,do()正在等待有效的SQL語句,其中字符串@1.sql不是。

1

你從Perl中執行SQL文件的基本選項:

斯普利特SQL文件自己,然後執行每個語句。

如果你有控制文件並知道它不會包含任何棘手的問題,這是一個相當簡單的任務。它可以像根據分號字符分割文件一樣簡單,或者您可能希望首先添加一些基本的註釋。

但是,對於全部可能的文件內容(如果SQL語句包含一個包含分號的字符串呢?如果有嵌套的註釋集等)會很難正確完成100%。這需要完全解析文件 - 我不知道有任何工具可以讓您輕鬆完成此操作。有一個SQL::Parse模塊,但我認爲它不處理多個語句。

從Perl調用外部程序爲您做。

例如,調用Oracle命令行客戶端。這很容易,但是您沒有對正在執行的語句進行精細控制。