Oracle 'Printf'등가
-
05-07-2019 - |
문제
다음과 동등하거나 대안이 있습니까?
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
해결책
이 방식으로 서식 문자열을 적용하는 내장 된 Oracle 함수는 없습니다. 이 특정 예제에 대해 사용자 정의 기능을 작성하는 것은 쉽지만 Pl/SQL 기반 Printf 구현을 작성하는 것은 어려울 것입니다.
이 문제가 빈번한 경우 더 풍부한 문자열 처리 환경을 위해 Java 호출을 감싸는 Oracle 기능을 작성할 수 있습니다.
다른 팁
내가 생각할 수있는 Oracle의 Printf와 가장 가까운 표준 근사치는 IS utl_lms.format_message. 그러나 SQL 문에서는 작동하지 않습니다. 즉, 이것이 괜찮습니다.
begin
dbms_output.put_line(
utl_lms.format_message('hello %s, the number is %d', 'world', 42)
);
end;
/
그러나 이것은 a를 준다 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 (github) Oracle 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;
BTW는 또한 지명 된 자리 표시자를 지원합니다.