No s� si tiene que ver, pero si hago un debug, ejecuta el prepare, pero el declare se lo salta a la torera. En principio el orden es correcto. No se necesita modificar ning�n par�metro en la compilaci�n si es SQL din�mico?
| "Jaime Villa
Torres" <[EMAIL PROTECTED]>
Enviado por: [EMAIL PROTECTED] 24/02/05 00:23
|
|
el eval lo realizaria asi
C EVAL Seletq= 'select arcodi, arnomb, -
C from fartic -
C where arempr=:@empresa and arsitu=:@situac -
C and arcate=:@categoria'
dcomilla s 1 inz('''')
c eval selectq = 'select arcodi, arnomb ' +
c 'from fartic ' +
c 'where arempr = ' +
c @empresa +
c ' and arsitu = ' +
c comilla +
c @situac +
c comilla +
c 'and arcate = ' +
c comilla +
c @categoria +
c comilla
c
Esta sentencia es completamente din�mica
Jaime Villa T.
----- Mensaje original -----
De: Fernando P�rez
Para: [email protected]
Enviado: Mi�rcoles, 23 de Febrero de 2005 05:27 a.m.
Asunto: Re: Sql dinamico
[EMAIL PROTECTED] escribi�:
Hola Foro. Estoy haciendo una prueba para trabajar con SQL dinamico y no hay manera, a ver si me podeis echar una mano. En principio no hace la seleccion y el SQLCOD = -514 Os paso el peque�o programa de pruebas. Compilo con commit *none . hasta que no hemos pasado a V5r3 no he podido hacer nada con sql embebido y esta prueba es bas�ndome en ejemplos que habeis enviado al Foro. La misma seleccion en est�tico funciona bien.
FFartic IF E k disk
FProvartic O a E disk
D @empresa S 3 0 Inz(10)
D @situac S 1 Inz('A')
D @categoria S 2 Inz('BR')
D Seletq S 300
*
C EVAL Seletq= 'select arcodi, arnomb, -
C from fartic -
C where arempr=:@empresa and arsitu=:@situac -
C and arcate=:@categoria' �
C/Exec sql �
C+ PREPARE stmt FROM :seletQ
C/end-exec �
* �
C/EXEC SQL �
C+ DECLARE C1 CURSOR FOR Stmt
C/END-EXEC �
* �
C/Exec sql �
C+ open C1 �
C/end-exec �
* �
� C Dow sqlcod <>100 and sqlcod>=0 ��---------------1-.
C/Exec sql � |
C+ FETCH NEXT FROM C1 INTO :prcodi, :prnomb
C/end-exec � |
� C If sqlcod<>100 and sqlcod>=0 ��-------------2-. |
C Write Provesr � | |
� C Endif ��-------------2-' |
� C Enddo ��---------------1-'
C/Exec sql �
C+ CLOSE C1
C/end-exec �
C Seton Lr �
No puedes emplear variables del lenguaje de esa forma en sql din�mico. En su lugar, utiliza el valor de �stas mismas variables en la sentencia, o bien prepara una sentencia con par�metros (por ejemplo, 'where arempr = ? '), y luego ejec�tala pas�ndole dichos par�metros (creo recordar que para un cursor ser�a 'declare c1 cursor for stmt using :variable')
--
Saludos.
Fernando P�rez
Cer�mica Saloni. Dpto. Sistemas
