---
    kalau saya coba manggil pake
    SELECT function('who'
    )
    FROM DUAL
    gak mereturn apa-apa
    outputnya
    ORA-01785: ORDER BY item must be the number of a SELECT-list expression
---

Saya coba test satu record berdasarkan contoh kasus posting sebelumnya, 
bisa dan gak error
SQL> select order_kel('D') FROM DUAL;
ORDER_KEL('D')
--------------------------------------
121110
Mungkin ketika modifikasi function ada masalah. Dari error message-nya 
sepertinya di dalam function ada clause ORDER BY yg merefer kolom yg gak 
ada a/ jumlah kolom yg diselect tidak sesuai angka setelah ORDER BY.

---
    ya kan udah ada no nya

    WHO PARENT NO
    A NULL 1
    B NULL 2
    C NULL 3
    B1.1.1 B 1
---

Beda, no record hanya merefer ke urutannya dalam parent yg sama satu 
tingkat di atasnya, sementara no yg dihasilkan function merefer ke 
urutannya dalam sekumpulan record yg di-query.

---
    kan masalahnya gini
    SELECT WHO
    FROM TABLE
    ORDER BY FUNC_SORT(WHO)
    Kalau sih FUNC_SORT bisa mendapatkan no_sort dari pemasalahan tabel 
ini kan
    mudah
    cuma jika sih FUNC_SORT hanya bisa looping cuma di B aja ya no_sort nya
    gak dapet semua donk pak Awal
    sehingga gak bisa
    seperti ini outputnya.  
    A
    B
    B1.1.1
    C

    WHO PARENT NO NO_SORT
    A NULL 1 1
    B NULL 2 2
    C NULL 3 4
    B1.1.1 B 1 3
---

Di sini pemahamannya yg beda, no_sort yg dihasilkan sudah mewakili 
urutan record dalam query.
Bukan hanya bisa looping di B tetapi pemberian nilai untuk turunan B 
akan berakhir di B karena B sendiri sudah ada no urutnya di tabel, 
demikian juga turunan A akan berakhir di A, dst. Kalau di-sort maka A 
(no.1) dan turunannya akan berada paling atas, diikuti B (no.2) dan 
turunannya, dst.
Kita coba lagi dg contoh baru di atas:

SQL> CREATE TABLE kel (
  2  who VARCHAR2(12) NOT NULL,
  3  parent VARCHAR2(12),
  4  no NUMBER DEFAULT 1);
Table created.

SQL> INSERT INTO kel VALUES ('A',NULL,1);
1 row created.
SQL> INSERT INTO kel VALUES ('B',NULL,2);
1 row created.
SQL> INSERT INTO kel VALUES ('C',NULL,3);
1 row created.
SQL> INSERT INTO kel VALUES ('B.1.1.1','B',1);
1 row created.

SQL> CREATE OR REPLACE FUNCTION order_kel(v_who IN VARCHAR2) RETURN 
VARCHAR2 IS
  2   v_parent VARCHAR2(12);
  3   v_no NUMBER(3);
  4   t_no VARCHAR2(10);
  5   t_who VARCHAR2(12);
  6   v_stat BOOLEAN;
  7   n NUMBER(3);
  8 
  9  BEGIN
 10   t_no := '';
 11   t_who := v_who;
 12   v_stat := TRUE;
 13   n := 0;
 14   WHILE v_stat LOOP
 15    SELECT parent,no INTO v_parent,v_no FROM kel WHERE who = t_who; 
 16    t_no := v_no||n||t_no;
 17    IF v_parent IS NULL THEN
 18     v_stat := FALSE;
 19    END IF;
 20    t_who := v_parent;
 21    n := n + 1;
 22   END LOOP;
 23   RETURN t_no;
 24  END;
 25  /
Function created.

SQL> SELECT who FROM kel ORDER BY order_kel(who);
WHO
------------
A
B
B.1.1.1
C

Awal

Kirim email ke