如何在 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 变量(使用反引号)的主要内容,如果未能解决你的问题,请参考以下文章

使用反引号在 perl 脚本中获取核心文件

Perl调用外部命令(其他脚本系统命令)的方法和区别

Perl 的 system() 如何打印它正在运行的命令?

如何在perl中使用split函数来完成awk的工作

使用 PL/SQL 执行 perl 脚本

如何在 Perl 脚本之间共享 ENV 变量