【问题标题】:Printing cursor and exception values (both won't work)打印光标和异常值(两者都不起作用)
【发布时间】:2020-04-23 10:44:26
【问题描述】:

我几天前写了一个问题,我终于设法找到了解决方案,但我现在还有一个问题。引入大陆名称时必须显示 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;

这段代码如果工作正常,只是第二条消息不会出现!

【问题讨论】:

  • “如果该名称不在数据库中” - 这是否意味着您应该检查它是否存在于 continentes 中,而不是是否有任何 paises 行?
  • 感谢巴巴罗斯和亚历克斯的回复!我已经尝试了这两种解决方案,但亚历克斯的解决方案对我有用!你们都这么快回答我的问题:)
  • 祝帕科好运。
  • 查找大陆似乎是一种非常复杂的方法。 Parece una manera muy complicada de detectar uncontine,

标签: oracle plsql database-cursor


【解决方案1】:

您没有看到该消息,因为您在游标循环中获取并检查了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;

在循环内提​​交看起来是错误的;如果引发其他错误,那么您将混合使用已更新和未更新的行。最好将其视为单个事务并提交/回滚整个事情。

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

【讨论】:

  • 非常感谢!这对我来说效果很好:D 你解释得很好。
猜你喜欢
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多