سؤال

أعمل حاليًا على مشروع ضمن تقارير 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

ملاحظة: كنت في التاسعة من الساعة التاسعة حتى وقت قريب ولم أبحث عن جمع بعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top