2017-05-15 3 views
0

Ich möchte das Ergebnis einer Abfrage als Eingabe in einer anderen Abfrage verwenden. Was könnte es schwierig machen: Die Variable ist das Schema in der Datenbank.db2 verwenden Abfrageergebnis in Variable

CREATE or replace VARIABLE myschema varchar(15) ; 
set myschema = (select owner from syscat.tables where tabname = 'xyz'); 
select count(name) as result from myschema.USR02 where USTYP = 'A'; 
DROP VARIABLE myschema; 

Dies ist mein letzter Versuch, nachdem ich mit deklarieren fehlgeschlagen ist. Aber ich bekomme einen Fehler, weil "myschema" als String verwendet wird, und natürlich gibt es kein Schema mit dem Namen "myschema". Das Ergebnis der ersten Abfrage wird nicht verwendet.

Wenn ich nur die ersten zwei Zeilen ausführen, bekomme ich das Schema als Ergebnis. Muss ich die Variable besonders kennzeichnen? Das Ziel ist nur das Ergebnis der Abfrage in Zeile 3, indem der dynamische Wert von "myschema" verwendet wird.

Antwort

1

Leider haben Sie dynamische SQL verwenden (eine benutzerdefinierte SQL-Abfrage durch String-Manipulation bilden), wenn Sie mit Tabelle beschäftigen möchten, Schema oder Spaltennamen dynamisch:

Dies ist die Grundidee:

execute immediate 'select * from ' || myschema || '.USR02'; 

Sie können jedoch nicht einfach eine Auswahl in dynamischem SQL ausführen; Sie müssen das Ergebnis in etwas bringen. Und das Ganze muss in einem zusammengesetzten SQL-Block sein. Das vollständige Beispiel würde also ungefähr so ​​aussehen (vereinfachte Abfrage nach Leerzeichen).

Diese Abfrage setzt voraus, dass eine Tabelle namens "result" existiert, um das Ergebnis zu speichern, das Sie zurückgeben.

begin 
    declare myschema varchar(100) default ''; 
    set myschema = (select owner from syscat.tables where tabname = 'xyz'); 

    execute immediate 'insert into result select count(*) from ' || myschema || '.USR02'; 
end 

select * from result; 

Beachten Sie, dass Sie innerhalb des Blocks einfach eine Variable deklarieren können (wie in meinem Beispiel gezeigt). Sie müssen also zu diesem Zweck keine globale Variable deklarieren, es sei denn, Sie möchten, dass sie über diese eine Anweisung hinaus besteht.

+0

Leider habe ich keinen Schreibzugriff auf die Datenbanken. Der Code ist in ein Skript integriert und der angegebene Benutzer ist schreibgeschützt. Ich würde die Abfragen sequentiell ausführen und das Ergebnis in einer Variablen speichern, aber das ist nicht möglich. Also mein Ziel muss sein: Holen Sie beide Informationen in einer Abfrage mit dem angegebenen Benutzer. – rysk

+0

@rysk, Sie sollten in der Lage sein, eine Sitzungstabelle für diese Methode zu verwenden ('globale temporäre Tabelle deklarieren ...'), selbst wenn Sie einen schreibgeschützten Benutzer haben. –