[oracle]如何将从 shell 脚本的变量传递给 sqlplus

标签: sql shell Oracle
发布时间: 2014/3/9 17:46:47
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

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

我在找将一些参数传递给我的 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 吗?

有什么像这样吗?

解决方法 1:

你似乎有 heredoc 包含单个 SQL * 加命令,虽然它看起来不正确在评论中指出。您可以传递一个值在 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.sqlexit 在结束了然后它会更简单,你就不需要 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 脚本,你可以使用其位置的参数, $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 中原有的部分答案)。你可以引用多少倍你想要的替代变量。

那可能不是易于使用如果你运行它多次,,因为它将显示为上文中每一位输出的计数值的标头。也许这将是以后更多解析:

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

如果你 set pages 0set heading off ,你一再的呼吁可能出现在一个整洁的列表。您可能还需要对 set tab off 和可能使用 rpad('&1', 20) 或相似,总是使该列的宽度相同。或作为 CSV 与获得的结果:

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

取决于您所使用的结果什么......

官方微信
官方QQ群
31647020