Возврат списка значений с заменой значений и курсоров - PullRequest
0 голосов
/ 16 апреля 2020

Мне нужно написать код, который возвращает список стран, когда вы пишете название континента. Конечно, страны должны быть на этом континенте. Когда этот список возвращается, столбец VISUALIZADO из таблицы PAISES будет обновлен значением «Да». Курсор должен быть использован. Имена на испанском sh, так как мой учитель хочет, чтобы мы это делали, но эти слова легко понять. Вот две таблицы для этого упражнения:

CREATE TABLE PAISES (

COD_PAIS NUMBER(3),

NOMBRE VARCHAR2(30),

COD_CONTINENTE NUMBER(3),

VISUALIZADO VARCHAR2(2)

);

CREATE TABLE CONTINENTES (

COD_CONTINENTE NUMBER(3),

NOMBRE VARCHAR2(30)

);

То, что я написал:

SET SERVEROUTPUT ON;

DECLARE
v_ncont continentes.nombre%TYPE := &nombre_continente;
v_codcont continentes.cod_continente%TYPE;

cursor listado_paises is 
select cod_pais, nombre, cod_continente, visualizado
from paises;

BEGIN
if v_ncont = continentes.nombre THEN
UPDATE paises
SET visualizado = 'Si'
WHERE paises.cod_continente = continentes.cod_continente;

END if;

END;

Очевидно, это не работает, но я не знаю, что мне делать! Заранее спасибо:)

Ответы [ 3 ]

0 голосов
/ 16 апреля 2020

Вы можете использовать Обновление с inner view и FOR loop с DBMS_OUTPUT, чтобы распечатать данные следующим образом:

SET SERVEROUTPUT ON;

UPDATE (
    SELECT P.COD_PAIS, P.VISUALIZADO, C.COD_CONTINENTE
      FROM PAISES P JOIN CONTINENTES C ON P.COD_CONTINENTE = C.COD_CONTINENTE
     WHERE C.NOMBRE = '&NOMBRE_CONTINENTE'
) SET VISUALIZADO = 'Si';
COMMIT;

FOR DATAA IN (
    SELECT P.PAISES
      FROM PAISES P JOIN CONTINENTES C ON P.COD_CONTINENTE = C.COD_CONTINENTE
     WHERE C.NOMBRE = '&NOMBRE_CONTINENTE'
) LOOP
    DBMS_OUTPUT.PUT_LINE(DATAA.PAISES);
END LOOP;

END;
/
0 голосов
/ 23 апреля 2020

Я пытался сделать это в течение нескольких дней, и, наконец, я нашел решение.

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;

Это не идеально, потому что сообщение об исключении не будет отображаться, но я пишу новый вопрос после этого, чтобы мы могли найти решение этого!

0 голосов
/ 16 апреля 2020

Вы должны использовать курсор в l oop. Можете ли вы попробовать это

SET SERVEROUTPUT ON;

DECLARE
v_ncont continentes.nombre%TYPE := &nombre_continente;
v_codcont continentes.cod_continente%TYPE;

cursor listado_paises is 
select cod_pais, nombre, cod_continente, visualizado
from paises;

BEGIN

for l in listado_paises
loop
if v_ncont = l.nombre THEN
UPDATE paises
SET visualizado = 'Si'
WHERE paises.cod_continente = l.cod_continente;

END if;
end loop;
END;
...