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