Error al generar sentencia update dinámicamente
Hola a todos,
Estoy haciendo un procedimiento que mediante un cursor recorre los registros de una tabla para modificar uno de sus campos.
CREATE OR REPLACE PROCEDURE REEMPLAZAR_67(
cadena IN varchar2,
tabla IN varchar2
)
AS
pCompNo VARCHAR2(16);
ColumnCompNo VARCHAR2(20);
tmpcadena varchar2(2);
tmptabla varchar2(30);
tmpsql varchar2(200);
TYPE C IS REF CURSOR;
C1 C;
BEGIN
tmptabla := tabla;
tmpcadena := cadena;
tmpsql := 'select comp_no from ' || tmptabla || ' for update';
OPEN C1 FOR tmpsql;
LOOP
FETCH C1
INTO pCompNo;
EXIT WHEN C1%NOTFOUND;
if SUBSTR(pCompNo,1,3)= '**1' then
ColumnCompNo := replace(pCompNo,'**13',tmpcadena);
else
ColumnCompNo := tmpcadena || substr(pCompNo,3);
end if;
dbms_output.put_line(ColumnCompNo );
tmpsql := 'UPDATE ' || tmptabla || ' SET COMP_NO = ' || ColumnCompNo ;
tmpsql := tmpsql || ' WHERE CURRENT OF C1';
dbms_output.put_line(tmpsql );
execute immediate tmpsql;
END LOOP;
CLOSE C1;
END;
donde me falla la sentencia execute. El procedimiento es el correcta ya que los resultados son los que necesito, pero no sé qué ocurre al contruir la sentencia UPDATE que falla.
Me podrÃas echar una mano?
Muchas gracias
Bego
Estoy haciendo un procedimiento que mediante un cursor recorre los registros de una tabla para modificar uno de sus campos.
CREATE OR REPLACE PROCEDURE REEMPLAZAR_67(
cadena IN varchar2,
tabla IN varchar2
)
AS
pCompNo VARCHAR2(16);
ColumnCompNo VARCHAR2(20);
tmpcadena varchar2(2);
tmptabla varchar2(30);
tmpsql varchar2(200);
TYPE C IS REF CURSOR;
C1 C;
BEGIN
tmptabla := tabla;
tmpcadena := cadena;
tmpsql := 'select comp_no from ' || tmptabla || ' for update';
OPEN C1 FOR tmpsql;
LOOP
FETCH C1
INTO pCompNo;
EXIT WHEN C1%NOTFOUND;
if SUBSTR(pCompNo,1,3)= '**1' then
ColumnCompNo := replace(pCompNo,'**13',tmpcadena);
else
ColumnCompNo := tmpcadena || substr(pCompNo,3);
end if;
dbms_output.put_line(ColumnCompNo );
tmpsql := 'UPDATE ' || tmptabla || ' SET COMP_NO = ' || ColumnCompNo ;
tmpsql := tmpsql || ' WHERE CURRENT OF C1';
dbms_output.put_line(tmpsql );
execute immediate tmpsql;
END LOOP;
CLOSE C1;
END;
donde me falla la sentencia execute. El procedimiento es el correcta ya que los resultados son los que necesito, pero no sé qué ocurre al contruir la sentencia UPDATE que falla.
Me podrÃas echar una mano?
Muchas gracias
Bego
Estimada Bego. ¿ que es eso de current of ?
He cambiado el procedure y ahora no da error, pruebalo y me cuentas.
Saludos
CREATE OR REPLACE PROCEDURE REEMPLAZAR_67(
cadena IN varchar2,
tabla IN varchar2
)
AS
pCompNo VARCHAR2(160);
ColumnCompNo VARCHAR2(200);
tmpcadena varchar2(20);
tmptabla varchar2(30);
tmpsql varchar2(200);
TYPE C IS REF CURSOR;
C1 C;
V_ROWID VARCHAR2(500);
BEGIN
tmptabla := tabla;
tmpcadena := cadena;
tmpsql := 'select ROWID,comp_no from ' || tmptabla || ' for update';
OPEN C1 FOR tmpsql;
LOOP
FETCH C1
INTO V_ROWID, pCompNo;
EXIT WHEN C1%NOTFOUND;
if SUBSTR(pCompNo,1,3)= '**1' then
ColumnCompNo := replace(pCompNo,'**13',tmpcadena);
else
ColumnCompNo := tmpcadena || substr(pCompNo,3);
end if;
dbms_output.put_line(ColumnCompNo );
tmpsql := 'UPDATE ' || tmptabla || ' SET COMP_NO = ' ||''''||ColumnCompNo||'''' ;
tmpsql := tmpsql || ' WHERE ROWID = '||''''||V_ROWID||'''';
dbms_output.put_line(tmpsql );
execute iMmediate (tmpsql);
END LOOP;
CLOSE C1;
END;
He cambiado el procedure y ahora no da error, pruebalo y me cuentas.
Saludos
CREATE OR REPLACE PROCEDURE REEMPLAZAR_67(
cadena IN varchar2,
tabla IN varchar2
)
AS
pCompNo VARCHAR2(160);
ColumnCompNo VARCHAR2(200);
tmpcadena varchar2(20);
tmptabla varchar2(30);
tmpsql varchar2(200);
TYPE C IS REF CURSOR;
C1 C;
V_ROWID VARCHAR2(500);
BEGIN
tmptabla := tabla;
tmpcadena := cadena;
tmpsql := 'select ROWID,comp_no from ' || tmptabla || ' for update';
OPEN C1 FOR tmpsql;
LOOP
FETCH C1
INTO V_ROWID, pCompNo;
EXIT WHEN C1%NOTFOUND;
if SUBSTR(pCompNo,1,3)= '**1' then
ColumnCompNo := replace(pCompNo,'**13',tmpcadena);
else
ColumnCompNo := tmpcadena || substr(pCompNo,3);
end if;
dbms_output.put_line(ColumnCompNo );
tmpsql := 'UPDATE ' || tmptabla || ' SET COMP_NO = ' ||''''||ColumnCompNo||'''' ;
tmpsql := tmpsql || ' WHERE ROWID = '||''''||V_ROWID||'''';
dbms_output.put_line(tmpsql );
execute iMmediate (tmpsql);
END LOOP;
CLOSE C1;
END;
Estimado a
Pche, pche.....
No mucho la verdad, un pelin mas que tu puta madre, pero no mucho ¿ eh ?, que ella en prostituirse es la reina y yo aqui solo hago lo que puedo, eso si, yo follo con garantias, asà no les puedo pasar el SIDA a mis hijos , cosa que tu madre no tuvo en cuenta al follar con tanto drogata y chapero.
Espero haberte ayudado.
Saludos, estimado compañero
Pche, pche.....
No mucho la verdad, un pelin mas que tu puta madre, pero no mucho ¿ eh ?, que ella en prostituirse es la reina y yo aqui solo hago lo que puedo, eso si, yo follo con garantias, asà no les puedo pasar el SIDA a mis hijos , cosa que tu madre no tuvo en cuenta al follar con tanto drogata y chapero.
Espero haberte ayudado.
Saludos, estimado compañero
