Error al ejecutar funcion
Publicado por alfredo (17 intervenciones) el 17/12/2008 20:18:24
Hola a todos , el problema lo puse en un post anterior pero creo que no me explique bien , esto fue porque tengo problemas para ejecutar sentencias con el execute immediate. hice una funcion para el alter pero me manda el siguiente error:
de el siguiente store procedure , armo un query para hacer una extraccion , despues lo pinto con DBMS_OUTPUT.PUT_LINE(v_sql);, y enseguida lo quiero ejecutar con EXECUTE IMMEDIATE (v_sql); pero no pasa nada , espero puedan ayudarme
gracias
CREATE OR REPLACE procedure BNXAFILIACION.web_Ac_Obtienecampos2
(
v_iDocid IN NUMBER DEFAULT NULL ,
cv_1 OUT SYS_REFCURSOR
)
AS
/*
Autor:Adriana Robles Yong
Fecha:8 de Febrero de 2007
DEscripcion:Procedimiento para obtencion de campos de actualización
*/
v_tabla VARCHAR2(50);
v_sql VARCHAR2(5000);
v_resultado VARCHAR2(5000);
v_i NUMBER(3,0);
v_max NUMBER(3,0);
v_campos NVARCHAR2(250);
v_campos2 NVARCHAR2(250);
--V_CUR_TYP SYS_REFCURSOR;
BEGIN
BEGIN
SELECT tabla
INTO v_tabla
FROM TiposDocumento a,DIGITALIZAMAIN b
WHERE b.doctype = a.TipoDocumentoID
AND b.docid = v_iDocid;
EXCEPTION
WHEN OTHERS THEN v_tabla := NULL;
END;
DBMS_OUTPUT.PUT_LINE(v_tabla);
IF v_tabla IS NULL OR v_tabla = '' THEN
OPEN cv_1 FOR
SELECT v_iDocid ,'Error, no existe el docid'
FROM DUAL ;
ELSE
BEGIN
SELECT MAX(CampoID) + 1
INTO v_max
FROM CatCamposDocumento
WHERE Tabla = v_tabla;
v_sql := '';
v_i := 1;
WHILE v_i < v_max
LOOP
BEGIN
SELECT NVL(v_sql, '') || 'select ' ||to_char(v_iDocid) ||' as Docid,Nombrecampo as Campo,
nvl((select to_char(' || NombreCampo || ' )from ' || Tabla || ' where Docid = '|| to_char(v_iDocid) ||'),'|| CHR(39)|| ' '
|| CHR(39) || ') as ' || 'Valor ,to_char(NVL(PermisoID, 0) ) as PermisoID, TipoDato, LongitudMax, LongitudMin,
Obligatorio,Mostrar, Mascara, Regla,accion,TipoDatoConsulta, condicion1,condicion2,condicion3,
tipoDatoCliente from CatCamposDocumento where CampoID=' || TO_CHAR(v_i) || ' and Tabla= ' || CHR(39) || v_tabla || CHR(39) || '
union all '
INTO v_sql
FROM CatCamposDocumento
WHERE Tabla = v_tabla
AND CampoID = v_i;
--and Obligatorio=1
v_i := v_i + 1;
END;
END LOOP;
BEGIN
v_sql := SUBSTR(v_sql, 1, LENGTH(v_sql) - 11)||';';
--OPEN cv_1 FOR SELECT v_sql FROM DUAL ;
DBMS_OUTPUT.PUT_LINE(v_sql);
EXECUTE IMMEDIATE (v_sql);
EXCEPTION
WHEN OTHERS THEN
IF TO_CHAR(SQLCODE) = '-2260'
THEN
NULL;
END IF;
END;
END;
END IF;
END;
/
de el siguiente store procedure , armo un query para hacer una extraccion , despues lo pinto con DBMS_OUTPUT.PUT_LINE(v_sql);, y enseguida lo quiero ejecutar con EXECUTE IMMEDIATE (v_sql); pero no pasa nada , espero puedan ayudarme
gracias
CREATE OR REPLACE procedure BNXAFILIACION.web_Ac_Obtienecampos2
(
v_iDocid IN NUMBER DEFAULT NULL ,
cv_1 OUT SYS_REFCURSOR
)
AS
/*
Autor:Adriana Robles Yong
Fecha:8 de Febrero de 2007
DEscripcion:Procedimiento para obtencion de campos de actualización
*/
v_tabla VARCHAR2(50);
v_sql VARCHAR2(5000);
v_resultado VARCHAR2(5000);
v_i NUMBER(3,0);
v_max NUMBER(3,0);
v_campos NVARCHAR2(250);
v_campos2 NVARCHAR2(250);
--V_CUR_TYP SYS_REFCURSOR;
BEGIN
BEGIN
SELECT tabla
INTO v_tabla
FROM TiposDocumento a,DIGITALIZAMAIN b
WHERE b.doctype = a.TipoDocumentoID
AND b.docid = v_iDocid;
EXCEPTION
WHEN OTHERS THEN v_tabla := NULL;
END;
DBMS_OUTPUT.PUT_LINE(v_tabla);
IF v_tabla IS NULL OR v_tabla = '' THEN
OPEN cv_1 FOR
SELECT v_iDocid ,'Error, no existe el docid'
FROM DUAL ;
ELSE
BEGIN
SELECT MAX(CampoID) + 1
INTO v_max
FROM CatCamposDocumento
WHERE Tabla = v_tabla;
v_sql := '';
v_i := 1;
WHILE v_i < v_max
LOOP
BEGIN
SELECT NVL(v_sql, '') || 'select ' ||to_char(v_iDocid) ||' as Docid,Nombrecampo as Campo,
nvl((select to_char(' || NombreCampo || ' )from ' || Tabla || ' where Docid = '|| to_char(v_iDocid) ||'),'|| CHR(39)|| ' '
|| CHR(39) || ') as ' || 'Valor ,to_char(NVL(PermisoID, 0) ) as PermisoID, TipoDato, LongitudMax, LongitudMin,
Obligatorio,Mostrar, Mascara, Regla,accion,TipoDatoConsulta, condicion1,condicion2,condicion3,
tipoDatoCliente from CatCamposDocumento where CampoID=' || TO_CHAR(v_i) || ' and Tabla= ' || CHR(39) || v_tabla || CHR(39) || '
union all '
INTO v_sql
FROM CatCamposDocumento
WHERE Tabla = v_tabla
AND CampoID = v_i;
--and Obligatorio=1
v_i := v_i + 1;
END;
END LOOP;
BEGIN
v_sql := SUBSTR(v_sql, 1, LENGTH(v_sql) - 11)||';';
--OPEN cv_1 FOR SELECT v_sql FROM DUAL ;
DBMS_OUTPUT.PUT_LINE(v_sql);
EXECUTE IMMEDIATE (v_sql);
EXCEPTION
WHEN OTHERS THEN
IF TO_CHAR(SQLCODE) = '-2260'
THEN
NULL;
END IF;
END;
END;
END IF;
END;
/
Valora esta pregunta


0