0

これが 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も問題なく機能します。では、なぜ構文エラーが発生するのでしょうか?

4

1 に答える 1

1

答えがわかりました。

ファイル内のコマンドdo $system.SQL.Shell()は、get_count実際には次のようになります。

do \$system.SQL.Shell()

Intersystems Cache-DBこれは、通常の SQL クエリを実行する場所からSQL シェルに移動するコマンドです。これが間違っていたため、次の SQL コマンドもすべて失敗していました。

したがって、メイン スクリプトの変更は次のようになります。

この線:

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

変更:

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

他のすべては同じままです。

于 2016-07-23T00:11:13.610 に答える