如何在 SQL 脚本中使用 Perl 变量(使用反引号)
Posted
技术标签:
【中文标题】如何在 SQL 脚本中使用 Perl 变量(使用反引号)【英文标题】:How to use a Perl variable in a SQL script (using backticks) 【发布时间】:2014-06-27 19:52:17 【问题描述】:我见过各种例子,但我无法使用 DBI。如何在外部 sql 脚本中使用 perl 变量?例如,我想要的 perl 脚本中的代码是:
$text = 'Germany';
@sql_output = `sqlplus -s user/pass\@databasename <<!
@/pathtofile/test.sql;
QUIT;
!`;
print @sql_output;
sql 脚本是:
SELECT DISTINCT City FROM Customers
Where Country = '$text'
(仅作为示例,我使用的代码来自w3schools.com sql教程http://www.w3schools.com/SQl/trysql.asp?filename=trysql_select_distinct)
我通过搜索找到的一个例子有:
@/pathtofile/test.sql $text;
但是当我用我的代码尝试它时它不起作用。这是将 perl 变量合并到外部 sql 脚本中的正确方法吗?
【问题讨论】:
为什么无法使用 DBI? +1,尽可能使用 DBI。 ***.com/questions/8966577/sqlplus-saving-to-file ***.com/questions/15253440/… DBI 和 DBD::Oracle 是否安装正确?你能成功运行“perl -e 'use DBI; use DBD::Oracle; print'”吗?说真的,不要做你在上面做的事情。使用 DBI。花时间解决这些问题非常值得。 DBD-Oracle 很棒。它利用 OCI 并可以执行批量插入/更新等操作。 【参考方案1】:-
定义替换变量
根据您的 test.sql 的内容在此处的文档中使用它们
保存到 test.sql
执行反引号命令
或
如果您想学习基本 SQL:安装带有 GUI 的 DBMS,允许交互式/即席查询(例如 SQLite/SQliteman/SQLite 浏览器插件、mysql/MySQLWorkbench、Access、OO/LO Base,...) 如果您想使用 Oracle:专注于完整/有效的安装(如果您的脚本语言是 Perl,则包括 DBD:Oracle)【讨论】:
【参考方案2】:这个可行,基本流程如下
-
打开 SQL 文件
将 $text 替换为变量值
将其写入临时文件
在临时文件上执行 SQL plus(每次重新运行它都会替换文件)
试试看,让我知道。
test.pl
#!/usr/bin/perl
$text = 'Germany1';
open(HEADER,"SQLQuery.sql");
while(<HEADER>) $_ =~ s/\$text/$text/g; $output .= $_;
close(HEADER);
print "$output";
open (MYFILE, '>SQLQueryTemp.sql');
print MYFILE $output;
close(MYFILE);
#SQLQueryTemp.sql contains the $text replaced with 'Germany'
#@sql_output = `sqlplus -s user/pass\@databasename <<!
#@/pathtofile/SQLQueryTemp.sql;
#QUIT;
#!`;
#print @sql_output;
SQLQuery.sql
SELECT DISTINCT City FROM Customers
Where Country = '$text'
【讨论】:
您好,感谢您的建议!我能够通过在 sql 文件中使用 & 符号而不是 $ 来解决这个问题。 如果你想通了,那就太好了。以上是关于如何在 SQL 脚本中使用 Perl 变量(使用反引号)的主要内容,如果未能解决你的问题,请参考以下文章