سؤال

هل هناك ما يعادل أو بديل لما يلي؟

SELECT mix_type || ' (' || mix_num || ')' as description
  FROM acid_batch
 WHERE mix_num < 10

هل لدى Oracle شيء مثل تنسيق نمط PrintF؟

SELECT printf("%s (%s)", mix_type, mix_num) as description,
  FROM acid_batch
 WHERE mix_num < 10
هل كانت مفيدة؟

المحلول

لا ، لا توجد وظائف أوراكل مدمجة تطبق سلسلة تنسيق بهذه الطريقة. على الرغم من أنه سيكون من السهل كتابة وظيفة مخصصة لهذا المثال المحدد ، إلا أن كتابة تطبيق PRINTF المستند إلى PL/SQL سيكون أمرًا صعبًا.

إذا كانت لديك حاجة متكررة لهذا ، فربما يمكنك كتابة وظيفة Oracle التي تلتف دعوة Java لبيئة معالجة السلسلة الأكثر ثراءً.

نصائح أخرى

أقرب تقريب قياسي للطباعة لـ Oracle يمكنني التفكير فيه utl_lms.format_message. ومع ذلك ، لن يعمل في عبارات SQL ، أي أن هذا جيد:

begin
  dbms_output.put_line(
    utl_lms.format_message('hello %s, the number is %d', 'world', 42)
  );
end;
/

لكن هذا يعطي ملف ORA-00902: نوع بيانات غير صالح خطأ:

select utl_lms.format_message('hello %s, the number is %d', 'world', 42)
  from dual

مجرد فكرة أخرى بالنسبة لك: لقد وجدت أن استبداله مفيد لهذا النوع من الأشياء ، خاصة عندما يكون القالب معقدًا:

SELECT REPLACE(REPLACE(
        '%mix_type% (%mix_num%)' /*template*/
       ,'%mix_type%', mix_type)
       ,'%mix_num%' , mix_num ) as description,
FROM   acid_batch
WHERE  mix_num < 10

الجانب السلبي الوحيد هو أنك تحتاج إلى إضافة أكبر عدد ممكن REPLACE(لأن هناك متغيرات لاستبدالها - ولكن على الأقل تحتاج فقط إلى الحصول على متغير لكل متغير ، بغض النظر عن عدد المرات التي يظهر فيها في القالب.

(ملاحظة: لا توجد أهمية خاصة لاستخدام "٪" كمحدد ، إنها مجرد اتفاقية شخصية لي - يمكنك اختيار نمط مختلف ، على سبيل المثال <mix_type> أو [mix_type])

بالنسبة لهذه الحالة بالذات ، يبدو الأمر مبالغًا فيه ، ولكن في بعض الحالات يمكن أن يجعل الأمور أسهل بكثير ، على سبيل المثال:

template := 'bla bla %a% %b% %a%';
output := REPLACE(REPLACE(template
    ,'%a%', some_complex_expression)
    ,'%b%', b);

قارن ما سبق مع:

output := 'bla bla ' || some_complex_expression || ' ' || b || ' ' || some_complex_expression;

لقد صنعت محرك قالب بسيط اسمه ora_te (على جيثب) لأوراكل SQL / PLSQL. بمساعدة من ذلك ، يمكن تحقيق هدفك بالطرق التالية:

تنفيذ غير فعال مع أرقام متعددة لسلسلة القالب:

with acid_batch as (
  select rownum as mix_type, rownum + 2 as mix_num 
  from all_objects
  where rownum < 10
)
--
SELECT pk_te.substitute('$1 ($2)', ty_p( mix_type, mix_num ) ) as description
FROM acid_batch
WHERE mix_num < 10;

تطبيق فعال مع تجميع لمرة واحدة (تحليل):

with acid_batch as (
  select rownum as mix_type, rownum + 2 as mix_num 
  from all_objects
  where rownum < 10
),
--
o as ( 
  select ty_te.compile_numbered( '$1 ($2)' ) te from dual
)
SELECT pk_te.substitute( o.te, ty_p( mix_type, mix_num ) ) as description
FROM acid_batch, o
WHERE mix_num < 10;

راجع للشغل يدعم أيضا العناصر النائبة.

يمكنك حلها في الاختيار.

SELECT mix_type || '(' ||  mix_num || ')' as description,
FROM acid_batch
WHERE mix_num < 10

يجب عليك أيضًا إلقاء نظرة على الوظائف

to_char

حتي اليوم

to_number

لأنهم يعطون حبيبتك الدقيقة حول كيفية تمثيل الأشياء.

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