2017-02-01 9 views
0

firebird 3.0의 저장 프로 시저에서 반환 값을 여러 열의 기본값으로 사용해야합니다.열의 기본값으로 저장 프로 시저의 반환 값을 사용하는 방법?

내 절차 :

CREATE OR ALTER PROCEDURE CURRENTTIME 
returns (
    stime char(12)) 
as 
begin 
    sTime = (SELECT trim(Substring(CURRENT_TIMESTAMP FROM 12 FOR 12)) from RDB$ 
end 

그래서, 우리는 "NewOn"와 "LastChangeOn"라는 일부 특정 컬럼에 현재 시간을 기입해야합니다. Current_Time이라는 파이어 버드 자체에서 기본 프로 시저를 찾았지만 항상 '0000'이라는 밀리 초가 있습니다. '12 : 30 : 10.0000 ' 우리 데이터베이스에 밀리 세컨드가 필요하다. 내 자신의 프로 시저는 우리에게 밀리 초를 주지만 테이블에서 사용할 수는 없습니다. 테이블의

예 : 테이블이 다음과 같이 생성 될 때

CREATE TABLE USER (
    FIRSTNAME   CHAR(30), 
    LASTNAME   CHAR(50), 
    IDENT    CHAR(40) NOT NULL, 
    NEWAT    DATE DEFAULT Current_Date NOT NULL, 
    NEWON    CHAR(13) DEFAULT Current_Time(3) NOT NULL, 
    NEWFROM   CHAR(25), 
    LASTCHANGEAT  DATE DEFAULT Current_Date NOT NULL, 
    LASTCHANGEON  CHAR(13) DEFAULT Current_Time(3) NOT NULL, 
    LASTCHANGEFROM CHAR(25) 
); 

그것은 우리에게 단지 0000 밀리 초를주는 파이어 버드 - 자신의 프로 시저를 호출합니다. 나는 파이어 버드 수술과 같은 수술을 요청했다. 또한 내 프로 시저에서 "일시 중단"여부에 관계없이 테스트했지만 차이는 없습니다.

아직이 문제에 대한 해결책을 찾지 못했지만 아무도 여기에서 도와 줄 수 없습니까?

+1

그건 불가능합니다. 하지만 왜 우리가 프로그램 구조 때문에 날짜와 시간을 원한다면'LASTCHANGEON'이 타임 스탬프 열이 아닌지 궁금합니다. –

+0

@a_horse_with_no_name 우리는 서로 다른 날짜와 시간을 필요로합니다. x – eightball60

+1

적절한 시간 소인 유형과 varchar 열에 날짜 및 시간 정보를 추출하는 계산 된 열 두 개가있는 열을 만들 수 있습니다. –

답변

1

Firebird 3에서 테스트했지만 문제를 재현하지 못했습니다. 값을 삽입하는 방법을 신중히 확인하고 싶을 수도 있습니다 (예 : 사용자가 직접 시간을 할당하지 않았는지 확인). 기본값을 삭제하고 다시 설정할 수도 있습니다.

default - 절에서는 리터럴 값과 current_time과 같은 컨텍스트 변수 만 허용합니다. 당신이 당신의 자신의 기본값을 지정하려면, 당신은 만들 필요합니다 trigger :

create trigger user_BIU 
    before insert or update on "USER" 
as 
begin 
    if (new.newon is null) then 
    begin 
    new.newon = trim(Substring(CURRENT_TIMESTAMP FROM 12 FOR 12)); 
    end 
end 

이 명시 적으로 null로 설정 한 경우에도 값을 할당합니다 이것은, 디폴트는 약간 다른 효과가 있습니다. 그러나 문제를 재현 할 수 없기 때문에이 문제가 해결 될 것으로 기대하지는 않습니다.

1

documentation에 따르면, CURRENT_TIME에 대한 정밀도를 지정하는 Firebird 2.0이 작동해야합니다. DEFAULT 절에 버그가있을 수 있습니까? 당신이, 당신이 트리거를 사용할 수있는 일반 DEFAULT 절 너무 복잡 기본 값을 설정해야 할 때 나는

CREATE TRIGGER USER_Defaults 
ACTIVE BEFORE INSERT OR UPDATE 
AS 
BEGIN 
    new.LASTCHANGEON = CAST(CURRENT_TIME(3) AS CHAR(13)); 
END 

즉, 어쨌든 ... 그것을 테스트 지금 파이어 버드에 액세스 할 수 없습니다

편집

지금은 기대 작품으로 파이어 버드 2.5.1 및 기본값 (LASTCHANGEON CHAR(13) DEFAULT Current_Time(3) NOT NULL 같은 즉, 필드 정의)를 테스트 할 기회가 있었다 - INSERT 문에서 생략 할 때 나는 열에 대한 16:44:05.7840 같은 값을 가지고 . 그래서 Firebird 3.0에서 실제로 작동하지 않는다면 (테스트 할 수 없기 때문에) 회귀입니다. tracker에 버그보고를 제출하십시오.

+0

그래, 내가 이것에 대한 설명서를 읽고 (내 질문에 당신이 (3) Current_Time 뒤에서이 정밀도를 사용하여 볼 수 있습니다)하지만 도움이되지 않았다 .. 문제는 우리가 모든 테이블에서 이러한 열을 사용하는 것입니다 우리는 테이블 당 하나 더 트리거를 추가해야합니다. ( 하지만 괜찮습니다. 답변을 주셔서 감사합니다. 리더와 함께이 솔루션을 제안하고 토론 할 것입니다. – eightball60

0

여러분 모두 덕분입니다. 우리는 CURRENT_TIME 대신 CURRENT_TIME(3)으로 모든 삽입 - 또는 업데이트 문을 작성, 2005 년에 내 리더에 의해 작성 문제 .. 파이어 버드 라이브러리를 발견했습니다> _>

바보 selfmade 문제에 대한 유감 ..