Pokemon - Insert
Thu May 15 2025 14:44:36 GMT+0000 (Coordinated Universal Time)
Saved by @chivchav
DECLARE
/* -------------------------------------------------------------------------------------------
- L_JSON_RESPONSE: Variável do tipo CLOB (Character Large Object) que armazenará a resposta JSON da API.
- L_NEXT_URL: Variável do tipo VARCHAR2 que armazena a URL da próxima página de resultados da API.
- L_POKEMON_NAME: Variável do tipo VARCHAR2 que não é utilizada diretamente no código, mas poderia ser usada para armazenar o nome do Pokémon se necessário.
- ID: Variável do tipo NUMBER usada para armazenar o ID do Pokémon extraído da URL.
-------------------------------------------------------------------------------------------
*/
L_JSON_RESPONSE CLOB;
L_NEXT_URL VARCHAR2(4000);
L_POKEMON_NAME VARCHAR2(100);
ID NUMBER;
BEGIN
-- URL inicial da API para obter os Pokémon
L_NEXT_URL := 'https://pokeapi.co/api/v2/pokemon/';
-- Loop para continuar a buscar enquanto houver uma próxima página
LOOP
-- Faz a requisição à API
L_JSON_RESPONSE := APEX_WEB_SERVICE.MAKE_REST_REQUEST(
P_URL => L_NEXT_URL,
P_HTTP_METHOD => 'GET'
);
-- Se a resposta não for nula, processa a lista de Pokémon
IF L_JSON_RESPONSE IS NOT NULL THEN
-- Loop para processar os nomes dos Pokémon
FOR C1 IN (
SELECT JT.name, JT.url
FROM JSON_TABLE(
L_JSON_RESPONSE,
'$.results[*]' COLUMNS (
name PATH '$.name',
url PATH '$.url'
)
) JT
) LOOP
ID := REGEXP_SUBSTR(C1.url, '(\d+)(/|\?)$', 1, 1, NULL, 1);
-- Filtrar somente a 1° geração
IF ID <= 151 THEN
-- Insert na tabela base
INSERT INTO POKEMON (ID_POKEMON, NAME_POKEMON, URL_POKEMON)
VALUES (ID, C1.name, C1.url);
END IF;
END LOOP;
-- Obtém a URL da próxima página de resultados
BEGIN
SELECT JT.next
INTO L_NEXT_URL
FROM JSON_TABLE(
L_JSON_RESPONSE,
'$' COLUMNS (
next PATH '$.next'
)
) JT;
-- Se a URL for null ou vazia, sai do loop
IF L_NEXT_URL IS NULL OR L_NEXT_URL = '' OR ID > 151 THEN
EXIT;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- Se não houver o campo 'next', sai do loop
EXIT;
END;
ELSE
DBMS_OUTPUT.PUT_LINE('Resposta vazia recebida.');
EXIT; -- Se não houver resposta, sai do loop
END IF;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Erro ao processar a requisição: ' || SQLERRM);
END;



Comments