Oracle 'printf' 등가
다음과 동등하거나 대안이 있습니까?
SELECT mix_type || ' (' || mix_num || ')' as description
FROM acid_batch
WHERE mix_num < 10
오라클은 printf 스타일 포맷과 같은 것을 가지고 있습니까?
SELECT printf("%s (%s)", mix_type, mix_num) as description,
FROM acid_batch
WHERE mix_num < 10
제가 생각할 수 있는 오라클용 printf에 가장 가까운 표준 근사치는 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
아니요. 이러한 방식으로 포맷 문자열을 적용하는 기본 제공 Oracle 함수는 없습니다.이 특정 예제에 대한 사용자 정의 함수를 작성하는 것은 쉽지만, printf의 PL/SQL 기반 구현을 작성하는 것은 어려울 것입니다.
이 작업이 자주 필요한 경우 보다 풍부한 문자열 처리 환경을 위해 Java 호출을 래핑하는 Oracle 함수를 작성할 수 있습니다.
Oracle SQL / PLSQL용 ora_te라는 이름의 간단한 템플릿 엔진을 만들었습니다.이를 통해 다음과 같은 방법으로 목표를 달성할 수 있습니다.
템플릿 문자열의 여러 구문 분석을 사용하면 효과적인 구현이 되지 않습니다.
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;
1회 컴파일(파싱)로 효과적인 구현:
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 또한 지정된 자리 표시자를 지원합니다.
REPLACE는 특히 템플릿이 복잡할 때 유용하다는 것을 알게 되었습니다.
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;
선택에서 해결할 수 있습니다.
SELECT mix_type || '(' || mix_num || ')' as description,
FROM acid_batch
WHERE mix_num < 10
당신은 또한 기능들을 살펴봐야 합니다.
그들은 당신이 어떻게 표현되기를 원하는지에 대해 당신에게 더 세부적인 것을 제공하기 때문입니다.
언급URL : https://stackoverflow.com/questions/1002818/oracle-printf-equivalent
'programing' 카테고리의 다른 글
Mac OS X 10.9 이후에는 PIL을 설치할 수 없습니다. (0) | 2023.07.28 |
---|---|
Tomcat에서 메모리 누수가 발생할 가능성이 매우 높은가요? (0) | 2023.07.28 |
레일즈 마이그레이션에서 검사 제약 조건을 추가하려면 어떻게 해야 합니까? (0) | 2023.07.28 |
C - 직렬화 기술 (0) | 2023.07.28 |
데이터 프레임 인덱스에 함수 적용 (0) | 2023.07.28 |