如何在没有数据时验证和打印消息? PL SQL

时间:2016-07-07 21:38:05

标签: sql plsql

使用PL / SQL我试图在光标上找不到数据时验证并打印消息。我的主要问题是,如果我使用%NOTFOUND,它会被多次打印或在找到数据时打印。

这是我的代码:

set SERVEROUTPUT ON
set verify off

DECLARE
rut int;
CURSOR Ejercicio2 (rut int)
IS
SELECT alumno.nombre,alumno.apellidoP,alumno.apellidoM,Ramo.descripcion,profesor.nombre
FROM alumno
INNER JOIN alumnoramo ON alumnoramo.cod_matricula = alumno.cod_matricula
INNER JOIN Ramo ON ramo.cod_ramo = alumnoramo.cod_ramo
INNER JOIN profesor ON profesor.cod_prof = ramo.cod_prof
WHERE alumno.cod_matricula = rut;

alumno_nombre VARCHAR2(45);
alumno_apellido VARCHAR2(45);
alumno_apellidoM VARCHAR2(45);
ramo_nombre VARCHAR2(45);
profesor_nombre VARCHAR2(45);

BEGIN
rut := '&rut';
OPEN Ejercicio2 (rut);
LOOP
FETCH Ejercicio2 INTO alumno_nombre,alumno_apellido,alumno_apellidoM,ramo_nombre,profesor_nombre;
EXIT WHEN Ejercicio2%NOTFOUND;
dbms_output.put_line('Nombre: ' || alumno_nombre);
dbms_output.put_line('Apellido: ' || alumno_apellido);
dbms_output.put_line('Apellido Materno: ' || alumno_apellidoM);
dbms_output.put_line('Ramo: ' || ramo_nombre);
dbms_output.put_line('Profesor: ' || profesor_nombre);
END LOOP;
CLOSE Ejercicio2;
END;

当用户输入“车辙”时,通常应该打印找到的数据并结束。如果输入“rut”并且没有返回数据,那么它应该打印一条消息并结束程序。我无法这样做。

3 个答案:

答案 0 :(得分:1)

使用下面的代码块。我知道你是否收到一些错误。我只是在记事本上写了它,它应该像我期望的那样。

set SERVEROUTPUT ON
set verify off

DECLARE
rut int;
CURSOR Ejercicio2 (rut int)
IS
SELECT alumno.nombre,alumno.apellidoP,alumno.apellidoM,Ramo.descripcion,profesor.nombre
FROM alumno
INNER JOIN alumnoramo ON alumnoramo.cod_matricula = alumno.cod_matricula
INNER JOIN Ramo ON ramo.cod_ramo = alumnoramo.cod_ramo
INNER JOIN profesor ON profesor.cod_prof = ramo.cod_prof
WHERE alumno.cod_matricula = rut;

TYPE Ejercicio2_typ IS TABLE OF Ejercicio2%ROWTYPE;
Ejercicio2_tbl Ejercicio2_typ;

BEGIN
rut := '&rut';
OPEN Ejercicio2 (rut);
FETCH Ejercicio2 BULK COLLECT INTO Ejercicio2_tbl;
IF Ejercicio2_tbl.count >0 THEN
  FOR rec IN Ejercicio2_tbl.first..Ejercicio2_tbl.last LOOP
    dbms_output.put_line('Nombre: ' || Ejercicio2_tbl(rec).alumno_nombre);
    dbms_output.put_line('Apellido: ' || Ejercicio2_tbl(rec).alumno_apellido);
    dbms_output.put_line('Apellido Materno: ' || Ejercicio2_tbl(rec).alumno_apellidoM);
    dbms_output.put_line('Ramo: ' || Ejercicio2_tbl(rec).ramo_nombre);
    dbms_output.put_line('Profesor: ' || Ejercicio2_tbl(rec).profesor_nombre);
  END LOOP;
ELSE
    dbms_output.put_line('No data found');
END IF;
CLOSE Ejercicio2;
END;
/

快乐的编码。 如果满足您的需求,请将其标记为答案。

答案 1 :(得分:0)

只是变体和处理场景的简洁方法。希望它有所帮助。

CREATE OR REPLACE TYPE obj IS OBJECT
(
nombre VARCHAR2(100),
apellidoP VARCHAR2(100)
apellidoM VARCHAR2(100)
descripcion VARCHAR2(100)
nombre VARCHAR2(100)
);

CREATE OR REPLACE TYPE tab IS TABLE OF obj;

SET SERVEROUTPUT ON
SET verify OFF
DECLARE
  rut INT:=&Enter_rut;
tab1 tab;
BEGIN
  SELECT obj(alumno.nombre,alumno.apellidoP,alumno.apellidoM,Ramo.descripcion,profesor.nombre) BULK COLLECT
  INTO tab1
  FROM alumno
  INNER JOIN alumnoramo
  ON alumnoramo.cod_matricula = alumno.cod_matricula
  INNER JOIN Ramo
  ON ramo.cod_ramo = alumnoramo.cod_ramo
  INNER JOIN profesor
  ON profesor.cod_prof       = ramo.cod_prof
  WHERE alumno.cod_matricula = rut;
  IF tab1.EXISTS(1) THEN
    FOR I IN tab1.FIRST..tab1.LAST
    LOOP
      dbms_output.put_line('Nombre: ' || tab1(i).nombre);
      dbms_output.put_line('Apellido: ' || tab1(i).apellidoP);
      dbms_output.put_line('Apellido Materno: ' || tab1(i).apellidoM);
      dbms_output.put_line('Ramo: ' || tab1(i).descripcion);
      dbms_output.put_line('Profesor: ' || tab1(i).nombre);
    END LOOP;
  ELSE
    dbms_output.put_line('no data found for the Input');
  END IF;
END;

答案 2 :(得分:0)

你可以在循环中设置一个布尔变量,然后在结尾检查它是真还是假:

set define on
accept rut number prompt 'Introduza un identificador de class: '
var rut number
exec :rut := &rut

declare
    cursor ejercicio2
        ( cp_rut int )
    is
        select alumno.nombre     as alumno_nombre
             , alumno.apellidop  as alumno_apellido
             , alumno.apellidom  as alumno_apellidom
             , ramo.descripcion  as ramo_nombre
             , profesor.nombre   as profesor_nombre
        from   alumno
               join alumnoramo
               on   alumnoramo.cod_matricula = alumno.cod_matricula
               join ramo
               on   ramo.cod_ramo = alumnoramo.cod_ramo
               join profesor
               on   profesor.cod_prof = ramo.cod_prof
        where  alumno.cod_matricula = cp_rut;

    l_encontro boolean := false;
begin
    for r in ejercicio2(:rut)
    loop
        l_encontro := true;
        dbms_output.put_line('Nombre: ' || r.alumno_nombre);
        dbms_output.put_line('Apellido: ' || r.alumno_apellido);
        dbms_output.put_line('Apellido Materno: ' || r.alumno_apellidom);
        dbms_output.put_line('Ramo: ' || r.ramo_nombre);
        dbms_output.put_line('Profesor: ' || r.profesor_nombre);
    end loop;

    if not l_encontro then
        dbms_output.put_line('No se encontraron las classes por rut ' || :rut);
    end if;
end;
/

(对不起我的谷歌西班牙语。)

或者您可以将其初始化为0并报告处理的行数。