perl DBI是否支持像@file_name这样的命令?

时间:2015-11-06 04:49:25

标签: perl dbi

我想运行放在1.sql文件中的命令这是我的代码:

$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

2 个答案:

答案 0 :(得分:1)

不,那不会起作用(显然)。一些DBI驱动程序支持多个语句(通过ODBC可以想到MySQL和SQL Server),但我不认为Oracle会这样做。无论如何,您仍然需要自己处理文件读取部分。正如您在DBI docs中看到的那样,do()期待一个有效的SQL语句,字符串@1.sql不是。

答案 1 :(得分:1)

从Perl执行SQL文件的基本选项是:

自行拆分SQL文件,然后执行每个语句。

如果您控制了该文件,并且知道它不会包含任何棘手的内容,那么这是一项相当容易的任务。它可以像基于分号字符拆分文件一样简单,或者您可能希望首先添加一些基本的注释摘录。

但是,对于所有可能的文件内容,这很难100%正确地做(如果SQL语句有一个包含分号的字符串怎么办?如果有嵌套的注释集怎么办?等等)。这需要完全解析文件 - 而且我不知道任何允许您轻松完成此任务的工具。有一个SQL::Parse模块,但我认为它不会处理多个语句。

从Perl调用外部程序为您完成。

例如,调用Oracle命令行客户端。这很容易,但您无法精确控制正在执行的语句。