perl DBI 支持@file_name 这样的命令吗?

Does perl DBI support command like this @file_name?

我想要 运行 放在 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

不,那行不通(显然)。一些 DBI 驱动程序支持多语句(想到通过 ODBC 的 MySQL 和 SQL 服务器),但我认为 Oracle 不支持。无论如何,您仍然必须自己处理文件读取部分。正如您在 DBI docs 中看到的那样,do() 需要一个有效的 SQL 语句,而字符串 @1.sql 不是。

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

自己拆分SQL文件然后执行每条语句

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

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

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

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