Welcome, Guest
Username: Password: Remember me

TOPIC: Error en un procedimiento almacenado, PLS-00103:

Error en un procedimiento almacenado, PLS-00103: 2 years 9 months ago #2276

  • crasho
  • crasho's Avatar
  • OFFLINE
  • Expert Boarder
  • Posts: 81
  • Karma: 0
Hola buen día, estoy intentando crear mi primer procedimiento almacenado en oracle, el código es el siguiente:
PROCEDURE SYSTEM.PROCRPTCONSTANCIA   (
pe_id_docente varchar2
)
IS
BEGIN

/*
Creacion de una tabla temporal
*/
create global temporary table temp
(
id_encuesta_alumno number,
id_usuario VARCHAR2(20),
id_grupo varchar(9),
id_dimension number,
total_dimension number
)ON COMMIT PRESERVE ROWS;

/*
Insersion de los promedios por dimension
*/
insert into temp
select a.id_encuesta_alumno,a.id_usuario,a.id_grupo,di.id_dimension,sum(op.valor)
from tbl_encuesta_alumno a
inner join cl_grupo gr on gr.id_grupo=a.id_grupo and
                          gr.id_anio=a.id_anio and
                          gr.id_periodo=a.id_periodo
inner join cl_empleado e on e.vemp_empl=gr.id_docente
inner join tbl_respuesta_alumno r on r.id_encuesta_alumno=a.id_encuesta_alumno
inner join tbl_reactivo_opcion ro on ro.id_reactivo=r.id_pregunta and ro.id_opcion=r.id_respuesta
inner join tbl_opcion op on op.id_opcion=ro.id_opcion
inner join tbl_cat_reactivo re on re.id_reactivo=r.id_pregunta
inner join tbl_cat_dimension di on di.id_dimension=re.id_dimension
where di.id_dimension<>1 and gr.id_docente=pe_id_docente
group by a.id_encuesta_alumno,a.id_usuario,a.id_grupo,di.id_dimension;

create index ndxtemp on temp (id_grupo);


/*
Tabla para crear los promedios por encuesta
*/
create global temporary table temp2
(
id_encuesta_alumno number,
id_usuario VARCHAR2(20),
id_grupo varchar(9),
total_encuesta number
);

create index ndxtemp on temp2 (id_grupo);

/*
Obtengo los totales por encuesta
*/

insert into temp2
select id_encuesta_alumno,id_usuario,id_grupo,sum(total_dimension)
from temp
group by id_encuesta_alumno,id_usuario,id_grupo


/***
Promedio por materia
*/

select tmp.id_grupo,gr.id_docente,
       emp.vemp_nombre || ' ' || emp.vemp_apepat || ' ' || emp.vemp_apemat as nombre_docente ,
       emp.vemp_horas,gr.id_ubc,u.nm_ubc,
       sum(tmp.total_encuesta)/count(tmp.id_encuesta_alumno) as promedio_materia,
       count(tmp.id_encuesta_alumno)as total_alumnos
from temp2 tmp
left join cl_grupo gr on gr.id_grupo=tmp.id_grupo
left join cl_empleado emp on emp.vemp_empl=gr.id_docente
left join cl_ubc u on u.id_ubc=gr.id_ubc
group by tmp.id_grupo,gr.id_docente,emp.vemp_nombre,emp.vemp_apepat,emp.vemp_apemat,emp.vemp_horas,gr.id_ubc,u.nm_ubc;

END procRptConstancia;

Lo estoy creando desde un cliente, llamado SQL Manager for Oracle, y al darle compile y luego Execute, me sale el sig error:
PLS-00103: Se ha encontrado el símbolo "CREATE" cuando se esperaba uno de los siguientes:

   begin case declare exit for goto if loop mod null pragma
   raise return select update while with <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> <<
   close current delete fetch lock insert open rollback
   savepoint set sql execute commit forall merge pipe
 (Line:  10   Col:   1)

Qué estoy haciendo mal?

Saludos y Gracias de antemano
The administrator has disabled public write access.

Re:Error en un procedimiento almacenado, PLS-00103: 2 years 9 months ago #2280

  • G3DBA
  • G3DBA's Avatar
Debes de definir las tablas temporales por fuera o con un execute, es diferente que SQL Server. Después veo que tienes un select tal cual, eso no te va a servir en oracle así no vas a poder desplegar la información. Yo no soy experto en programar procedures, pero debes de definir una variable, generlamente lo hace con un cursor.

Pero el error que ahorita tienes es por el create tenporary table, asi que lo mejor es que la crees y después la accedas por medio del procedure.



Saludos
The administrator has disabled public write access.

Re:Error en un procedimiento almacenado, PLS-00103: 2 years 9 months ago #2281

  • crasho
  • crasho's Avatar
  • OFFLINE
  • Expert Boarder
  • Posts: 81
  • Karma: 0
Ok, voy a probar con lo que me comentas del Execute, ahora de lo otro que me comentas del select, es por la manera en que está armado el procedure? es decir, en que tengo los inserts? o en general cualquier procedimiento con el uso de select me daría el problema que me estás comentado?

Saludos y Gracias
The administrator has disabled public write access.

Re:Error en un procedimiento almacenado, PLS-00103: 2 years 9 months ago #2282

  • G3DBA
  • G3DBA's Avatar
Es que la forma de deslegar la información en oracle no es igual que en sql server, en sql server solo con hacer el select lo refleja el procedure. En oracle no.
The administrator has disabled public write access.

Re:Error en un procedimiento almacenado, PLS-00103: 2 years 9 months ago #2284

  • crasho
  • crasho's Avatar
  • OFFLINE
  • Expert Boarder
  • Posts: 81
  • Karma: 0
Hola, ya probé y efectivamente funciona, usando execute immediate y para el cursor declarando un parémtro de salida del tipo sys_refcursor.

Saludos y Gracias
The administrator has disabled public write access.
Moderators: CContreras, g3dba
Time to create page: 0.187 seconds

Buscar en el sitio

Noticias Recientes

Oracle Open World 2014

Ya están las fechas para el mega evento de Oracle: Oracle OpenWorld 2014
 
Les recomiendo mucho su asistencia a este evento en donde aprenderan y vislumbrarán hacia donde va el mundo de las bbdd; y sí se registran con antelación podrán ahorrarse hasta $800.
 
Ulises Lazarini - DBA Oracle

TIPS

Para cambiar el esquema por default de tu conexión en Oracle solo es necesario ejecutar:

ALTER SESSION SET current_schema="Nombre_esquema"

Necesitas Soporte

Proveemos soporte de base de datos SQL Server, Sybase, Oracle y MySQL. Nuestro servicio, le permite contar con un experto las 24 horas al día los 365 días del año.

Nuestros servicios están diseñados para que solo pague por el soporte que necesita. El pago se realiza de manera mensual basado en el nivel de cobertura que requiera. En promedio este costo va de un 30% a un 60% menos, de lo que le pagaría a un DBA en sitio.

Contactanos