2016-07-22 22 views
0

Es wäre toll, wenn diese nach oben von Intersystems Caché DB-Experten getroffen wird:Intersystems Caché-Befehle, wenn sie manuell in eine Datei geschrieben und ausgeführt ist erfolgreich, aber nicht, wenn sie durch ein Skript gebaut

ich ein Skript erstellt, indem Sie manuell eine Bearbeitung Datei von VI-Editor auf RHEL Linux und lief das auf CACHE DB, und alle Befehle wurden erfolgreich ausgeführt. Die Batch-Skript war:

#! /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 

ERFOLGREICH OUTPUT:

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> 

Jetzt, während ich versuche, über eine anderen Haupt-Skript (echo-Befehle), wie ein Skript zu erstellen und ausführen, die gleichen Befehle fehlschlagen und zeige syntaktischen Fehler. Mein Haupt-Skript ist:

==============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 

Der get_count Inhalt:

#! /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 

So sieht alles dort in Ordnung. Doch die query_result zeigt:

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> 

Jeder Befehl von get_count, wenn sie einzeln auch ganz gut funktioniert lief. Warum also der syntaktische Fehler?

Antwort

1

Ich habe die Antwort bekommen.

Der Befehl do $system.SQL.Shell() in der get_count Datei soll eigentlich:

do \$system.SQL.Shell() 

Dies ist der Befehl, den Sie den SQL-Shell in Intersystems Cache-DB von wo aus Sie Abfrage ausführen normale SQL dauert. Da dies falsch war, versagten alle meine folgenden SQL-Befehle.

So sind die Veränderungen in meinem Haupt-Skript wäre:

Die Linie:

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

Wechsel zu:

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

Alles andere gleichbleibender.