SQL - PROCEDIMIENTO ALMACENADO Y TRIGGER

 
Vista:
sin imagen de perfil

PROCEDIMIENTO ALMACENADO Y TRIGGER

Publicado por AYUDA A NOVATO (2 intervenciones) el 13/12/2020 21:07:26
Hola buenas, estoy empezando en el mundo de la programación y oracle SQL se me complica un poco jejeje.
Tengo un par de dudas estando haciendo unos ejercicios me encontre un par que se me atascan =(
El primero el mas sencillo, montar un trigger:
Tengo que montar un trigger que muestre por consola cuantos alumnos tengo en cada curso al modificar o alterar la tabla de alumnos.
Las tablas son dos una de cursos y otra de alumnos muy sencillas. Bien mi codigo quedo asi:

1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE TRIGGER mostrarcuros ON ALUMNOS
AFTER INSERT OR UPDATE AS
 DECLARE CURSOR
Total_alumnos IS SELECT numero_alumno,count(*) as total
                          FROM ALUMNOS
                          group by Nombre_alumno;
    a_nombre ALUMNOS.nombre;
BEGIN
FOR ALUMNOS in Total_alumnos LOOP
SELECT numero_alumno,count(*) as total from ALUMNOS
end loop;
end;
Podrian explicarme que tengo mal y porque creo que me lie un poco con el mysql =(

La otra es un procedimiento almacenado que permita introducir datos de un alumno donde es necesario controlar que no exista clave duplicada;

1
2
3
4
5
6
7
8
9
CREATE PROCEDURE entrar_alumno(nombre ALUMNOS.nombre,numero_alumno ALUMNOS.numero_alumno,curso ALUMNOS.curso,fecha ALUMNOS.fecha_inscripcion)
IS
BEGIN
SELECT COUNT(numero_alumno) INTO entrar_alumno
    FROM ALUMNOS
        WHERE UPPER(NUMERO_ALUMNO)=UPPER(numero_alumno);
IF (ALUMNOS.numero_alumno=entrar_alumno.numero_alumno)THEN
 DBMS_OUTPUT.PUT_LINE('clave duplicada');
    END IF;


Y me lo crea pero me sale un error de comando no terminado apropiadamente y (Encountered the symbol "end-of-file"....
Muchas gracias por la ayuda de antemano =)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

PROCEDIMIENTO ALMACENADO Y TRIGGER

Publicado por anonymous (43 intervenciones) el 13/12/2020 23:20:25
En Oracle para manejar procedimientos que devuelvan conjuntos de resultados de un select cualquiera, siempre debe hacerse a través de una variable de tipo OUT, llamada: SYS_REFCURSOR. De otra forma no te funcionaría.

Y para el segundo te falta finalizar con END entrar_alumno

Sin embargo para que crear un trigger que controle una clave duplicada, si eso lo restringes desde la misma creación de la tabla, sea que indiques que la columna va a ser Primary Key o Unique, pudiendo indicar que un conjunto de varias columnas conformarán una llave compuesta de tipo Unique

No le veo mucho sentido a ese trigger, cuando la misma tabla se encarga de controlar lo que pretendes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

PROCEDIMIENTO ALMACENADO Y TRIGGER

Publicado por AYUDA A NOVATO (2 intervenciones) el 13/12/2020 23:57:34
Vale lo del trigger es un ejercicio para aprender a manejar los comandos y los triggers, o sea que me crea un conflicto el trigger por la clave duplicada o el planteamiento incluyendo la variable OUT aunque no tenga logica estaria bien hecho?
y al ponerle el end me sale un nuevo error:
- PLS-00488:'ALUMNOS.NOMBRE' must be a type
Esto que es que tengo mal identificado los datos de la tabla o algun error de codigo
Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

PROCEDIMIENTO ALMACENADO Y TRIGGER

Publicado por anonymous (43 intervenciones) el 14/12/2020 00:52:10
No tienes claros los conceptos sobre Procedimientos Almacenados, por favor apoyate en google hay mucho ejemplo.

https://www.tutorialesprogramacionya.com/oracleya/temarios/descripcion.php?cod=250&punto=1&inicio=

https://livesql.oracle.com/apex/livesql/s/i75ood86xhnmdbn1epz51t77n

http://www.lsi.us.es/docencia/get.php?id=5784

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
--Ejemplo Procedure que devuelve un select
CREATE OR REPLACE PROCEDURE SPR_R_ObtenerAcceso
(
  p_DOCUMENTO  IN  VARCHAR2,
  p_CLAVE      IN  VARCHAR2,
  Out_Data      OUT SYS_REFCURSOR
)
 
IS
 
BEGIN
      OPEN Out_Data for
      SELECT OPERARIO_ID, NOMBRES, APELLIDOS, PERFIL
	  FROM TBL_OPERARIOS
	  WHERE DOCUMENTO =  p_DOCUMENTO AND CLAVE = p_CLAVE;
 
END SPR_R_ObtenerAcceso;
 
 
--Ejemplo Procedure Actualizar un registro
CREATE OR REPLACE PROCEDURE SPR_U_CambioClave
(
  p_OPERARIO_ID           IN  TBL_OPERARIOS.OPERARIO_ID%TYPE,
  p_CLAVE_ANTERIOR        IN  TBL_OPERARIOS.CLAVE%TYPE,
  p_CLAVE_NUEVA           IN  TBL_OPERARIOS.CLAVE%TYPE,
  p_RESULTADO             OUT NUMERIC
)
 
AS
 
v_DatoExiste TBL_OPERARIOS.CLAVE%TYPE:= null;
 
BEGIN
 
      p_RESULTADO := 0;
 
      SELECT CLAVE INTO v_DatoExiste FROM TBL_OPERARIOS WHERE OPERARIO_ID = p_OPERARIO_ID;
      IF (v_DatoExiste <> p_CLAVE_ANTERIOR) THEN
          p_RESULTADO := 1;
      ELSE
 
          UPDATE TBL_OPERARIOS SET
          CLAVE                = p_CLAVE_NUEVA,
          MODIFICADOPOR        = p_OPERARIO_ID,
          FECHAMODIFICACION    = SYSDATE
          WHERE OPERARIO_ID    = p_OPERARIO_ID;
 
          COMMIT;
      END IF;
 
 
      EXCEPTION
      WHEN OTHERS THEN
      p_RESULTADO := SUBSTR(SQLCODE,1,20);
 
END  SPR_U_CambioClave;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar