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と呼ばれるFirebird自体からデフォルトのプロシージャを見つけましたが、ミリ秒は常に '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ミリ秒を与えるのFirebird-自身のプロシージャを呼び出します。私はファイヤーバードの手順のような私の手続きを呼び出そうとしました。また、私は手順で "サスペンド"の有無にかかわらずテストしましたが、違いはありません。

この問題の解決策はまだ見つかりませんでしたので、誰でも私をここで助けることができますか?

+1

これはできません。しかし、私たちのプログラム構造のために 'LASTCHANGEON'がタイムスタンプの列でないのはなぜでしょうか? –

+0

@a_horse_with_no_name私たちはプログラムの構造上、日付と時刻を別々にする必要があります。これは次のとおりです。x – eightball60

+1

適切なタイムスタンプタイプと日付と時刻の情報をvarcharカラムに抽出する2つの計算カラムを持つカラムを作成できます。 –

答えて

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 

すなわち、とにかく...それをテストするために、今のFirebirdへのアクセス権を持っていません

EDIT

私は今、期待の著作物としてのFirebird 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の背後で使用していました)が、助けにはなりませんでした。 問題は、テーブルごとにもう1つのトリガーを追加する必要があります:( しかし、大丈夫です、あなたの答えをありがとう – eightball60

0

皆さん、ありがとうございます。私たちは、CURRENT_TIMEの代わりCURRENT_TIME(3)ですべてのインサートまたは更新ステートメントを構築し、2005年に私の指導者によって書かれた問題.. Firebirdのライブラリーを、見つけた> _>

愚かな自作の問題のためにとても残念..

関連する問題