当前位置: 首页 > 面试题库 >

如何将变量从外壳脚本传递到sqlplus

贺懿轩
2023-03-14
问题内容

我有一个调用file.sql的shell脚本

我正在寻找一种将一些参数传递给我的file.sql的方法。

如果我没有将具有某个值的变量传递给sql脚本,则将不得不使用SELECT语句创建多个.sql文件,并且所有更改将只需要几个字即可。

我的shell脚本调用file.sql:

sqlplus -S user/pass@localhost
echo " Processing triples"
./load_triples.sh BUILDING/Mapping_File BUILDING Y >> load_semantic.log

@/opt/D2RQ/file.sql
exit;
EOF

这就是我的file.sql的样子:

SET ECHO ON;
SPOOL count.log

SELECT COUNT(*) as total_count
FROM TABLE(SEM_MATCH(
'{
        ?s rdf:type :ProcessSpec .
        ?s ?p ?o
}',SEM_Models('BUILDING'),NULL,
SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL));

SPOOL OFF;

我可以修改我的shell脚本,以便它传递变量名吗?

即:模型=“建筑”,并将其传递给file.sql

有没有类似的东西?


问题答案:

您似乎只heredoc包含一个SQL * Plus命令,尽管它看起来不像注释中所指出的那样正确。您可以在中传递值heredoc

sqlplus -S user/pass@localhost << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF

或者,如果BUILDING$2在你的脚本:

sqlplus -S user/pass@localhost << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF

如果您在末尾file.sql有一个exit,那么它将更加简单,因为您不需要heredoc

sqlplus -S user/pass@localhost @/opt/D2RQ/file.sql $2

然后,在SQL中,您可以使用替换变量来引用位置参数:

...
}',SEM_Models('&1'),NULL,
...

&1将传递到SQL脚本,第一个值来代替BUILDING; 因为那是一个字符串,所以仍然需要用引号将其引起来。set verify off如果在输出中显示替换,您可能想停止。

您可以传递多个值,并像在Shell脚本中的位置参数一样依次引用它们-
第一个传递的参数是&1,第二个传递的参数是&2,等等。您可以在SQL脚本中的任何位置使用替换变量,因此可以使用它们作为列别名没有问题-
您只需要小心添加一个额外的参数,您可以将其添加到列表的末尾(这可能会使脚本中的编号混乱)或调整所有内容以使其匹配:

sqlplus -S user/pass@localhost << EOF
@/opt/D2RQ/file.sql total_count BUILDING
exit;
EOF

或者:

sqlplus -S user/pass@localhost << EOF
@/opt/D2RQ/file.sql total_count $2
exit;
EOF

如果total_count要传递给您的Shell脚本,则只需使用其positional参数$4或其他任何参数即可。然后您的SQL将是:

SELECT COUNT(*) as &1
FROM TABLE(SEM_MATCH(
'{
        ?s rdf:type :ProcessSpec .
        ?s ?p ?o
}',SEM_Models('&2'),NULL,
SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL));

如果您传递许多值,您可能会发现使用位置参数来定义命名参数更加清晰,因此所有排序问题都在脚本开始时处理,因此更易于维护:

define MY_ALIAS = &1
define MY_MODEL = &2

SELECT COUNT(*) as &MY_ALIAS
FROM TABLE(SEM_MATCH(
'{
        ?s rdf:type :ProcessSpec .
        ?s ?p ?o
}',SEM_Models('&MY_MODEL'),NULL,
SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL));

从您单独的问题中,也许您只是想要:

SELECT COUNT(*) as &1
FROM TABLE(SEM_MATCH(
'{
        ?s rdf:type :ProcessSpec .
        ?s ?p ?o
}',SEM_Models('&1'),NULL,
SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL));

…,因此别名将是您要查询的值$2(或BUILDING答案原始部分中的值)。您可以根据需要多次引用替换变量。

如果您多次运行它,可能会不容易使用,因为它将在输出的每一位中显示为计数值上方的标头。也许以后会更解析:

select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT

如果您set pages 0set heading off,您的重复呼叫可能会显示在整洁的列表中。您可能还需要set tab off并且可能使用rpad('&1', 20)或类似方法使该列始终保持相同的宽度。或通过以下方式以CSV格式获取结果:

select '&1' ||','|| COUNT(*)

取决于您将结果用于…



 类似资料:
  • 我有这样一个shell脚本(在/usr/local/bin/esm script/import master.php中): 现在我通过这样的PHP脚本调用它: 但是,当我运行PHP代码时,我会在浏览器上看到以下消息: 我不是一个编写shell脚本的人,所以我不知道我是否遗漏了什么。 我检查了带有sql文件的文件夹是否具有正确的权限(775)和数据(插入语句)。 那么为什么这不起作用呢?非常感谢您的

  • 问题内容: 我有一个bash脚本a.sh,其中有一个python脚本b.py。python脚本计算某些内容,我希望它返回一个值,该值稍后将在a.sh中使用。我知道我能做 在a.sh中: 在b.py中: 但这不是那么方便,因为我还在b.py中打印了其他消息 有什么更好的方法吗? 编辑: 我现在正在做的只是 这意味着我可以在b.py中打印很多东西,但是只有最后一行(假设它不包含“ \ n”,这是最后一

  • 如何让bash脚本查看设置在.env和/或docker-compose-yaml中的env变量? . env docker-compose.yml entrypoint.sh

  • 问题内容: 我从Jenkins触发了一个shell脚本,该脚本获取日期并将其导出为环境(Linux)变量$ DATE。我需要在同一詹金斯工作中使用此$ DATE。我做了工作作为参数构建。创建一个字符串参数作为DATE值,如DATE = $ DATE。但这是行不通的。 请建议! 问题答案: 您提到要在外壳程序脚本中导出环境变量,该脚本可能是通过“执行外壳程序”步骤启动的。 问题是,一旦完成外壳程序步

  • 问题内容: 我使用创建了一个react应用。我有一个现有的网页,并且react应用程序按正常方式附加到html页面内的div。 该网页具有一些全局javascript常量,这是React应用程序运行所必需的。有什么办法可以将这些变量传递给react应用吗?结构如下 我正在努力,因为javascript当然在构建阶段会被精简,因此任何声明如下: 由于变量被重写而无法正常工作。我试图偷偷摸摸,并使用e

  • 问题内容: 我在未传递到javascript文件的玉模板文件(index.jade)中声明的变量(config)遇到问题,这使我的javascript崩溃了。这是文件(views / index.jade): 这是我的app.js(服务器端)的一部分: 这是我的javascript文件崩溃的一部分(public / javascripts / app.js): 我正在本地主机(我自己的机器)上的开