Pokemon - Insert

PHOTO EMBED

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;
content_copyCOPY