Oracle RDBMS의 함수 및 패키지 하위 집합을 에뮬레이트하는 함수 및 연산자입니다.
연결된 Google 그룹이 있습니다 - https://groups.google.com/forum/?hl=en#!forum/orafce-general
Orafce는 PostgreSQL과 호환되는 AWS Aurora와 PostgreSQL용 Azure Database에서도 지원됩니다.
이 모듈에는 Oracle 애플리케이션을 PostgreSQL로 포팅하는 데 도움이 되거나 일반적으로 유용할 수 있는 몇 가지 유용한 기능이 포함되어 있습니다.
내장된 Oracle 날짜 함수는 적합성을 위해 Oracle 10에 대해 테스트되었습니다. 1960년부터 2070년까지의 날짜 범위가 올바르게 작동합니다. 'J' 형식의 1582-10-05 이전 날짜와 다른 형식의 1100-03-01 이전 날짜는 Oracle의 버그로 인해 확인할 수 없습니다.
모든 함수는 Oracle과 완벽하게 호환되며 알려진 모든 형식 문자열을 존중합니다. 자세한 설명은 인터넷에서 찾아보실 수 있습니다. oracle round trunc date iyyy와 같은 키워드를 사용하세요.
Y,YY,YYY,YYYY,SYYY,SYEAR 연도 I,IY,IYY,IYYY iso 연도 Q, 분기 WW 주, 일을 연도의 첫날로 표시 IW 주간, 월요일부터 시작 W 주, 일을 월의 첫 번째 날로 DAY,DY,D 한 주의 첫날, 일요일 MONTH,MON,MM,RM 월 CC, SCC 세기 DDD,DD,J일 HH,HH12,HH24시간 MI 분
기능은 반올림됩니다. 즉, 7월 1일이 다음 해로 반올림됩니다. 7월 16일은 8월로 반올림됩니다.
add_months(날짜, 정수) 날짜 - 날짜에 n개월을 더한 값을 반환합니다.
add_months(날짜 '2005-05-31',1) -> 2005-06-30
last_date(date) date - 날짜 값을 기준으로 해당 월의 마지막 날을 반환합니다.
last_day(날짜 '2005-05-24') -> 2005-05-31
next_day(date, text) date - 날짜 값보다 큰 첫 번째 평일을 반환합니다.
next_day(날짜 '2005-05-24', '월요일') -> 2005-05-30
next_day(날짜, 정수) 날짜 - 위와 동일합니다. 두 번째 인수는 1..7이어야 하며 Sunday..Satday로 해석되어야 합니다.
next_day(날짜 '2005-05-24', 1) -> 2005-05-30
Month_between(date, date) 숫자 - date1과 date2 사이의 개월 수를 반환합니다. 소수 월을 계산하는 경우 Month_between 함수는 31일을 기준으로 월을 기준으로 소수를 계산합니다.
Month_between(날짜 '1995-02-02', 날짜 '1995-01-01') -> 1.0322580645161
trunc(date, text) date - 지정된 형식에 따라 날짜를 자릅니다.
trunc(날짜 '2005-07-12', 'iw') -> 2005-07-11
round(date, text) date - 지정된 형식에 따라 날짜를 반올림합니다.
round(날짜 '2005-07-12', 'yyyy') -> 2006-01-01
to_date(text) 타임스탬프 - 입력 텍스트를 타임스탬프로 타입캐스트합니다. GUC orafce.nls_date_format은 이 함수에 대한 입력 텍스트 형식을 지정하는 데 사용됩니다. 값이 비어 있거나 DEFAULT로 설정된 경우 PostgreSQL의 날짜 스타일 GUC 설정에 따라 텍스트 형식을 입력합니다.
orafce.nls_date_format 값을 DEFAULT로 설정
to_date('2014-05-19 17:23:53+5:30') -> 2014-05-19 17:23:53
orafce.nls_date_format='YYYY-MMDD HH24:MI:SS'
to_date('2014-0519 17:23:53+5:30') -> 2014-05-19 17:23:53
to_date(text, text) timestamp - 지정된 형식으로 입력 텍스트를 타임스탬프로 타입캐스트합니다. GUC orafce.orafce_emit_error_on_date_bug
는 날짜 값이 날짜에 Oracle 버그에 도달할 때 오류가 보고되는지 여부를 지정하는 데 사용됩니다. 이 버그는 'J'
형식이 사용되는 경우( 'J2299159'
) 1582-10-05
이전 날짜와 다른 형식의 경우 1100-03-01
이전 날짜에 나타납니다. 기본적으로 오류가 보고됩니다. 이 동작을 비활성화하려면 set orafce.orafce_emit_error_on_date_bug to off
.
SELECT oracle.to_date('112012', 'J'); 오류: Oracle의 버그로 인해 1582-10-05('J2299159') 이전 날짜를 확인할 수 없습니다. SELECT oracle.to_date('1003-03-15', 'yyyy-mm-dd'); 오류: Oracle의 버그로 인해 1100-03-01 이전 날짜를 확인할 수 없습니다. SET orafce.oracle_compatibility_date_limit TO 끄기; SELECT oracle.to_date('112012', 'J'); to_date ----------- 4407-07-30 00:00:00 기원전 (1줄) SELECT oracle.to_date('1003/03/15', 'yyyy/mm/dd'); to_date -------- 1003-03-15 00:00:00 (1줄)
이 모듈에는 Oracle 호환 DATE 데이터 유형 "oracle.date"의 구현과 oracle.add_months,oracle.last_day(),oracle.next_day(),oracle.months_between() 등과 같은 DATE 데이터 유형을 사용하는 함수가 포함되어 있습니다.
예:
search_path를 oracle,"$user", public, pg_catalog로 설정합니다. 테이블 생성 oracle_date(col1 date); oracle_date 값에 삽입('2014-06-24 12:12:11'::date); oracle_date에서 *를 선택하십시오. 열 1 -------- 2014-06-24 12:12:11 (1줄)
oracle.add_months(시간대 포함 타임스탬프, 정수) - 날짜 및 시간에 n개월을 더한 값을 반환합니다.
oracle.add_months(oracle.date'2005-05-31 10:12:12',1) -> 2005-06-30 10:12:12
oracle.last_day(timestamp with time zone) - 날짜 값을 기준으로 해당 월의 마지막 날을 반환합니다.
oracle.last_day(oracle.date '2005-05-24 11:12:12') -> 2005-05-31 11:12:12
oracle.next_day(timestamp with time zone, text) - 날짜 값보다 큰 첫 번째 평일을 반환합니다.
oracle.next_day(oracle.date '2005-05-24 10:12:12', '월요일') -> 2005-05-30 10:12:12
oracle.next_day(시간대 포함 타임스탬프, 정수) - 위와 동일합니다. 두 번째 인수는 1..7이어야 하며 Sunday..Saturday로 해석되어야 합니다.
oracle.next_day(oracle.date '2005-05-24 11:21:12', 1) -> 2005-05-29 11:21:12
oracle.months_between(시간대 포함 타임스탬프, 시간대 포함 타임스탬프) - 타임스탬프1과 타임스탬프2 사이의 개월 수를 반환합니다. 소수 월을 계산하는 경우 Month_between 함수는 31일을 기준으로 월을 기준으로 소수를 계산합니다.
oracle.months_between(oracle.date '1995-02-02 10:00:00', oracle.date '1995-01-01 10:21:11') -> 1.03225806451613
oracle.to_date(text,text) - 시간대 없이 타임스탬프를 반환합니다.
oracle.to_date('02/16/09 04:12:12', 'MM/DD/YY HH24:MI:SS') -> 2009-02-16 04:12:12
oracle.to_date(text) - oracle.date를 반환합니다.
oracle.to_date('02/16/09 04:12:12') -> 2009-02-16 04:12:12
oracle.sysdate() - 서버 시간대(orafce.timezone)의 명령문 타임스탬프를 반환합니다.
oracle.sysdate() -> 2015-12-09 17:47:56
oracle.dbtimezone - 서버 시간대를 반환합니다 - orafce.timezone을 통해 에뮬레이트됩니다.
oracle.dbtimezone() -> GMT
oracle.sessiontimezone() - 세션 시간대를 반환합니다 - 현재 PostgreSQL 시간대
oracle.sessiontimezone() -> 유럽/프라하
oracle.sys_extract_utc(시간대 포함 타임스탬프) - utc 시간대로 타임스탬프를 반환합니다.
oracle.sys_extract_utc(현재_타임스탬프)
oracle.sys_extract_utc(oracle.date) - utc 시간대로 타임스탬프를 반환합니다. 시간대를 지정하지 않으면 세션(현재 PostgreSQL) 시간대가 사용됩니다.
oracle.sys_extract_utc(oracle.date '2005-05-24 11:21:12', 1) -> 2005-05-24 09:21:12
oracle.to_char(timestamp) - nls_date_format의 타임스탬프를 반환합니다.
orafce.nls_date_format='YY-MonDD HH24:MI:SS' oracle.to_char(to_date('14-Jan08 11:44:49+05:30')) -> 14-Jan08 11:44:49 orafce.nls_date_format='YY-MonDD HH24:MI:SS' oracle.to_char(oracle.to_date('21052014 12:13:44+05:30','DDMMYYYY HH24:MI:SS')) -> 14-May21 12:13:44
oracle.+(oracle.date,smallint) - oracle.date를 반환합니다.
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::smallint -> 2014-07-11 10:08:55
oracle.+(oracle.date,integer) - oracle.date를 반환합니다.
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::integer -> 2014-07-11 10:08:55
oracle.+(oracle.date,bigint) - oracle.date를 반환합니다.
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::bigint -> 2014-07-11 10:08:55
oracle.+(oracle.date,numeric) - oracle.date를 반환합니다.
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::숫자 -> 2014-07-11 10:08:55
oracle.-(oracle.date,smallint) - oracle.date를 반환합니다.
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::smallint -> 2014-06-23 10:08:55
oracle.-(oracle.date,integer) - oracle.date를 반환합니다.
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::integer -> 2014-06-23 10:08:55
oracle.-(oracle.date,bigint) - oracle.date를 반환합니다.
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::bigint -> 2014-06-23 10:08:55
oracle.-(oracle.date,numeric) - oracle.date를 반환합니다.
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::숫자 -> 2014-06-23 10:08:55
oracle.-(oracle.date,oracle.date) - 배정밀도를 반환합니다.
oracle.to_date('2014-07-17 11:10:15', 'yyyy-mm-dd hh24:mi:ss') - oracle.to_date('2014-02-01 10:00:00', 'yyyy -mm-dd hh24:mi:ss') -> 166.048785
oracle.add_months,oracle.last_day,oracle.next_day,oracle.months_between과 같은 기능이 pg_catalog.add_months,pg_catalog.last_day와 나란히 설치되므로 search_path TO oracle,"$user", public, pg_catalog를 설정해야 합니다. pg_catalog.next_day,pg_catalog.months_between.
PostgreSQL에는 오라클의 테이블 'dual'이 필요하지 않지만, 오라클 사용자들이 집중적으로 사용하기 때문에 orafce에 추가되었습니다. 이 테이블은 oracle
스키마에 있습니다. 일반적으로 자격 없는 액세스를 허용하려고 하므로 이 스키마를 search_path
구성에 추가해야 합니다(예: postgresql.conf
의 search_path = 'oracle, pg_catalog, "$user", public'
).
PostgreSQL은 RAISE NOTICE를 통해 클라이언트에 정보를 보냅니다. Oracle은 dbms_output.put_line()을 사용합니다. 이는 RAISE NOTICE와 다르게 작동합니다. Oracle에는 세션 대기열이 있으며 put_line()은 대기열에 한 줄을 추가하고 get_line() 함수는 대기열에서 읽습니다. 플래그 'serveroutput'이 설정되면 클라이언트는 모든 SQL 문에 대해 대기열을 읽습니다. 다음을 사용할 수 있습니다.
dbms_output.enable()을 선택하세요. dbms_output.put_line('first_line')을 선택하세요. dbms_output.put_line('next_line')을 선택하세요. dbms_output.get_lines(0)에서 *를 선택하세요.
또는
dbms_output.enable()을 선택하세요. dbms_output.serveroutput('t')을 선택하세요. dbms_output.put_line('first_line')을 선택하세요.
이 패키지에는 활성화(), 비활성화(), serveroutput(), put(), put_line(), new_line(), get_line(), get_lines() 함수가 포함되어 있습니다. 패키지 대기열은 세션의 로컬 메모리에서 구현됩니다.
이 패키지를 사용하면 PL/pgSQL 프로그램이 서버에서 액세스할 수 있는 모든 파일을 읽고 쓸 수 있습니다. 모든 세션은 최대 10개의 파일을 열 수 있으며 최대 줄 크기는 32K입니다. 이 패키지에는 다음 기능이 포함되어 있습니다:
utl_file.fclose(file utl_file.file_type) - 파일 닫기
utl_file.fclose_all() - 모든 파일을 닫습니다.
utl_file.fcopy(src_location, src_filename, dest_location, dest_filename[, start_line][, end_line]) - 텍스트 파일 복사
utl_file.fflush(file utl_file.file_type) - 버퍼에서 모든 데이터를 플러시합니다.
utl_file.fgetattr(location, filename) - 파일 속성 가져오기
utl_file.fopen(위치 텍스트, 파일 이름 텍스트, file_mode 텍스트 [, maxlinesize int] [, 인코딩 이름]) utl_file.file_type - 파일 열기
utl_file.fremove(위치, 파일 이름) - 파일 제거
utl_file.frename(location, filename, dest_dir, dest_file[, overwrite]) - 파일 이름 바꾸기
utl_file.get_line(file utl_file.file_type) text - 파일에서 한 줄을 읽습니다.
utl_file.get_nextline(file utl_file.file_type) text - 파일에서 한 줄을 읽거나 NULL을 반환합니다.
utl_file.is_open(file utl_file.file_type) bool - 파일이 열려 있으면 true를 반환합니다.
utl_file.new_line(file utl_file.file_type [,rows int]) - 파일에 새 줄 문자를 넣습니다.
utl_file.put(file utl_file.file_type, buffer text) - 버퍼를 파일에 넣습니다.
utl_file.put_line(file utl_file.file_type, buffer text) - 파일에 줄을 넣습니다.
utl_file.putf(file utl_file.file_type, format buffer [,arg1 text][,arg2 text][..][,arg5 text]) - 서식이 지정된 텍스트를 파일에 넣습니다.
utl_file.tmpdir() - 임시 디렉토리의 경로를 가져옵니다.
PostgreSQL은 참조별 호출을 지원하지 않기 때문에 일부 함수(fclose 및 get_line)는 약간 다릅니다.
f utl_file.file_type을 선언합니다. 시작하다 f := utl_file.fopen('/tmp', 'sample.txt', 'r'); <<읽기>> 고리 시작하다 공지 '%' 올리기, utl_file.get_line(f); 예외 no_data_found일 때 종료 읽기; 끝; 끝 루프; f := fclose(f); 끝;
또는 두 번째(PostgreSQL 특정 함수 get_nextline 사용)
선언하다 f utl_file.file_type; 줄 텍스트; 시작하다 f := utl_file.fopen('/tmp', 'sample.txt', 'r'); 고리 line := utl_file.get_nextline(f); 줄이 NULL이면 종료합니다. 공지 '%' 올리기, 줄; 예외 그럼 다른 사람들은 언제 utl_file.fclose_all(); 끝;
패키지를 사용하기 전에 utl_file.utl_file_dir 테이블을 설정해야 합니다. 종료 기호('/' 또는 '') 없이 허용된 모든 디렉터리를 포함합니다. WinNT 플랫폼에서는 경로가 매번 '' 기호로 끝나야 합니다.
디렉토리 항목의 이름을 지정할 수 있습니다( utl_file.utl_file_dir
테이블의 두 번째 열). location
매개변수는 디렉토리 이름 또는 사전 경로일 수 있습니다. 위치는 먼저 디렉토리 이름으로 해석되고 확인됩니다. 찾을 수 없는 경우(두 번째 열) 위치가 해석되어 경로로 확인됩니다.
utl_file 패키지(Postgres의 스키마)의 함수에는 utl_file.utl_file_dir 테이블에 대한 액세스가 필요합니다. 이 사실은 사용자가 이러한 기능을 사용할 수 있는지 여부를 제어하는 데 사용될 수 있습니다. 기본 설정은 PUBLIC의 경우 READ입니다. INSERT, UPDATE는 권한이 있는 사용자(수퍼유저)만 수행할 수 있습니다. 따라서 권한이 없는 사용자는 이 패키지의 기능을 사용할 수 있지만 안전한 디렉터리 목록(utl_file.utl_file_dir 테이블의 내용)을 변경할 수는 없습니다. 이 테이블의 내용은 PUBLIC에 대해 표시됩니다(또는 이 패키지의 기능을 사용하는 사용자에게 표시되어야 함).
이는 DBMS_SQL 패키지의 Oracle API 구현입니다.
완전한 호환성을 보장하지는 않지만 성공적인 마이그레이션에 필요한 작업을 줄여야 합니다.
주의: PostgreSQL 아키텍처는 Oracle 아키텍처와 다릅니다. PL/pgSQL은 SQL 엔진과 동일한 컨텍스트에서 실행됩니다. 그러면 좋은 성능을 얻기 위해 Postgres에서 대량 수집 및 수집 반복과 같은 Oracle 패턴을 사용할 이유가 없습니다. 이 코드는 Oracle에서 Postgres로 일부 애플리케이션을 포팅하는 것과 관련된 작업을 줄이기 위해 설계되었으며 잘 작동할 수 있습니다. 그러나 PL/pgSQL 문을 작성하는 것에 비해 성능상의 이점은 없습니다. Oracle API 에뮬레이션에는 메모리 및 CPU 오버헤드가 있으며 이는 더 큰 데이터에서 중요할 수 있습니다.
이 확장은 Oracle의 dbms_sql 인터페이스 하위 집합을 구현합니다. 이 확장의 목표는 Oracle과의 호환성이 아니라 Oracle 애플리케이션을 Postgres로 마이그레이션하는 것과 관련된 일부 작업을 줄이기 위해 설계되었습니다. 일부 기본 대량 DML 기능이 지원됩니다.
$$ 하세요 선언하다 c 정수; 정수[]; b varchar[]; 캘리포니아 숫자[]; 시작하다 c := dbms_sql.open_cursor(); dbms_sql.parse(c, 'foo 값에 삽입(:a, :b, :c)')를 호출합니다. a := ARRAY[1, 2, 3, 4, 5]; b := ARRAY['아호이', '나즈다르', '바자르']; ca := ARRAY[3.14, 2.22, 3.8, 4]; dbms_sql.bind_array(c, 'a', a, 2, 3)를 호출합니다. dbms_sql.bind_array(c, 'b', b, 3, 4)를 호출합니다. dbms_sql.bind_array(c, 'c', ca)를 호출합니다. '삽입된 행 %d' 알림 표시, dbms_sql.execute(c); 끝; $$; $$ 하세요 선언하다 c 정수; 정수[]; b varchar[]; 캘리포니아 숫자[]; 시작하다 c := dbms_sql.open_cursor(); dbms_sql.parse(c, 'select i, ''Ahoj'' || i, i + 0.003 from generate_series(1, 35) g(i)')를 호출합니다. dbms_sql.define_array(c, 1, a, 10, 1)를 호출합니다. dbms_sql.define_array(c, 2, b, 10, 1)를 호출합니다. dbms_sql.define_array(c, 3, ca, 10, 1)를 호출합니다. dbms_sql.execute(c)를 수행합니다. dbms_sql.fetch_rows(c) > 0인 동안 고리 dbms_sql.column_value(c, 1, a)를 호출합니다. dbms_sql.column_value(c, 2, b)를 호출합니다. dbms_sql.column_value(c, 3, ca)를 호출합니다. 공지 올리기 'a = %', a; 공지 올리기 'b = %', b; 공지 올리기 'c = %', ca; 끝 루프; dbms_sql.close_cursor(c)를 호출합니다. 끝; $$;
dbms_sql.describe_columns_f
함수가 있는데, 이는 dbms_sql.describe_columns
프로시저와 유사합니다. 유형 ID는 PostgreSQL 유형 시스템과 관련되어 있습니다. 값은 Oracle의 숫자로 변환되지 않습니다.
$$ 하세요 선언하다 c 정수; r 기록; d dbms_sql.desc_rec; 시작하다 c := dbms_sql.open_cursor(); dbms_sql.parse(c, 'pg_class에서 * 선택')을 호출합니다. r := dbms_sql.describe_columns(c); 공지 '%' 올리기, r.col_cnt; r.desc_t 배열의 foreach d 고리 공지 올리기 '% %', d.col_name, d.col_type::regtype; 끝 루프; dbms_sql.close_cursor(c)를 호출합니다. 끝; $$; $$ 하세요 선언하다 c 정수; n 정수; d dbms_sql.desc_rec; 다 dbms_sql.desc_rec[]; 시작하다 c := dbms_sql.open_cursor(); dbms_sql.parse(c, 'pg_class에서 * 선택')을 호출합니다. dbms_sql.describe_columns(c, n, da)를 호출합니다. 알림 '%' 올리기, n; 배열 da의 foreach d 고리 공지 올리기 '% %', d.col_name, d.col_type::regtype; 끝 루프; dbms_sql.close_cursor(c)를 호출합니다. 끝; $$;
이 패키지는 dbms_pipe Oracle 패키지를 에뮬레이션한 것입니다. 세션 간 통신을 제공합니다. 기다리거나 기다리지 않고 메시지를 보내고 읽을 수 있습니다. 활성 파이프를 나열합니다. 파이프를 비공개 또는 공개로 설정합니다. 명시적 또는 암시적 파이프를 사용합니다.
최대 파이프 수는 50개입니다.
공유 메모리는 메시지를 보내는 데 사용됩니다.
예는 다음과 같습니다:
-- 세션 A dbms_pipe.create_pipe('my_pipe',10,true)를 선택하세요. -- 명시적 파이프 생성 select dbms_pipe.pack_message('네코제지낙'); dbms_pipe.pack_message('다른 것은 무엇이든 가능합니다');를 선택하십시오. dbms_pipe.send_message('my_pipe',20,0)를 선택하세요. -- 한도를 변경하고 기다리지 않고 보냅니다. dbms_pipe.db_pipes에서 *를 선택하십시오. -- 현재 파이프 목록 -- 세션 B dbms_pipe.receive_message('my_pipe',1); 선택 -- 메시지가 나올 때까지 최대 1초 동안 기다립니다. dbms_pipe.next_item_type()을 선택하세요. -- -> 11, 텍스트 dbms_pipe.unpack_message_text()를 선택하세요. dbms_pipe.next_item_type()을 선택하세요. -- -> 11, 텍스트 dbms_pipe.unpack_message_text()를 선택하세요. dbms_pipe.next_item_type()을 선택하세요. -- -> 0, 더 이상 항목이 없습니다. dbms_pipe.remove_pipe('my_pipe')를 선택하세요.
그러나 Oracle과 비교하면 몇 가지 차이점이 있습니다.
파이프에 대한 제한은 바이트 단위가 아니라 파이프의 요소 단위입니다.
기다리지 않고 메시지를 보낼 수 있어요
빈 메시지를 보낼 수 있습니다
next_item_type은 TIMESTAMP(유형 13)에 대해 알고 있습니다.
PostgreSQL은 RAW 유형을 모르므로 대신 bytea를 사용하십시오.
프로세스 간 통신의 또 다른 수단입니다.
-- 세션 A dbms_alert.register('boo')를 선택하세요. dbms_alert.waitany(10)에서 *를 선택하세요. -- 세션 B dbms_alert.register('boo')를 선택하세요. dbms_alert.waitany(10)에서 *를 선택하세요. -- 세션 C dbms_alert.signal('boo','좋은 하루')를 선택하세요.
이 모듈에는 PLVdate 패키지의 영업일 작업을 위한 일부 기능이 포함되어 있습니다. 자세한 문서는 PLVision 라이브러리에서 찾을 수 있습니다. 이 패키지는 다문화적이지만 기본 구성은 유럽 국가에만 적용됩니다(소스 코드 참조).
비영업일(최대 50일)과 휴일(최대 30일)을 직접 정의해야 합니다. 공휴일은 영업일이 아닌 날을 말하며 매년 동일합니다. 예를 들어, 서양 국가에서는 크리스마스 날입니다.
plvdate.add_bizdays(day date, days int) date - 날짜에 영업일 <n>일을 추가하여 생성된 날짜를 가져옵니다.
plvdate.nearest_bizday(day date) date - 사용자 정의된 특정 날짜에 가장 가까운 영업일을 가져옵니다.
plvdate.next_bizday(day date) date - 사용자가 정의한 특정 날짜로부터 다음 영업일을 가져옵니다.
plvdate.bizdays_between(day1 date, day2 date) int - 두 날짜 사이의 영업일 수를 가져옵니다.
plvdate.prev_bizday(day date) date - 주어진 날짜로부터 이전 영업일을 가져옵니다.
plvdate_isbizday(date) bool - 날짜가 영업일인지 확인하려면 이 함수를 호출하세요.
plvdate.set_nonbizday(dow varchar) - 요일을 영업일이 아닌 날로 설정합니다.
plvdate.unset_nonbizday(dow varchar) - 비영업일로 설정되지 않은 요일
plvdate.set_nonbizday(day date) - 영업일이 아닌 날로 설정
plvdate.unset_nonbizday(day date) - 비영업일로 설정되지 않은 날짜
plvdate.set_nonbizday(day date,peat bool) - 일을 비영업일로 설정합니다. 'repeat'가 true이면 해당 일은 매년 비영업일입니다.
plvdate.unset_nonbizday(day date,peat bool) - 일을 비영업일로 설정하지 않고, 'repeat'가 true인 경우 해당 일은 매년 비영업입니다.
plvdate.use_easter() - 부활절 일요일과 부활절 월요일은 휴일입니다.
plvdate.unuse_easter();
plvdate.use_easter(useit boolean);
plvdate.using_easter() bool - 부활절을 사용하면 true를 반환합니다.
plvdate.use_great_friday() - 부활절 성금요일은 휴일입니다.
plvdate.unuse_easter();
plvdate.use_easter(useit boolean);
plvdate.using_easter() bool - 부활절 대금요일을 휴일로 사용하면 true를 반환합니다.
plvdate.include_start() - bizdays_between 계산에 시작 날짜 포함
plvdate.noinclude_start();
plvdate.include_start(include boolean);
plvdate.include_start() bool;
plvdate.default_holidays(varchar) - 기본 구성을 로드합니다. 현재 체코, 독일, 오스트리아, 폴란드, 슬로바키아, 러시아, 영국, 미국 구성을 사용할 수 있습니다.
구성에는 모든 지역의 공휴일만 포함되어 있습니다. plvdate.set_nonbizday(nonbizday, true)를 사용하여 자신만의 지역 공휴일을 추가할 수 있습니다.
예:
postgres=# 선택 plvdate.default_holidays('czech'); default_holidays ----------------- (1줄) postgres=# 선택 to_char(현재_날짜, '요일'), plvdate.next_bizday(현재_날짜), to_char(plvdate.next_bizday(현재_날짜),'일'); to_char | next_bizday | to_char ---------+-------------+---------- 토요일 | 2006-03-13 | 월요일 (1줄)
비유럽 환경에 대한 변경 사항:
선택 plvdate.unset_nonbizday('토요일'); 선택 plvdate.unset_nonbizday('일요일'); 선택 plvdate.set_nonbizday('금요일'); 선택 plvdate.set_nonbizday('2006-05-19', true); 선택 plvdate.unuse_easter();
이 패키지에는 몇 가지 유용한 문자열 및 문자 함수가 포함되어 있습니다. 각 함수는 양수 및 음수 오프셋, 즉 문자열 끝에서의 오프셋을 지원합니다. 예를 들어:
plvstr.left('abcdef',2) -> ab plvstr.left('abcdef',-2) -> abcd plvstr.substr('abcdef',1,1) -> a plvstr.substr('abcdef',-1,1) -> f plvstr.substr('abcde',-2,1) -> d
기능 목록:
plvstr.normalize(str text) - 문자열 표준화 - 흰색 문자를 공백으로 바꾸고, 공백을 공백으로 바꿉니다.
plvstr.is_prefix(str text, prefix text, cs bool) - 접두사가 str의 접두사인 경우 true를 반환합니다.
plvstr.is_prefix(str text, prefix text) - 접두사가 str의 접두사인 경우 true를 반환합니다.
plvstr.is_prefix(str int, prefix int) - 접두사가 str의 접두사인 경우 true를 반환합니다.
plvstr.is_prefix(str bigint, prefix bigint) - 접두사가 str의 접두사인 경우 true를 반환합니다.
plvstr.substr(str text, start int, len int) - start_in에서 시작된 하위 문자열을 끝까지 반환합니다.
plvstr.substr(str text, start int) - start_in에서 시작된 하위 문자열을 끝까지 반환합니다.
plvstr.instr(str text, patt text, start int, nth int) - 문자열에서 패턴 검색
plvstr.instr(str text, patt text, start int) - 문자열에서 패턴 검색
plvstr.instr(str text, patt text) - 문자열에서 패턴 검색
plvstr.lpart(str text, div text, start int, nth int, all_if_notfound bool) - 문자열의 왼쪽 부분을 반환하려면 이 함수를 호출하세요.
plvstr.lpart(str text, div text, start int, nth int) - 문자열의 왼쪽 부분을 반환하려면 이 함수를 호출하세요.
plvstr.lpart(str text, div text, start int) - 문자열의 왼쪽 부분을 반환하려면 이 함수를 호출하세요.
plvstr.lpart(str text, div text) - 문자열의 왼쪽 부분을 반환하려면 이 함수를 호출하세요.
plvstr.rpart(str text, div text, start int, nth int, all_if_notfound bool) - 문자열의 오른쪽 부분을 반환하려면 이 함수를 호출하세요.
plvstr.rpart(str text, div text, start int, nth int) - 문자열의 오른쪽 부분을 반환하려면 이 함수를 호출하세요.
plvstr.rpart(str text, div text, start int) - 문자열의 오른쪽 부분을 반환하려면 이 함수를 호출하세요.
plvstr.rpart(str text, div text) - 문자열의 오른쪽 부분을 반환하려면 이 함수를 호출하세요.
plvstr.lstrip(str text, substr text, num int) - 처음부터 문자를 제거하려면 이 함수를 호출하세요.
plvstr.lstrip(str text, substr text) - 처음부터 문자를 제거하려면 이 함수를 호출하세요.
plvstr.rstrip(str text, substr text, num int) - 끝에서 문자를 제거하려면 이 함수를 호출하세요.
plvstr.rstrip(str text, substr text) - 끝에서 문자를 제거하려면 이 함수를 호출하세요.
plvstr.rvrs(str text, start int, _end int) - 역방향 문자열 또는 문자열의 일부
plvstr.rvrs(str text, start int) - 역방향 문자열 또는 문자열의 일부
plvstr.rvrs(str text) - 역방향 문자열 또는 문자열의 일부
plvstr.left(str text, n int) - 처음 num_in 문자를 반환합니다. 음수 num_in을 사용할 수 있습니다.
plvstr.right(str text, n int) - 마지막 num_in 문자를 반환합니다. 음수 num_ni를 사용할 수 있습니다.
plvstr.swap(str text, replacement text, start int, length int) - 문자열의 하위 문자열을 지정된 문자열로 바꿉니다.
plvstr.swap(str text, replacement text) - 문자열의 하위 문자열을 지정된 문자열로 바꿉니다.
plvstr.betwn(str text, start int, _end int, inclusive bool) - 시작 위치와 끝 위치 사이의 하위 문자열 찾기
plvstr.betwn(str text, start text, _end text, startnth int, endnth int, inclusive bool, gotoend bool) - 시작 위치와 끝 위치 사이의 하위 문자열 찾기
plvstr.betwn(str text, start text, _end text) - 시작 위치와 끝 위치 사이의 하위 문자열 찾기
plvstr.betwn(str text, start text, _end text, startnth int, endnth int) - 시작 위치와 끝 위치 사이의 하위 문자열 찾기
plvchr.nth(str text, n int) - 문자열에서 N번째 문자를 반환하려면 이 함수를 호출하세요.
plvchr.first(str text) - 문자열의 첫 번째 문자를 반환하려면 이 함수를 호출하세요.
plvchr.last(str text) - 문자열의 마지막 문자를 반환하려면 이 함수를 호출하세요.
plvchr.is_blank(c int) - 비어 있음
plvchr.is_blank(c text) - 비어 있음
plvchr.is_digit(c int) - 숫자임
plvchr.is_digit(c text) - 숫자임
plvchr.is_quote(c int) - 견적입니다.
plvchr.is_quote(c text) - 견적입니다.
plvchr.is_other(c int) - 다른 것입니까?
plvchr.is_other(c text) - 다른 것입니까?
plvchr.is_letter(c int) - 문자임
plvchr.is_letter(c text) - 문자입니다.
plvchr.char_name(c text) - 문자 이름을 ASCII 코드에 VARCHAR로 반환합니다.
plvchr.quoted1(str text) - ''' 사이에 인용된 텍스트
plvchr.quoted2(str text) - '"' 사이에 인용된 텍스트
plvchr.stripped(str text, char_in text) - 지정된 문자의 모든 인스턴스 문자열을 제거합니다.
PLVsubst 패키지는 대체 키워드를 기반으로 문자열 대체를 수행합니다.
plvsubst.string(template_in text, vals_in text[]) - 대체 키워드의 모든 인스턴스에 대한 문자열을 검색하고 대체 값 목록의 다음 값으로 바꿉니다.
plvsubst.string(template_in 텍스트, vals_in 텍스트[], subst_in 텍스트)
plvsubst.string(template_in 텍스트, vals_in 텍스트, delim_in 텍스트)
plvsubst.string(template_in 텍스트, vals_in 텍스트, delim_in 텍스트, subst_in 텍스트)
plvsubst.setsubst(str text) - 대체 키워드를 기본값 '%s'로 설정
plvsubst.subst() - 대체 키워드 검색
예:
select plvsubst.string('내 이름은 %s %s입니다.', ARRAY['Pavel','Stěhule']); 끈 ------------- 제 이름은 파벨 스테훌레입니다. (1줄) select plvsubst.string('내 이름은 %s %s입니다.', 'Pavel,Stěhule'); 끈 ------------- 제 이름은 파벨 스테훌레입니다. (1줄) select plvsubst.string('내 이름은 $$ $$.', 'Pavel|Stěhule','|','$$'); 끈 ------------- 제 이름은 파벨 스테훌레입니다. (1줄)
dms_utility.format_call_stack() — 호출 스택의 내용이 포함된 형식화된 문자열을 반환합니다.
postgres=# foo2() 선택; foo2 --------------------------------- ----- 호출 스택 ----- 선 개체 번호 명세서 이름 1개의 반환 함수 foo 1개의 반환 함수 foo1 1개의 반환 함수 foo2 (1줄)
이 패키지는 원래 PLVlex와 호환되지 않습니다.
postgres=# 다음에서 * 선택 plvlex.tokens('abc 조인 d ON x=y에서 * 선택', true, true); 위치 | 토큰 | 코드 | 수업 | 구분 기호 | 모드 ---+---------+------+---------+------------+------ 0 | 선택 | 527 | 키워드 | | 7 | * | 42 | 기타 | | 본인 9 | 에서 | 377 | 키워드 | | 25 | ABC | | IDENT | | 20 | 가입 | 418 | 키워드 | | 25 | 디 | | IDENT | | 27 | 에 | 473 | 키워드 | | 30 | 엑스 | | IDENT | | 31 | = | 61 | 기타 | | 본인 32 | 와이 | | IDENT | | (10행)
경고: PostgreSQL 버전 간에 키워드 코드가 변경될 수 있습니다! o plvlex.tokens(str text, skip_spaces bool,qualified_names bool) - str의 어휘 요소 테이블을 반환합니다.
이 패키지는 SQL 주입으로부터 사용자 입력을 보호합니다.
dbms_assert.enquote_literal(varchar) varchar - 선행 및 후행 따옴표를 추가하고 모든 작은 따옴표가 인접한 작은 따옴표와 쌍을 이루는지 확인하십시오.
dbms_assert.enquote_name(varchar [, boolean]) varchar - 이름을 큰따옴표로 묶습니다. 선택적인 두 번째 매개변수는 이름의 낮은화를 보장합니다. 주의 - Oracle에서는 두 번째 매개변수가 대문자입니다!
dbms_assert.noop(varchar) varchar - 확인 없이 값을 반환합니다.
dbms_assert.qualified_sql_name(varchar) varchar - 이 함수는 입력 문자열이 정규화된 SQL 이름인지 확인합니다.
dbms_assert.schema_name(varchar) varchar - 함수는 입력 문자열이 기존 스키마 이름인지 확인합니다.
dbms_assert.simple_sql_name(varchar) varchar - 입력 문자열이 단순 SQL 이름인지 확인하는 함수입니다.
dbms_assert.object_name(varchar) varchar - 입력 문자열이 기존 SQL 개체의 정규화된 SQL 식별자인지 확인합니다.
이 유닛에는 몇 가지 주장 기능이 포함되어 있습니다.
plunit.assert_true(bool [, varchar]) - 조건이 true인지 확인합니다.
plunit.assert_false(bool [, varchar]) - 조건이 false임을 확인합니다.
plunit.assert_null(anyelement [, varchar]) - 실제 값이 null임을 확인합니다.
plunit.assert_not_null(anyelement [, varchar]) - 실제 값이 null이 아닌지 확인합니다.
plunit.assert_equals(anyelement, anyelement [, double 정밀도] [, varchar]) - 예상 값과 실제 값이 동일하다고 어설션합니다.
plunit.assert_not_equals(anyelement, anyelement [, double 정밀도] [, varchar]) - 예상과 실제가 동일하다고 주장합니다.
plunit.fail([varchar]) - Fail은 제공된 메시지를 사용하여 테스트 절차가 즉시 실패하도록 하는 데 사용될 수 있습니다.
dbms_random.initialize(int) - 시드 값으로 패키지를 초기화합니다.
dbms_random.normal() - 표준 정규 분포의 난수를 반환합니다.
dbms_random.random() - -2^31 .. 2^31에서 난수를 반환합니다.
dbms_random.seed(정수)
dbms_random.seed(text) - 시드 값을 재설정합니다.
dbms_random.string(opt text(1), len int) - 임의의 문자열 생성
dbms_random.terminate() - 패키지 종료(Pg에서는 아무 작업도 수행하지 않음)
dbms_random.value() - [0.0 - 1.0)의 임의의 숫자를 반환합니다.
dbms_random.value(낮은 배정밀도, 높은 배정밀도) - [낮음 - 높음)에서 난수를 반환합니다.
이 모듈에는 concat, nvl, nvl2, lnnvl, decode, maximum, less, bitand, nanvl, sinh, cosh, tanh, oracle.substr 및 oracle.mod 기능 구현이 포함되어 있습니다.
oracle.substr(str text, start int, len int) - Oracle 호환 하위 문자열
oracle.substr(str text, start int) - Oracle 호환 하위 문자열
oracle.substr(str 숫자, 시작 숫자) - Oracle 호환 하위 문자열
oracle.substr(str 숫자, 시작 숫자, len 숫자) - Oracle 호환 하위 문자열
oracle.substr(str varchar, start 숫자) - Oracle 호환 하위 문자열
oracle.substr(str varchar, start 숫자,len 숫자) - Oracle 호환 하위 문자열
oracle.lpad(string, length [, fill]) - Oracle 호환 lpad
oracle.rpad(string, length [, fill]) - 오라클 호환 rpad
oracle.ltrim(문자열 텍스트 [, 문자 텍스트]) - Oracle 호환 ltrim
oracle.rtrim(문자열 텍스트 [, 문자 텍스트]) - Oracle 호환 rtrim
oracle.btrim(문자열 텍스트 [, 문자 텍스트]) - Oracle 호환 btrim
oracle.length(string char) - Oracle 호환 길이
oracle.listagg(str text [, 구분 기호 텍스트]) - 목록에 값을 집계합니다.
oracle.wm_concat(str text) - 값을 쉼표로 구분된 목록으로 집계합니다.
oracle.median(float4) - 중앙값 계산
oracle.median(float8) - 중앙값 계산
oracle.to_number(text) - 문자열을 숫자로 변환합니다.
oracle.to_number(numeric) - 문자열을 숫자로 변환합니다.
oracle.to_number(numeric,numeric) - 문자열을 숫자로 변환합니다.
public.to_multi_byte(text) - 모든 단일 바이트 문자를 해당 멀티바이트 문자로 변환합니다.
public.to_single_byte(text) - 모든 멀티바이트 문자를 해당 싱글바이트 문자로 변환합니다.
oracle.greatest(anyelement, anyelement[]) - Oracle 호환성이 가장 높으며 NULL 입력에 대해 NULL을 반환합니다.
oracle.least(anyelement, anyelement[]) - Oracle 호환성이 가장 낮으며 NULL 입력 시 NULL을 반환합니다.
Oracle.Mod (int, int) - Oracle Compatibility Mod, 두 번째 매개 변수가 0이면 첫 번째 매개 변수를 반환합니다.
Oracle.remainder (int, int) - 나머지 번호를 다른 번호로 나눈 값을 반환합니다.
Oracle.remainder (숫자, 숫자) - 나머지 번호를 다른 번호로 나눈 나머지 번호를 반환합니다.
oracle.sys_guid () - Bytea를 반환 -16 바이트의 글로벌 UNIQ ID
oracle.substr, oracle.lpad, oracle.rpad, oracle.ltrim, oracle.rtrim, oracle.btrim, oracle.length가 설치되어 있기 때문에 'Oracle, pg_catalog, "$ user", public'으로 search_path를 설정해야 할 수도 있습니다. -PG_CATALOG.SUBSTR, PG_CATALOG.LPAD, PG_CATALOG.RPAD, PG_CATALOG.LTRIM, pg_catalog.rtrim, pg_catalog.btrim, pg_catalog.length
함수 Oracle.decode, Oracle.greatest 및 Oracle.least는 Oracle이 Search_Path의 PG_CATALOG 이전에 있더라도 이러한 기능이 PostgreSQL Parser 및 Analyzer에서 구현되기 때문에 Supching_Path의 PG_CATALOG 이전에도 스키마 이름으로 항상 접두사를 접두사해야합니다. 스키마 이름이 없으면 내부 기능이 항상 사용됩니다.
LPAD 및 RPAD의 경우 매개 변수 문자열 및 채우기는 Char, Varchar, Text, Varchar2 또는 Nvarchar2 유형 일 수 있습니다 (마지막 두 개는 orafce 제공 유형 임). 기본 충전 문자는 반 폭 공간입니다. LTRIM, RTRIM 및 BTRIM의 경우도 마찬가지입니다.
Oracle.Length는 PostgreSQL Char 유형 만 문자 의미 만 지원하기 때문에 문자 단위로만 작동하는 제한이 있습니다.
세 가지 인수가있는 Oracle.substr는 orafce.using_substring_zero_width_in_substr ariable (Oracle, warment_oracle, orafce, waran_orafce)을 설정하는 데 종속적으로 다른 결과 (null 또는 empty string)를 반환 할 수 있습니다. 이 다른 결과는 세 번째 인수 (substring_length)가 0 인 경우에만 반환됩니다. 기본값은 경고 _oracle입니다. 즉, 경고를 높이고 NULL을 반환하는 것을 의미합니다.
이 기능은 글로벌 고유 ID를 반환합니다. "uuid-sossp"확장자에서 지정된 함수를 호출 한 다음 함수 sys_guid를 사용하기 전에이 함수를 설치해야합니다. 기본적 으로이 함수는 함수 UUID_GENERATE_V1을 사용하지만 기능 UUID_GENERATE_V1MC, UUID_GENERATE_V4 (orafce.sys_guid_source를 설정하여)도 사용할 수 있습니다. oracle.sys_guid는 builin gen_random_uuid func를 사용할 수 있습니다. 이 경우 확장 "UUID-OSSP"는 필요하지 않습니다.
Orafce의 varchar2는 varchar2에 대한 Oracle 데이터베이스 사양의 일부를 구현합니다.
Type Modifier의 단위 = '바이트'(문자 의미론은 NVarchar2 참조)
Postgresql Varchar와 달리 Varchar2에 암시 적 캐스트는 흰색 공간을 선언 된 최대 길이로 자르지 않습니다.
이러한 유형은 Null Safe를 사용할 수 있습니다 || ORAFCE.VARCHAR2_NULL_SAFE_CONCAT를 true로 활성화 할 때 연산자. 행동은 오라클과 매우 유사합니다.
주의 : - 결과가 비어 있으면 결과가 널 귀환됩니다. 이 행동입니다 기본적으로 비활성화.
주의 : - 3.7 이상의 비 호환성이 있습니다. 릴리스. 운영자 기능은 이제 안정적으로 표시됩니다 (이전에는 불변성). 안정 또는 휘발성 표현식을 통해 기능 색인을 만들 수는 없습니다.
-Null Safe Concat (기본적으로 비활성화) NULL ||를 선택하십시오 'hello':: varchar2 || 널; ORAFCE.VARCHAR2_NULL_SAFE_CONCAT를 true로 설정하십시오. NULL ||를 선택하십시오 'hello':: varchar2 || 널;
PostgreSQL은 Varchar 문자열을 해석하는 방법을 동적으로 지정할 수 없습니다. 그것은 항상 데이터베이스 인코딩에 의해 결정된 '문자'문자열로 해석합니다. 따라서 동일한 데이터베이스에서 주어진 바르 차르 유형에 대한 바이트와 문자 의미를 모두 지원할 수 없습니다. 우리는 Oracle에서 기본적으로 바이트 시맨틱을 구현하기로 결정했습니다. 캐릭터 시맨틱은 기본적으로 항상 캐릭터 의미론을 구현하는 nvarchar2를 참조하십시오.
위의 유형을 사용하여 각 문자가 임의의 바이트로 구성 될 수있는 멀티 바이트 인코딩 문자로 구성된 문자열을 저장할 때주의하십시오.
nvarchar2는 다음을 구현합니다.
유형 수정 자 단위 = '문자'(데이터베이스의 문자 세트/인코딩 사용)
문자 의미를 선호하는 경우이 유형을 사용하십시오.
Oracle과 달리 Orafce의 Varchar2 및 Nvarchar2는 '선언 된'크기에 4000 바이트 제한을 부과하지 않습니다. 실제로 그것은 약 10MB 인 PostgreSQL Varchar와 동일합니다 (Varchar는 이론적으로 크기의 값을 최대 1GB로 저장할 수 있지만)
varchar2 문자열과 함께 사용할 일부 바이트 기반 문자열 함수
substrb (varchar2, int [, int]) - 주어진 바이트 위치 (1로부터 계산)에서 시작하는 지정된 길이 (바이트)의 기판을 추출합니다. 세 번째 인수가 지정되지 않으면 문자열 끝의 길이가 고려됩니다.
strposb (varchar2, varchar2) - 지정된 하위 문자열의 위치를 주어진 문자열로 반환합니다 (하나에서 계산)
longthb (varchar2) - 주어진 문자열의 길이 (바이트)를 반환합니다.
Oracle은 NULL과 빈 문자열 사이에 차이를 만들지 않습니다 (값이 텍스트로 사용될 때). Postgres의 경우 Null과 빈 문자열은 다른 값입니다. 단순화를 위해 (Postgres 데이터베이스에서) 널 만 사용하거나 빈 문자열을 사용하지 않거나 텍스트 유형 열에 빈 문자열 만 사용하지 않도록하는 것이 좋습니다. 두 변형 모두 몇 가지 장점과 단점이 있습니다.
이것은 트리거 함수와 함께 열릴 수 있습니다.
oracle.replace_empty_strings ([ 'on'| 'true'| '경고'| '오류']))) oracle.replace_null_strings ([ 'on'| 'true'| '경고'| '오류'])))
선택적 문자열 인수는 표시기로 사용되므로 이러한 함수는 이러한 기능 내에서 행이 변경 될 때 경고 (오류)를 높이도록해야합니다.
테이블 테스트 생성 (ID Serial, Name Varchar, Surname Varchar); 트리거 test_trg를 만듭니다 삽입 또는 업데이트 전에 시험시 각 행에 대해 절차 실행 oracle.replace_empty_strings (); 테스트에 삽입 (이름, 성) 값 ( '', 'Stehule'); - 이름은 null로 대체됩니다
oracle.user_tab_columns
oracle.user_tables
oracle.user_cons_columns
oracle.user_constraints
oracle.product_componenent_version
oracle.user_objects
oracle.dba_segments
더 나은 문서화
dbms_pipe에서 더 나은 세랄화 (_send 및 _recv 함수를 통해)
임시 테이블에 의한 공유 메모리 구조 변경 : 잠금 만 Shmem, (비트 맵), tmp tbl의 데이터입니다.
이 모듈은 BSD 라이센스에 따라 릴리스됩니다.
이 프로젝트는 2008 년 Pavel Stehule <[email protected]>에 의해 설립되었습니다.
기타 기고자 :
가브리엘 바르톨 리니 (Gbartolini)
제프리 코헨 (Jcohen)
Giles Darold (Darold)
Pavan Deolasee (Pavanvd)
Peter Eisentraut (Petere)
BERA 에머슨 (B-Emerson)
Takahiro Itagaki (Itagaki)
Zdenek Kotala (Hlipa)
Amit Langote (Amitlan)
Heikki Linnakangas (Hlinnaka)
후지이 마사오
Marco Nenciarini (Mnencia)
Vinayak Pokale
개빈 셰리 (SWM)
Pavel Stehule (Okbob)
Rahila Syed (Rahila)