我有一个调用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 0
和set 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): 我正在本地主机(我自己的机器)上的开