(SQL)Statements on the Fly erzeugen ohne Execute

12/04/2011 - 10:07 von Celal Dikici | Report spam
Hallo liebes NG,

ich habe ein Unix ksh-script, dass diverse Variablen setzt und dann
ein anderes Programm sourced.
Dieses andere Programm besteht im Wesentlichen aus einer Zeile Unix
Befehl und der Rest irgendwelche
SQL Statments inkl. Shell-Variablen, die dann zur laufzeit
substitutiert werden:

<CODE>
$SYBASE/bin/isql -Uuser -Ppwd -s";" -w5000 <<-EoT | grep -iv "\-\-\-"
| egrep -iv "row|return status" >> ergebnis.csv

SELECT
"${ShellVar}" AS "Foo",
sql-feld AS FeldUberschrift

from db..table

GO
QUIT

EoT

# </end Code>

D.h. Shell-Script erzeugt on the fly ein valides SQL, übergibt diesen
an den SQL-Programm und die
Ergebnisse kommen ins csv Datei.

Jetzt soll ich das so umbauen, dass das erzeugte SQL-Code nach der
Ausführung in einer temporàren
Datei erhalten bleibt, dass man im Nachhinein schauen kann, wie der
SQL Code aussah.

So ad hoc fàllt mir nur ein, dass ich ein großes echo um den ganzen
SQL Block baue, die " Zeichen im
Code durch \" maskiere und das ganze echo umleite in ein > tmp/tmp.sql
die ich anschliessend z.B. mit

cat tmp/tmp.sql | isql > ergebnis.csv

ausführe. Aber da es nicht nur ein embedded-SQL sondern mehrere solche
SQL Dateien habe,
muss ich sehr gut aufpassen, dass ich keine " unmaskiert lasse, da
sonst das echo durcheinander kommt.

Hat jemand hier eine andere Idee? Z.B. eine art cat Befehl, dass die
enthaltenen Shell-Variablen beim
anzeigen substitutiert:

substcat template.sql > tmp/tmp.sql

Sehr schön wàre es, wenn ich den letzten SQL Befehl GO oben
deaktiviere, an isql übergebe; der jedoch
mangels GO nicht ausführt, sondern die so valide expandierte SQL
Statements in eine andere Datei
umleitet.

Vielen Dank im Voraus,
Celal Dikici



und wenn die Erklàrung nicht so verstàndlich ist, hier ein Shell-
Script, dass die Fragestellung verdeutlicht
wenn also untere Script so umgebaut wird, dass ein SQL.tsql mit einem
validen SQL Code erzeugt wird,
wàre mir geholfen.

#!/bin/ksh
#set -x

Laufdatum="11/04/2011"

ClusterNr=1
Kdbo="dbo"
DealMvts="ABCDeals"


# Die Folders Zusammenstellung
unset sqlBLOCK_Folders_SELECTION

# SQL SELECTs, FROMs und WHEREs
sqlBLOCK_Folders_SELECTION="SELECT \
F.Folders_Id \
, F.Folders_ShortName \
INTO #Folders \
FROM \
kplus.${Kdbo}.Folders F \
WHERE F.Folders_ShortName NOT LIEK '%TEST%' )"
#

## ein versuch
#$SYBASE/$SYBASE_OCS/bin/isql -Uuser -Ppwd -s";" -w5000 <<-EoSQL |
grep -iv "\-\-\-" | egrep -iv "row|return status" | grep -v "^$" | sed
's/^;//g' | sed 's/NULL//g' > SQL.tsql

## noch ein versuch
#set -x
#$SYBASE/$SYBASE_OCS/bin/isql -Uuser -Ppwd -s";" -w5000 <<-EoSQL |
grep -iv "\-\-\-" | egrep -iv "row|return status" | grep -v "^$" | sed
's/^;//g' | sed 's/NULL//g' | tee -a SQL.tsql

# wieder ein versuch
$SYBASE/$SYBASE_OCS/bin/isql -Uuser -Ppwd -s";" -w5000 <<-EoSQL | grep
-iv "\-\-\-" | egrep -iv "row|return status" | grep -v "^$" | sed 's/
^;//g' | sed 's/NULL//g' >> SQL.tsql 2>&1

DECLARE @Laufdatum datetime
SELECT @Laufdatum = convert( datetime, "${Laufdatum}", 103)

${sqlBLOCK_Folders_SELECTION}


SELECT DISTINCT
"ABCSys" AS "System"
, "${ClusterNr}" AS "Cluster_ID"
, convert( varchar(10), D.CaptureDate, 103 ) AS "CaptureDate"
, convert( varchar(10), D.TradeDate, 103 ) AS "TradeDate"
, F.Folders_Id AS "Folders_Id"

INTO #${ClusterNr}
FROM
kplus.${Kdbo}.${DealMvts} D
, #Folders F

WHERE
D.Status = 'Valid'
AND B.MaturityDate >= @Laufdatum
AND F.Folders_Id != 0
AND F.Folders_Id = D.Folders_Id

SELECT * FROM #${ClusterNr}

QUIT
EoSQL
###-- END of SQL
 

Lesen sie die antworten

#1 Joerg Mertens
12/04/2011 - 19:22 | Warnen spam
Celal Dikici writes:

Hallo,

Hallo liebes NG,

ich habe ein Unix ksh-script, dass diverse Variablen setzt und dann
ein anderes Programm sourced.
Dieses andere Programm besteht im Wesentlichen aus einer Zeile Unix
Befehl und der Rest irgendwelche
SQL Statments inkl. Shell-Variablen, die dann zur laufzeit
substitutiert werden:

<CODE>
$SYBASE/bin/isql -Uuser -Ppwd -s";" -w5000 <<-EoT | grep -iv "\-\-\-"
| egrep -iv "row|return status" >> ergebnis.csv

SELECT
"${ShellVar}" AS "Foo",
sql-feld AS FeldUberschrift

from db..table

GO
QUIT

EoT

# </end Code>

D.h. Shell-Script erzeugt on the fly ein valides SQL, übergibt diesen
an den SQL-Programm und die
Ergebnisse kommen ins csv Datei.

Jetzt soll ich das so umbauen, dass das erzeugte SQL-Code nach der
Ausführung in einer temporàren
Datei erhalten bleibt, dass man im Nachhinein schauen kann, wie der
SQL Code aussah.

So ad hoc fàllt mir nur ein, dass ich ein großes echo um den ganzen
SQL Block baue, die " Zeichen im
Code durch \" maskiere und das ganze echo umleite in ein > tmp/tmp.sql
die ich anschliessend z.B. mit

cat tmp/tmp.sql | isql > ergebnis.csv

ausführe. Aber da es nicht nur ein embedded-SQL sondern mehrere solche
SQL Dateien habe,
muss ich sehr gut aufpassen, dass ich keine " unmaskiert lasse, da
sonst das echo durcheinander kommt.

Hat jemand hier eine andere Idee? Z.B. eine art cat Befehl, dass die
enthaltenen Shell-Variablen beim
anzeigen substitutiert:

substcat template.sql > tmp/tmp.sql



Du brauchst nicht echo zu benutzen, du kannst auch im obigen Beispiel
isql durch cat ersetzen und die Ausgabe in die SQL-Datei umlenken, z.B.:

cat >tmp.sql <<-EoT

SELECT
"${ShellVar}" AS "Foo",
sql-feld AS FeldUberschrift

from db..table

GO
QUIT

EoT

Mit dem Dateiinhalt kannst du dann isql aufrufen:

cat tmp.sql | $SYBASE/bin/isql -Uuser -Ppwd -s";" -w5000 |
grep -iv "\-\-\-" |
egrep -iv "row|return status" >> ergebnis.csv

Sehr schön wàre es, wenn ich den letzten SQL Befehl GO oben
deaktiviere, an isql übergebe; der jedoch
mangels GO nicht ausführt, sondern die so valide expandierte SQL
Statements in eine andere Datei
umleitet.



Wenn du das GO in der SQL-Datei weghaben willst, kannst du es bei der
Dateierzeugung weglassen und dann spàter an isql übergeben:

{ cat tmp.sql; echo GO; } | $SYBASE/bin/isql ...

Gruß

Jörg

Ähnliche fragen