Pertanyaan Fungsi Oracle: Replikasikan wm_concat


Saat ini saya sedang mengerjakan sebuah proyek dalam Crystal Reports yang menolak untuk menggunakan fungsi tidak terdokumentasi WM_CONCAT, yang diijinkan dalam Oracle 10g. Berikut adalah informasi header WM_CONCAT

WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2

Untuk menggunakan WM_CONCAT, saya meneruskannya sebagai berikut: WM_CONCAT (column1); Fungsi ini tampaknya menerima kolom tipe varchar2, dan mengembalikan daftar nilai yang dipisahkan koma dari kolom. Saat ini saya memiliki versi kustom dari fungsi ini yang berfungsi (di komputer kerja saya), tetapi tidak optimal dan tidak dapat digunakan kembali. Adakah yang bisa memberikan yang baik, fungsi yang dapat digunakan kembali seperti WM_CONCAT yang bisa saya gunakan?


4
2017-12-28 02:50


asal


Jawaban:


Apakah Anda mendapat pesan kesalahan saat menggunakan wm_concat? Tidak seperti fungsi seperti to_char, ia dimiliki oleh wmsys dan Anda mungkin perlu menggunakan wmsys.wm_concat untuk menggunakannya. (kecuali Anda membuat sinonim yang diperlukan tentu saja).

Sekarang untuk pertanyaan yang sebenarnya,

Teknik ini disebut agregasi string.

Anda dapat menemukan banyak alternatif lain di sini.

http://www.oracle-base.com/articles/10g/StringAggregationTechniques.php Untuk metode lain, Telusuri "stragg" aktif http://asktom.oracle.com Tautan bermanfaat lainnya: http://www.orafaq.com/node/2290

Ini mungkin yang paling sering digunakan. Banyak tim menulis fungsi kustom mereka sendiri yang kurang lebih sama.

CREATE OR REPLACE FUNCTION get_employees (p_deptno  in  emp.deptno%TYPE)
  RETURN VARCHAR2
IS
  l_text  VARCHAR2(32767) := NULL;
BEGIN
  FOR cur_rec IN (SELECT ename FROM emp WHERE deptno = p_deptno) LOOP
    l_text := l_text || ',' || cur_rec.ename;
  END LOOP;
  RETURN LTRIM(l_text, ',');
END;
/
SHOW ERRORS

sementara solusi ini berfungsi untuk varchar2 dan angka, solusi generik terbaik dapat dibangun menggunakan antarmuka Oracle ODCIAggregate.

http://download-west.oracle.com/docs/cd/B14117_01/appdev.101/b10800/dciaggfns.htm#sthref462

Implementasinya sama pada tautan pertama di atas di www.oracle-base.com


8
2017-12-28 03:30



Saya telah memecahkan ini menggunakan teknik yang mirip dengan yang terakhir dalam artikel oracle-base: mendefinisikan suatu kebiasaan TABLE ketik dan tulis fungsi untuk menggabungkan nilai dari tipe itu ke dalam string. Saya memanggil fungsi saya joinstr lalu Anda bisa menyebutnya sebagai berikut:

SELECT joinstr(CAST(MULTISET(SELECT column1 FROM table1) AS my_string_table_type), ',') 
FROM DUAL

Catatan: Saya baru saja menggunakan 9i dan belum melihat ke KOLECT.


1
2017-12-28 20:28