Samstag, 7. April 2018

Custom Pagination in ORDS using PL/SQL as source Type

the best way to develop a ORDS web service is to use pl/sql as source typ and you can place your logic in a pl / sql package and you are 100% flexible.

the problem is that when you  create a get handler with pl / sql, you do not have paging. you can not paginate your services. You have to implement that yourself.

With this example we show how to do pagination of a simple service using as source typ pl/sql

here is how it look in APEXEA2 18.1




You can write your code behind a Package. Here is just a sample example.

PL/SQL Source:


DECLARE
    v_count      NUMBER;
    v_previous   VARCHAR2(255);
    v_next       VARCHAR2(255);
    v_limit      NUMBER := 5;

    FUNCTION is_number ( p_string IN VARCHAR2 ) RETURN INT IS
        v_new_num   NUMBER;
    BEGIN
        v_new_num := to_number(p_string);
        RETURN 1;
    EXCEPTION
        WHEN value_error THEN
            RETURN 0;
    END is_number;

BEGIN
    IF
        is_number(:m) = 0
    THEN
        :status := 400;
        OPEN :error FOR
            SELECT
                :m || ' must be a number' message,
                1 code,
                400 status
            FROM
                dual;

    ELSE
        SELECT
            COUNT(*)
        INTO
            v_count
        FROM
            eba_demo_chart_emp;

        OPEN :items FOR
            SELECT
                *
            FROM
                (
                    SELECT
                        q.*,
                        ROW_NUMBER() OVER(
                            ORDER BY 1
                        ) rn
                    FROM
                        (
                            SELECT
                                *
                            FROM
                                eba_demo_chart_emp
                        ) q
                )
            WHERE
                rn BETWEEN DECODE(
                    :m,
                    '',
                    0,
                    :m + 1
                ) AND nvl(:m + v_limit,v_limit);

        IF
            to_number(nvl(:m,0) ) < to_number(v_count)
        THEN
            :hasmore := 'true';
        ELSE
            :hasmore := 'false';
        END IF;

        :limit := v_limit;
        :offsete := nvl(:m,0);
        SELECT
            'https://apexea.oracle.com/pls/apex/paul/hr/custompagination?m='
             || nvl(
                (:m - v_limit),
                v_limit
            ) "$previous"
        INTO
            v_previous
        FROM
            dual;

        SELECT
            'https://apexea.oracle.com/pls/apex/paul/hr/custompagination?m='
             || nvl(
                (v_limit +:m),
                v_limit
            ) "$next"
        INTO
            v_next
        FROM
            dual;

        IF
            to_number(:m) > v_count
        THEN
            :next := '';
        ELSE
            :next := v_next;
        END IF;

        IF
            to_number(:m) < 0 OR
                :m IS NULL
            OR :m = ''
        THEN
            :previous := '';
        ELSE
            IF
                :m = v_limit
            THEN
                :previous := 'https://apexea.oracle.com/pls/apex/paul/hr/custompagination';
            ELSE
                :previous := v_previous;
            END IF;
        END IF;

    END IF;
EXCEPTION
    WHEN OTHERS THEN
        :status := 500;
        OPEN :items FOR
            SELECT
                'there is some errors' message,
                1 code,
                500 status
            FROM
                dual;

END;


Here is how  the Parameters are create



Demo:

https://apexea.oracle.com/pls/apex/paul/hr/custompagination

Keine Kommentare:

Kommentar veröffentlichen