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