The Fisher-Yates shuffle in PL/SQL
DECLARE
TYPE tab_t IS TABLE OF VARCHAR2(20);
tab tab_t
:= tab_t('11',
'22',
'33',
'44',
'55');
cnt NUMBER;
idx NUMBER;
tmp VARCHAR2(20);
BEGIN
DBMS_RANDOM.seed(TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));
cnt := CEIL(DBMS_RANDOM.VALUE(0, tab.COUNT));
FOR i IN tab.FIRST .. cnt LOOP
idx := CEIL(DBMS_RANDOM.VALUE(i, tab.COUNT));
tmp := tab(idx);
tab(idx) := tab(i);
tab(i) := tmp;
DBMS_OUTPUT.put(tab(i) || ' ');
END LOOP;
DBMS_OUTPUT.new_line;
DBMS_RANDOM.terminate;
END;