programing

Oracle 'printf' 등가

stoneblock 2023. 7. 28. 21:45

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

당신은 또한 기능들을 살펴봐야 합니다.

to_char

지금까지

to_number

그들은 당신이 어떻게 표현되기를 원하는지에 대해 당신에게 더 세부적인 것을 제공하기 때문입니다.

언급URL : https://stackoverflow.com/questions/1002818/oracle-printf-equivalent