자료실에 조복기님께서 올려주신 것처럼, 파이어버드 1.5의 알파 2가 나왔습니다.
파이어버드 1.5에서는 상당히 멋진 새로운 기능들이 많이 도입되었는데, 모두 알파 1에서 도입된
기능들이고, 알파 2는 버그 패치판입니다.
아래는 알파2에 포함된 WhatsNew.txt 파일 중에서 버그 픽스를 빼고 번역한 것입니다.
각 항목들의 순서는 제 맘대로 좀 바꾸었습니다.
ROWS_AFFECTED 시스템 변수 추가
마지막 INSERT/UPDATE/DELETE 문에 의해 영향을 받은 레코드의 갯수를 리턴함.
1. PSQL에서만 사용가능
2. INSERT/UPDATE/DELETE가 아닌 다른 쿼리에서는 항상 0이 리턴됨
SQLCODE, GDSCODE 시스템 변수 추가
WHEN 블럭 안에서 캐치된 에러를 액세스할 수 있게 해줌
노트:
1. PSQL에서만 사용 가능함
2. WHEN 블럭에서만 의미가 있으며, 다른 곳에서는 0을 리턴함
CONNECTION_ID 및 TRANSACTION_ID 시스템 변수 추가
데이터베이스 헤더 페이지에 저장된 해당 ID를 리턴해줌
노트:
1. SQL/PSQL에서 사용 가능
2. 이 변수들은 데이터베이스를 리스토어하면 리셋됨
CREATE OR ALTER 쿼리문 추가
존재 여부에 따라, 데이터베이스 객체를 생성하거나 변경함
문법:
CREATE OR ALTER name <object_definition>;
노트:
1. 스토어드프로시저/트리거에만 적용 가능
2. 오라클에서의 CREATE OR REPLACE 쿼리문과 동일한 의미
RECREATE VIEW 쿼리문 추가
DROP VIEW / CREATE VIEW 두개의 쿼리문을 대체
문법:
RECREATE VIEW name <view_definition>;
COALESCE 내부 함수 추가
여러개의 연산식으로부터 컬럼 값을 얻을 수 있음, NULL이 아닌 첫번째 연산식이 컬럼 값이 됨
문법:
COALESCE(value {, value} ... )
노트:
1. COALESCE(V1, V2)는 아래의 case문과 같은 의미를 가짐
CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END
2. COALESCE(V1, V2, ..., Vn)는 아래의 case문과 같은 의미를 가짐 (여기서 n은 3 이상)
CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END
3. 오라클의 NVL과 같은 의미임
예제:
SELECT
PROJ_NAME AS Projectname,
COALESCE(e.FULL_NAME, '[> not assigned <]') AS Employeename
FROM
PROJECT p LEFT JOIN EMPLOYEE e ON (e.EMP_NO = p.TEAM_LEADER)
NULLIF 내부 함수 추가
연산식이 특정 값을 가지고 있을 경우 NULL을 리턴하며, 아니면 연산식의 결과를 리턴함
문법:
NULLIF (value, value)
노트:
NULLIF (V1, V2) is equivalent to the following case specification:
CASE WHEN V1 = V2 THEN NULL ELSE V1 END
예제:
UPDATE PRODUCTS
SET STOCK = NULLIF(STOCK, 0)
CASE 내부 함수 추가
case 연산식의 결과로 컬럼값을 결정하게 됨
문법:
<case_specification> = <simple_case> | <searched_case>
<simple_case> = CASE value <simple_when_clause> ... [ELSE value] END
<simple_when_clause> = WHEN value THEN value
<searched_case> = CASE <searched_when_clause> ... [ELSE value] END
<searched_when_clause> = WHEN <search_condition> THEN value
노트:
오라클의 DECODE와 같은 의미임
Examples:
1. 단순 case:
SELECT
o.ID,
o.Description,
CASE o.Status
WHEN 1 THEN 'confirmed'
WHEN 2 THEN 'in production'
WHEN 3 THEN 'ready'
WHEN 4 THEN 'shipped'
ELSE 'unknown status ''' || o.Status || ''''
END
FROM
Orders o
2. 검색된 case:
SELECT
o.ID,
o.Description,
CASE
WHEN (o.Status IS NULL) THEN 'new'
WHEN (o.Status = 1) THEN 'confirmed'
WHEN (o.Status = 3) THEN 'in production'
WHEN (o.Status = 4) THEN 'ready'
WHEN (o.Status = 5) THEN 'shipped'
ELSE 'unknown status ''' || o.Status || ''''
END
FROM
Orders o
BIGINT 데이터타입 추가
64비트 정수 사용 가능
노트:
dialect 3에서만 사용 가능
로컬 변수들의 선언이 강화됨
문법이 간략해지고, 한번에 변수를 선언하고 정의하는 것이 가능해짐
문법:
DECLARE [VARIABLE] name <variable_type> [{'=' | DEFAULT} value];
예제:
DECLARE my_var INTEGER = 123;
동적인 예외 메시지
예외가 생성될 때 주어진 메시지외에 다른 메시지로 예외를 발생시킬 수 있음.
문법:
EXCEPTION name [value];
예외 재발생
이미 캐치된 예외를 WHEN 블럭 내에서 재발생(re-throw)시킬 수 있음
문법:
EXCEPTION;
노트:
WHEN 블럭에서만 의미가 있으며, 다른 곳에서는 의미가 없음
지연 메타데이터 컴파일
잘 알려진 "object in use" 에러의 여러가지 원인을 해석해줌
NULL값을 가진 레코드의 순서
사용자 정의 NULL 순서 가능
문법:
[ORDER BY <order_list>]
<order_list> = {col | int} [COLLATE collation]
[ASC[ENDING] | DESC[ENDING]] [NULLS {FIRST | LAST}]
[, <order_list> ...]
노트:
기본적으로 NULL은 마지막으로 감
사용자 정의 constraint 인덱스 이름
인덱스 이름을 constraint 이름으로 하거나 사용자 정의 이름으로 할 수 있음
문법:
<col_constraint> = [CONSTRAINT constraint]
{UNIQUE [<constraint_index>]
| PRIMARY KEY [<constraint_index>]
| REFERENCES other_table [( other_col [, other_col ...])]
[ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]
[ON UPDATE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]
[<constraint_index>]
| CHECK ( <search_condition>)}
<tconstraint> = [CONSTRAINT constraint]
{{PRIMARY KEY | UNIQUE} ( col [, col ...]) [<constraint_index>]
| FOREIGN KEY ( col [, col ...]) REFERENCES other_table
[ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]
[ON UPDATE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]
[<constraint_index>]
| CHECK ( <search_condition>)}
<constraint_index> = USING [ASC[ENDING] | DESC[ENDING]] INDEX name
노트:
기본적으로 인덱스는 constraint와 같은 방식으로 이름이 붙여짐
파일 이름 변경
파이어버드임을 확실히 하기 위해 배포 파일들의 이름을 바꾸었음. (fbserver, fbclient, firebird.msg)
노트:
클라이언트 라이브러리는 이제 fbclient이며, 모든 새로운 파이어버드 기반 프로젝트에서 이용되어야 함.
gds32에는 아무 것도 없으며 익스포트를 통해 리다이렉트되어 fbclient를 가리키게 됨 (호환성 목적으로만 사용할 것)
Win32에서 새로운 레지스트리키가 이용됨
현재는 SOFTWARE\FirebirdSQL\Firebird
ODS가 약간 업그레이드됨
새로운 시스템 indice들이 추가됨(RDB$INDEX_41, RDB$INDEX_42, RDB$INDEX_43)
ODS 버전: 10.1
내부적인 한계로 인해 트리거에서 BREAK 문을 사용할 수 없게 됨 (EXIT처럼)
그룹 기능 강화
BEGIN...END 블럭의 내용을 비워둘 수 있게 되었음
ISQL에 Readline (cmd history) 지원이 추가됨
유니버설 트리거
하나의 액션 타입에 대해 하나의 트리거가 발생하도록 해줌
문법:
CREATE TRIGGER name FOR table
[ACTIVE | INACTIVE]
<trigger_action_prefix>
<trigger_action_suffix> [OR <trigger_action_suffix>] [OR <trigger_action_suffix>]
[POSITION number]
AS <trigger_body>
<trigger_action_prefix> = {BEFORE | AFTER}
<trigger_action_suffix> = {DELETE | INSERT | UPDATE}
예제:
CREATE TRIGGER my_trigger FOR my_table BEFORE INSERT OR UPDATE
AS BEGIN
IF (NEW.DOC_ID IS NULL) THEN
EXCEPTION my_exception;
END
서버사이드 데이터베이스 알리아스
모든 데이터베이스는 실제 이름 대신 알리아스를 이용하여 연결될 수 있음
데이터베이스 알리아스 이름의 리스트는 서버가 설치된 디렉토리에 aliases.conf 파일에 저장됨
예제:
aliases.conf 파일 내의 알리아스 항목: my_database = d:\dbs\my\database.gdb
연결 스트링: localhost:my_database
인-메모리 소트
소트 계획이 SQL문에서 이용될 경우, 소트는 메모리에서 수행됨
충분한 메모리가 없을 경우에는 이전처럼 임시 파일을 생성하여 소트를 함
EXECUTE VARCHAR 쿼리문 추가
스토어드프로시저/트리거에서 다이나믹 SQL문을 사용할 수 있음
문법:
EXECUTE VARCHAR value;
노트:
1. PSQL에서만 사용할 수 있음
2. 현재는 값을 리턴하지 않으므로 SELECT문에 사용할 수 없음
3. 재귀 단계는 50회로 제한됨(내부 코딩으로 제한)
예제:
EXECUTE VARCHAR my_var;
새로운 플러그인 매니저와 INTL 인터페이스
코드 대폭 정리
새로운 메모리 매니저
새로운 예외 처리 로직
새로운 autoconf 기반의 빌드 설정
C에서 C++로 포팅되었음
|