Vai al contenuto

# ROWSORT_TIPI

## Codice Sorgente

```sql PROCEDURE "ROWSORT_TIPI" ( p_direc_cod IN VARCHAR2, o_return OUT CLOB ) AS

    v_direc        VARCHAR2(4);
    v_cod_tipo     VARCHAR2(10);
    v_cod_step     NUMBER;
    v_cod_step_new NUMBER;
    v_return       CLOB;

BEGIN

        -- Separo i valori in entrata su p_direc_cod 'direc_cod' in un array ( Es: 'desc_AN' => [ 'desc', 'AN' ] )
        ---- Seleziono la direzione (asc o desc)
    SELECT
        upper(result)
    INTO v_direc
    FROM
        TABLE ( string_to_table_enum(p_string => p_direc_cod, v_level => 0, p_separator => '_') )
    WHERE
        id = 1;

        ---- Seleziono l'cod_tipo della riga da spostare

    SELECT
        upper(result)
    INTO v_cod_tipo
    FROM
        TABLE ( string_to_table_enum(p_string => p_direc_cod, v_level => 0, p_separator => '_') )
    WHERE
        id = 2;

    IF v_direc = 'ASC' THEN

            -- Seleziono i numeri di riga
        SELECT
            cod_step,
            cod_step - 1
        INTO
            v_cod_step,
            v_cod_step_new
        FROM
            tb_tipi_mat
        WHERE
            upper(TRIM(cod_tipo)) = upper(TRIM(v_cod_tipo));

            -- Libero i numeri di riga richiesti
            -- diminuendo il numero di riga di un valore inutilizzato (Es: 0.5)

        UPDATE tb_tipi_mat
        SET
            cod_step = cod_step - 0.5
        WHERE
            cod_tipo = v_cod_tipo;

        UPDATE tb_tipi_mat
        SET
            cod_step = cod_step - 0.5
        WHERE
            cod_step = v_cod_step_new;

            -- Sposto la riga precedente al posto di quella selezionata (Es: row 1 diventerà row 2)

        UPDATE tb_tipi_mat
        SET
            cod_step = v_cod_step
        WHERE
            cod_step = v_cod_step_new - 0.5;

            -- Sposto la riga selezionata al nuovo posto

        UPDATE tb_tipi_mat
        SET
            cod_step = v_cod_step_new
        WHERE
            cod_tipo = v_cod_tipo;

        v_return := 'cod_tipo: '
                    || v_cod_tipo
                    || ' - From Row '
                    || v_cod_step
                    || ' - To Row '
                    || v_cod_step_new;

    ELSIF v_direc = 'DESC' THEN

            -- Seleziono i numeri di riga
        SELECT
            cod_step,
            cod_step + 1
        INTO
            v_cod_step,
            v_cod_step_new
        FROM
            tb_tipi_mat
        WHERE
            upper(TRIM(cod_tipo)) = upper(TRIM(v_cod_tipo));

            -- Libero i numeri di riga richiesti
            -- diminuendo il numero di riga di un valore inutilizzato (Es: 0.5)

        UPDATE tb_tipi_mat
        SET
            cod_step = cod_step + 0.5
        WHERE
            cod_tipo = v_cod_tipo;

        UPDATE tb_tipi_mat
        SET
            cod_step = cod_step + 0.5
        WHERE
            cod_step = v_cod_step_new;

            -- Sposto la riga precedente al posto di quella selezionata (Es: row 1 diventerà row 2)

        UPDATE tb_tipi_mat
        SET
            cod_step = v_cod_step
        WHERE
            cod_step = v_cod_step_new + 0.5;

            -- Sposto la riga selezionata al nuovo posto

        UPDATE tb_tipi_mat
        SET
            cod_step = v_cod_step_new
        WHERE
            cod_tipo = v_cod_tipo;

        v_return := 'cod_tipo: '
                    || v_cod_tipo
                    || ' - From row. '
                    || v_cod_step
                    || ' - To row: '
                    || v_cod_step_new;

    END IF;

    o_return := v_return;

END;```