PDA

View Full Version : SQL0314, Host-Variable nicht eindeutig



gue_br
26-02-14, 10:26
Hallo!

Ich bekomme den Fehler SQL0314, Host-Variable nicht eindeutig.
Für ein Projekt habe ich ein Service-Pgm erstellt und dazu eine Header-Datei (Member) erstellt. Jetzt verwende ich ein anderes Srv-Pgm und hab dazu mit /Copy dessen Header-File reingeholt und nun bekomme ich diesen Fehler.
Hab diese Vorgehensweise aber schon bei vielen anderen Service-Programmen gemacht und noch nie Probleme gehabt.

In beiden Header-Files hab ich mit /IF NOT DEFINED die Deklaration überprüft.
Hier der Code in den Header-Files:

/IF NOT DEFINED (SDS_QRPGLEH)
/DEFINE SDS_QRPGLEH
D SDS
D SDS_PROGRAMID *PROC
D SDS_JOB 244 253
D SDS_USER 254 263
/ENDIF

Damit müßte doch eine doppelte Definition verhindert sein, oder?
Nehm ich das /Copy vom zweiten Header-File raus, gehts.

Die Variablen SDS_JOB u. SDS_USER will ich in einem Insert-Statement (SQL) verwenden.
EXEC SQL
Insert Into TEST
Values ( :aaa
, :bbb
, :SDS_JOB
, :SDS_USER
)
;

Bitte um Infos.

Danke,
Günter Bretterebner

BenderD
26-02-14, 11:10
... mit soviel Raffinesse ist der SQLRPGLE Precompiler leicht mal überfordert. Am Besten behandelt man den so, als ob das noch RPGII wäre, dann bekommt man keinen Streit:
- keine lokalen Variablen
- keine qualified DS
- alles für das SQL Geschäft global im Modul selber mit prefix HAL oder IBM definieren
- vor dem SQL von deinen wirklichen Variablen in die Workfelder, nach SQL wieder aus den Workfeldern in die wirklichen Variablen, dann merkt der Precompiler nix von dem neueren Zeug, was er nicht wirklich kann.

D*B

malzusrex
26-02-14, 11:21
.... prefix HAL ...

D*B

2001: Odyssee im Weltraum lässt grüssen ;-)

BenderD
26-02-14, 11:44
... ich hätte ja auch Prefix RPK nehmen können, aber das hätte dann wieder mal keiner verstanden, SQL darf man nämlich nicht nehmen...

gue_br
26-02-14, 12:01
Hallo!

Danke für die schnellen Antworten.

Hab die Felder SDS_JOB u. SDS_USER nun in lokale Variablen geschupft und diese ans SQL-Insert übergeben.

Danke,
Günter Bretterebner

B.Hauser
26-02-14, 14:55
Der SQL Precompiler kann Compiler Directiven allenfalls mit den letzten Erweiterungen verarbeiten.
Wenn Du allerdings zwei Copy-Strecken, in denen jeweils die Programm-Status-Datenstruktur hinterlegt ist einbinden musst und du Felder aus der Programm-Status-Datenstruktur als Host-Variablen in SQL-Statements verwenden willst, solltest Du eine der Copy-Strecken mit /INCLUDE statt /COPY einbinden.

Grundsätzlich sollten in embedded SQL Copy-Strecken, in denen nur Definitionen und Informationen, die nicht von (embedded) SQL verwendet werden hinterlegt sind mit /INCLUDE eingebunden werden.
Copy-Strecken, die mit /INCLUDE eingebunden werden, werden vom SQL Precompiler ignoriert.

Übrigens:
- Qualifizierte Datenstrukturen werden von dem SQL Precompiler seit Release V5R4 korrekt verarbeitet
- Lokale Hostvariablen werden vom SQL Precompiler seit Release 6.1 korrekt verarbeitet
- Verschachtelte Copy-Strecken werden von dem SQL Precompilier über Parameter im Compile-Befehl seit Release V5R3 korrekt verarbeitet.
- Man sollte allerdings weiterhin keine Host-Variablen-Namen mit SQL beginnen lassen
- Man sollte alles was den SQL-Precompiler nichts angeht und in Copy-Strecken hinterlegt ist mit /INCLUDE und nicht /COPY eingebunden werden.

Birgitta

gue_br
26-02-14, 15:33
Hallo Brigitta!

Danke für die Info. Werde morgen mal mit /Include probieren. Will ja schließlich eine saubere Lösung.

Gruß,
Günter Bretterebner

PS: War bei SQL-Kurs 9. - 12. Dez. 2013 in Kaufering

BenderD
26-02-14, 15:40
Der SQL Precompiler kann Compiler Directiven allenfalls mit den letzten Erweiterungen verarbeiten.
Übrigens:
- Qualifizierte Datenstrukturen werden von dem SQL Precompiler seit Release V5R4 korrekt verarbeitet
- Lokale Hostvariablen werden vom SQL Precompiler seit Release 6.1 korrekt verarbeitet
- Verschachtelte Copy-Strecken werden von dem SQL Precompilier über Parameter im Compile-Befehl seit Release V5R3 korrekt verarbeitet.
Birgitta

übrigens:
nach jedem Release Wechsel knallt es genau an diesen Punkten, wenn dann die PTFs wieder da sind, geht es wieder mal bis zum nächsten Release...

ich erspare mir das wie oben beschrieben...

D*B