打印光标和异常值(两者都不起作用)
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。但大概你的任务需要这种方法。
几天前我写了一个问题,我终于找到了解决方案,但我现在又多了一个问题。在介绍大陆名称时必须显示 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。但大概你的任务需要这种方法。