打印光标和异常值(两者都不起作用)

Printing cursor and exception values (both won't work)

几天前我写了一个问题,我终于找到了解决方案,但我现在又多了一个问题。在介绍大陆名称时必须显示 DBMS.OUTPUT_PUT.LINE 消息,如果该名称不在数据库中,则会显示错误。我的问题是出现了正确的消息,但错误消息不会出现。会是什么呢?提前致谢!正如我在上一个问题中所说,有些名字是用西班牙语写的,因为我的老师希望我们这样做,但它们很容易理解。

DECLARE
  no_existe EXCEPTION;
  variable number;
  CURSOR listado_paises is
    SELECT *
      FROM paises
     WHERE paises.cod_continente in
           (select cod_continente
              FROM continentes
             WHERE nombre = '&escribe_nombre_cont');
BEGIN
  FOR i in listado_paises 
  LOOP
    UPDATE paises
       SET visualizado = 'Si'
     WHERE cod_continente = i.cod_continente;

    SELECT count(*)
      into variable
      FROM paises
     WHERE paises.cod_continente in
           (select cod_continente
              FROM continentes
             WHERE nombre = '&escribe_nombre_cont');

    IF variable = 0 THEN RAISE no_existe; END IF;      
    DBMS_OUTPUT.PUT_LINE('Nombre pais: ' || i.nombre);
    COMMIT;
  END LOOP;
 EXCEPTION
  WHEN no_existe THEN 
       DBMS_OUTPUT.PUT_LINE('El continente no existe, por favor, revise el nombre');
END;

这段代码如果没有问题,就是第二条消息不会出现!

您没有看到该消息,因为您正在游标循环中获取和检查 variable;但如果该值不存在,则游标查询找不到任何行,并且您首先不会进入循环,因此您永远不会到达计数查询。

将检查移至循环之前:

...
BEGIN

    SELECT count (*) into variable
    FROM paises
    WHERE paises.cod_continente in
    (select cod_continente FROM continentes WHERE nombre = '&escribe_nombre_cont');

    IF variable = 0 THEN
        RAISE no_existe;
    END IF;

    for i in listado_paises loop
        UPDATE paises
        SET visualizado ='Si'
        WHERE cod_continente = i.cod_continente;

        DBMS_OUTPUT.PUT_LINE ('Nombre pais: ' || i.nombre);
        --COMMIT;
    END LOOP;
EXCEPTION 
    WHEN no_existe THEN 
        DBMS_OUTPUT.PUT_LINE ('El continente no existe, por favor, revise el nombre'); 
END;

在循环内提​​交看起来不对;如果抛出其他错误,那么您将混合使用更新行和未更新行。最好将其视为单笔交易和 commit/rollback 整个交易。

当然,您不需要逐行更新,您可以进行一次更新;并且真的不需要 PL/SQL。但大概你的任务需要这种方法。