وظيفة Oracle: تكرار WM_CONCAT
-
21-09-2019 - |
سؤال
أعمل حاليًا على مشروع ضمن تقارير Crystal يرفض استخدام الوظيفة غير الموثقة WM_CONCAT ، والتي يمكن السماح بها داخل Oracle 10G. هنا هي معلومات رأس WM_CONCAT
WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2
لاستخدام wm_concat ، أمررها فيما يلي: wm_concat (column1) ؛ يبدو أن هذه الوظيفة تقبل عمودًا من النوع varchar2 ، ويقوم بإرجاع قائمة قيم محددة من العمود. لدي حاليًا نسخة مخصصة من هذه الوظيفة التي تعمل (على جهاز الكمبيوتر الخاص بي) ، لكنها ليست مثالية وتفتقر إلى إعادة استخدامها. هل يمكن لأي شخص تقديم وظيفة جيدة وقابلة لإعادة الاستخدام مثل WM_Concat التي يمكنني استخدامها؟
المحلول
هل تحصل على رسالة خطأ عند استخدام WM_CONCAT؟ على عكس وظائف مثل To_char ، فإنها مملوكة لـ WMSYS وقد تحتاج إلى استخدام wmsys.wm_concat لاستخدامها. (ما لم تنشئ المرادفات الضرورية بالطبع).
الآن للسؤال الفعلي ،
وتسمى هذه التقنية تجميع السلسلة.
يمكنك العثور على الكثير من البدائل الأخرى هنا.
http://www.oracle-base.com/articles/10g/stringaggregationtechniques.phpللحصول على طرق أخرى ، ابحث عن "Stragg" على http://asktom.oracle.comرابط مفيد آخر: http://www.orafaq.com/node/2290
ربما هذا هو الأكثر استخداما. تكتب الكثير من الفرق وظائفها المخصصة التي تفعل الشيء نفسه.
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
على الرغم من أن هذا الحل يعمل لـ Varchar2 والرقم ، يمكن بناء أفضل حل عام باستخدام واجهة Oracle Odciaggregate.
http://download-west.oracle.com/docs/cd/b14117_01/appdev.101/b10800/dciaggfns.htm#sthref462
التنفيذ لنفسه في الرابط الأول أعلاه على www.oracle-base.com
نصائح أخرى
لقد قمت بحل هذا باستخدام تقنية مشابهة للآخر في مقالة Oracle-Base: تحديد العرف TABLE
اكتب واكتب وظيفة لتجميع قيمة لهذا النوع في سلسلة. اتصلت بوظيفتي joinstr
وبعد ذلك يمكنك تسميته على النحو التالي:
SELECT joinstr(CAST(MULTISET(SELECT column1 FROM table1) AS my_string_table_type), ',')
FROM DUAL
ملاحظة: كنت في التاسعة من الساعة التاسعة حتى وقت قريب ولم أبحث عن جمع بعد.