当手动在文件中写入并执行时,Intersystems Cache命令成功,但在通过脚本构建时则不会

时间:2016-07-22 22:12:17

标签: scripting intersystems-cache rhel5 intersystems

如果Intersystems Cache DB专家采用它会很棒:

我通过在RHEL linux上的VI编辑器中手动编辑文件并在CACHE DB上运行该文件来创建脚本,并且所有命令都成功运行。批处理脚本是:

#! /bin/ksh
. /apps/ins/.profile
cache <<-!END
do \$system.Security.Login("_SYSTEM","SYS")
do \$system.SQL.Shell()
select count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator= '278/PLMN/000100'
select count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator= '208/PLMN/002000'
select count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator= '208/PLMN/000100'
select count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator= '206/PLMN/001000'
exit
h
!END

成功的输出:

Node: sur-eir2, Instance: CACHEHA

INS>

INS>
SQL Command Line Shell
----------------------------------------------------
Enter q to quit, ? for help.
INS>>
1. select count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator= '278/PLMN/000100'
Aggregate_1
0

1 Rows(s) Affected
---------------------------------------------------------------------------
INS>>
2. select count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator= '208/PLMN/002000'
Aggregate_1
0

1 Rows(s) Affected
---------------------------------------------------------------------------
INS>>
3. select count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator= '208/PLMN/000100'
Aggregate_1
0

1 Rows(s) Affected
---------------------------------------------------------------------------
INS>>
4. select count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator= '206/PLMN/001000'
Aggregate_1
0

1 Rows(s) Affected
---------------------------------------------------------------------------
INS>>

INS>

现在,当我尝试通过另一个主脚本(echo命令)创建这样的脚本并运行它时,相同的命令会失败并显示语法错误。我的主要剧本是:

==============From Here=========================
#! /bin/ksh 
while read line
do
 echo "select count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator = '$line'"
done < plmn_list >> command_list ;

echo "#! /bin/ksh" >> get_count
echo ". /apps/ins/.profile" >> get_count
echo "cache <<-!END" >> get_count
echo "do \$system.SQL.Shell()" >> get_count
cat command_list >> get_count
echo "exit" >> get_count
echo "h" >> get_count
echo "!END" >> get_count
==================till here the get_count script is generated fine========
chmod u+rwx get_count
ksh ./get_count > query_result <-- query_result shows syntax errors
sed -n '/Aggregate_1/,+1p' query_result | grep -v "Aggregate_1" > count
paste plmn_list count > report
rm -f command_list get_count

get_count内容:

#! /bin/ksh
. /apps/ins/.profile
cache <<-!END
do $system.SQL.Shell()
select count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator = '278/PLMN/000100'
select count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator = '208/PLMN/002000'
select count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator = '208/PLMN/000100'
exit
h
!END 

所以一切看起来都很好。但是query_result显示:

Node: sur-eir2, Instance: CACHEHA

INS>

DO .SQL.Shell()
^
<SYNTAX>
INS>

SELECT count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator = '278/PLM
^
N/000100'
<SYNTAX>
INS>

SELECT count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator = '208/PLM
^
N/002000'
<SYNTAX>
INS>

SELECT count(*) from cdat_tb_ceir_blacklist_7 where cdat_c_originator = '208/PLM
^
N/000100'
<SYNTAX>
INS>

EXIT
^
<SYNTAX>
INS>

单独运行时来自get_count的每个命令也可以正常工作。那么为什么语法错误?

1 个答案:

答案 0 :(得分:1)

我得到了答案。

do $system.SQL.Shell()文件中的get_count命令实际上应该是:

do \$system.SQL.Shell()

这是一个命令,它将您带到Intersystems Cache-DB中运行普通SQL查询的SQL shell。由于这是错误的,我以下所有的SQL命令也都失败了。

因此我的主要脚本中的更改将是:

该行:

echo "do \$system.SQL.Shell()" >> get_count

更改为:

echo "do \\\$system.SQL.Shell()" >> get_count

其他一切都保持不变。