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命令行客户端。这很容易,但您无法对正在执行的语句进行精细控制。
我想要 运行 放在 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命令行客户端。这很容易,但您无法对正在执行的语句进行精细控制。