gpt4 book ai didi

sql - 如何将变量从shell脚本传递给sqlplus

转载 作者:行者123 更新时间:2023-12-04 22:05:33 25 4
gpt4 key购买 nike

我有一个调用 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 中,您可以引用位置参数 using substitution variables :
...
}',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 )。您可以根据需要多次引用替换变量。

如果您多次运行它,这可能不容易使用,因为它会在输出的每一位中显示为计数值上方的标题。也许这会在以后更容易解析:
select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT

如果您 set pages 0set heading off ,您的重复调用可能会出现在一个整洁的列表中。您可能还需要 set tab off并可能使用 rpad('&1', 20)或类似的方法使该列始终具有相同的宽度。或者以 CSV 格式获取结果:
select '&1' ||','|| COUNT(*)

取决于您将结果用于...

关于sql - 如何将变量从shell脚本传递给sqlplus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17575321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com