2016-05-06 2 views
-1

У меня есть таблица employee1 с полем student_id, имя, метки и таблица с именем поля, предположим, что NEHA присутствует в поле имени, у меня есть таблица с именем NEHA. В таблицах таблиц имен, id и поле subject. Я хочу получить объект из таблицы имен (neha), где метки> 10. Мне нужно написать программу sqlrpgle для извлечения имени из employee1 динамическим запросом, поскольку имя меняется каждый раз. У меня есть общий код. В этом коде каждый раз, когда вызывается другое имя из emoployee1, но проблема в этом коде не может извлечь столбец SUBJECT из таблицы NEHA. В отладке предстоящего объекта = ''. но тот же запрос выполняется отлично в strsql.может ли кто-нибудь предложить какое-либо решение?sqlrpgle dynamic query in as/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

Я извините, но вам, возможно, придется переделать этот пост, я попытался его отредактировать, но используемый английский язык затрудняет расшифровку. Пожалуйста, сделайте свои сообщения краткими и точными, если возможно – Draken

+0

Похоже, вы пытаетесь запустить динамический SQL против таблицы с именем @name, но ваш вопрос, кажется, говорит о том, что вы должны бежать против таблицы с именем NEHA. Что такое «NEHA»? Это таблица? Или это значение в столбце таблицы? – user2338816

+0

'neha' - таблица, в которой есть столбец «метки», «субъект» и «наха» - поле под полем «имя» таблицы «epmloyee1». Мне нужно написать запрос примерно так: «выберите тему из нехи где mark> 10 'это имя таблицы «neha» происходит из таблицы «employee1». Имя таблицы «neha» приходит во время выполнения, поэтому оно находится под динамическим запросом «select subject from» +% Trim (@name) +', где метки > 10 '. Так что каждый раз вызывается имя другой таблицы. Но проблема в этом коде - это «неха» как поле под полем «employee1» table.so «метки» под таблицей «neha» не распознается. – Nabamita

ответ

0

Поэтому, учитывая, что у вас есть таблица имен, которые ссылаются на имя других таблиц, у вас есть проблемы с заказом ваших динамических операторов SQL и как они называются.

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; 

Я положил все свои объявления на фронт. они не исполняются и не требуют повторного вызова, поскольку они полностью закомментированы и не генерируют код в программе. Последовательность с использованием динамически подготовленного оператора в курсора:

  1. построить заявление
  2. подготовить заявление
  3. открыть курсор
  4. выборки из курсора в цикле
  5. закрыть курсор

несколько замечаний по исполнению:

  • Нет исполняет, открытая курсора не делает
  • Вы объявляете курсор с именем заявления в течение п о DECLARE CURSOR
  • Объявление курсора не меняется