Ang*_*ina 4 sql oracle shell sqlplus
我有一个调用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
Run Code Online (Sandbox Code Playgroud)
这就是我的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;
Run Code Online (Sandbox Code Playgroud)
我可以修改我的shell脚本以便它传递变量名吗?
即:model ="BUILDING"并将其传递给file.sql?
有什么相似的吗?
Ale*_*ole 14
您似乎有一个heredoc
包含单个SQL*Plus命令,但它看起来不正确,如注释中所述.您可以在以下位置传递值heredoc
:
sqlplus -S user/pass@localhost << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF
Run Code Online (Sandbox Code Playgroud)
或者,如果BUILDING
是$2
在你的脚本:
sqlplus -S user/pass@localhost << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF
Run Code Online (Sandbox Code Playgroud)
如果你file.sql
有一个exit
最后那么它会更简单,因为你不需要heredoc
:
sqlplus -S user/pass@localhost @/opt/D2RQ/file.sql $2
Run Code Online (Sandbox Code Playgroud)
在SQL中,您可以使用替换变量引用位置参数:
...
}',SEM_Models('&1'),NULL,
...
Run Code Online (Sandbox Code Playgroud)
在&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
Run Code Online (Sandbox Code Playgroud)
要么:
sqlplus -S user/pass@localhost << EOF
@/opt/D2RQ/file.sql total_count $2
exit;
EOF
Run Code Online (Sandbox Code Playgroud)
如果total_count
要传递给您的shell脚本,那么只需使用它的位置参数,$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));
Run Code Online (Sandbox Code Playgroud)
如果传递了很多值,您可能会发现使用位置参数来定义命名参数更加清晰,因此任何排序问题都会在脚本开头处理,它们更容易维护:
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));
Run Code Online (Sandbox Code Playgroud)
从你单独的问题,也许你只是想:
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));
Run Code Online (Sandbox Code Playgroud)
...所以别名将与您查询的值相同(答案中的值$2
或BUILDING
原始部分中的值).您可以根据需要多次引用替换变量.
如果你多次运行它可能不容易使用,因为它将在每个输出位的计数值上方显示为标题.也许这会在以后更容易解析:
select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT
Run Code Online (Sandbox Code Playgroud)
如果您set pages 0
和set heading off
您的重复呼叫可能出现在一个整洁的列表中.您可能还需要set tab off
并可能使用rpad('&1', 20)
或类似地使该列始终具有相同的宽度.或者以CSV格式获得结果:
select '&1' ||','|| COUNT(*)
Run Code Online (Sandbox Code Playgroud)
取决于您使用的结果...
归档时间: |
|
查看次数: |
101029 次 |
最近记录: |