Sólo otra idea para usted: He encontrado Reemplazar a ser útil para este tipo de cosas, sobre todo cuando la plantilla es compleja:
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
El único inconveniente es que hay que añadir tantos REPLACE(
' ya que hay variables para reemplazar, pero al menos solo necesita tener una por variable, independientemente de cuántas veces aparezca en la plantilla.
(NOTA: No hay significado particular a la utilización de "%" como delimitador, es sólo una convención personal mío - puede elegir un patrón diferente, por ejemplo <mix_type>
o [mix_type]
)
Para este particular instancia que parece una exageración, pero en algunos casos puede hacer las cosas mucho más fácil, por ejemplo:
template := 'bla bla %a% %b% %a%';
output := REPLACE(REPLACE(template
,'%a%', some_complex_expression)
,'%b%', b);
Compare lo anterior con:
output := 'bla bla ' || some_complex_expression || ' ' || b || ' ' || some_complex_expression;
La sintaxis de (str_a || '' || str_b) o lo anterior para rodear una cadena con paréntesis parece fea (para el código) y difícil de leer. Parece que debería haber una manera más elegante. – Steven
Otra solución sería escribir un paquete pl/sql que tome argumentos y formatee las cosas de la forma que desee. – EvilTeach
Desafortunadamente PL/SQL no (todavía) admite números variables y tipos de parámetros para una función: la forma más cercana sería implementar FUNCTION printf (t varchar2, v1 varchar2: = null, v2 varchar2: = null, v3 varchar2: = null, v4 varchar2: = null, v5 varchar2: = null) RETURN VARCHAR2 (agregue parámetros varchar2 adicionales si los necesita). Aunque consideraría cambiarle el nombre porque el propósito de printf es enviar el resultado a stdout, mientras que aquí espera que simplemente devuelva la cadena resultante. –