2016-05-06 10 views
-1

Ich habe employee1 Tabelle mit Feld student_id, Name, Marken und Tabelle mit Feldnamen, angenommen NEHA ist im Namensfeld vorhanden, ich habe eine Tabelle mit Namen NEHA .In Namenstabelle Marken, ID und Betreff-Feld ist dort.Ich möchte das Thema aus der Namentabelle (neha) holen, wo die Markierungen> 10 sind. Ich muss sqlrpgle Programm schreiben, um Name von employee1 durch dynamische Abfrage zu holen, da Name jedes Mal ändert. Ich habe den Code geteilt. In diesem Code wird jedes Mal ein anderer Name von emoployee1 abgerufen, aber das Problem in diesem Code ist nicht in der Lage, die SUBJECT-Spalte von der NEHA-Tabelle abzurufen. Bei debug wird es subject = ''. aber die gleiche Abfrage läuft perfekt in strsql. Kann jemand irgendeine Lösung vorschlagen?sqlrpgle dynamische Abfrage in/4000

D stmt1   s   500A inz         
D subject   s    10A           
D @subject  s    10A           
D name   s    20A           
D @Name   s    20A           
D STUdent_ID  s    10P 0          
d marks   s    10P 2          

/Free                  
EXEC Sql                 
declare c1 scroll cursor for            
select name,student_id,marks from employee1;        

EXEC Sql                 
open c1; 

EXEC Sql                
fetch first from c1 into :@name,:student_id,:marks;     

dow sqlcod=0;              
stmt1='select subject from ' + %Trim(@name)+ ' where marks>10';  

EXEC Sql              
declare c2 scroll cursor for         
select subject from @name where marks>10; 

EXEC Sql             
open c2;             

EXEC sql             
fetch first from c2 into :@SUBJECT;  
If SQLCOD = 0;            
    dsply subject;   
EndIf; 

EXEC Sql      
Prepare s2 from :stmt1;  
EXEC Sql                  
execute s2;                 

EXEC SQL                  
Fetch next from c1 into :name,:student_id,:marks;        

EXEC SQL                  
Fetch next from c2 into :subject;             
enddo; 

EXEC Sql                  
close c1;                  
EXEC Sql                  
close c2;  

*inlr = *on;                 
/END-FREE                  
+0

Ich bin Es tut mir leid, aber Sie müssen diesen Beitrag möglicherweise wiederholen, ich habe versucht, es zu bearbeiten, aber das verwendete Englisch macht es schwierig zu entziffern. Bitte machen Sie Ihre Posts präzise und soweit möglich. – Draken

+0

Es sieht so aus, als ob Sie versuchen, dynamisches SQL gegen eine Tabelle namens @name auszuführen, aber Ihre Frage scheint zu sagen, dass Sie gegen eine Tabelle namens NEHA laufen sollten. Was ist "NEHA"? Ist es ein Tisch? Oder ist es ein Wert in einer Spalte in einer Tabelle? – user2338816

+0

'Neha' ist eine Tabelle, die eine Spalte 'Marken' hat, 'Betreff' und 'naha' ist Feld unter Feldname 'Name' von 'epmloyee1' Tabelle auch. Ich muss eine Abfrage so etwas schreiben 'Thema aus Neha auswählen Bei Markierungen> 10 'kommt der Tabellenname' neha 'von' employee1 'table.und der Tabellenname' neha 'kommt zur Laufzeit, also unter der dynamischen Abfrage' Subject von wählen '+% Trim (@name) +' wo die Marken stehen > 10'.so es ist jedes Mal andere Tabellennamen zu holen. Aber das Problem in diesem Code ist es 'Neha' als ein Feld unter 'employee1' table.so 'Marken' Feld unter 'Neha' Tabelle wird nicht erkannt. – Nabamita

Antwort

0

So gegeben, dass Sie eine Tabelle mit Namen, die auf den Namen der anderen Tabellen beziehen, haben Sie ein Problem mit der Reihenfolge der dynamischen SQL-Anweisungen und wie sie genannt werden.

exec sql 
    declare C1 cursor for 
    select name, student_id, marks from employee1; 
exec sql 
    declare S2 statement; 
exec sql 
    declare C2 cursor for S2; 

exec sql 
    open C1; 
exec sql 
    fetch first from C1 into :@name, :student_id, :marks; 
dow sqlcode >= 0; 

    stmt1 = 'select subject from ' + %Trim(@name)+ ' where marks>10';  
    exec sql 
    prepare S2 from :stmt1; 
    exec sql 
    open C2; 

    exec sql             
    fetch first from c2 into :@SUBJECT;  
    if sqlcod = 0;            
    dsply subject;   
    endif; 
    exec sql 
    close C2; 

    exec sql 
    fetch next from C1 into :@name, :student_id, :marks; 
enddo; 

exec sql 
    close C1; 

Ich legte alle meine Deklarationen an der Vorderseite. Sie sind nicht ausführbar und müssen nicht wiederholt aufgerufen werden, da sie vollständig auskommentiert sind und keinen Code im Programm generieren. Die Sequenz für die Verwendung eines dynamisch vorbereitet Anweisung in einem Cursor:

  1. die Anweisung bauen
  2. Bereiten Sie die Anweisung
  3. öffnet den Cursor
  4. Schließen Sie den Cursor in einer Schleife von dem Cursor holen

einige Hinweise auf die Ausführung:

  • Keine ausgeführt wird, funktioniert der offenen des Cursors, dass
  • Sie den Cursor mit der Anweisung Namen in der für Klausel des Cursors declare erklären
  • Die Deklaration des Cursors ändert sich nie