2017-09-12 15 views
0

私はpostgresトリガーをmysqlトリガーに転置しようとしています。postgresqlトリガーをmysqlトリガーに変換する

DELIMITER // 
CREATE TRIGGER trig_b_i_compute_date 
    BEFORE INSERT ON campaigns 
    FOR EACH ROW 
    BEGIN 
     DECLARE date_min DATE; 
     DECLARE date_max DATE; 
     DECLARE temp_year INTEGER; 

    SET temp_year = SELECT CONVERT(SUBSTRING(NEW.dc_date_label,1,5), UNSIGNED INTEGER) ; 
    SET date_min = SELECT CONVERT(CONCAT(temp_year,'-01-10'), DATE); 
    SET date_max = SELECT CONVERT(CONCAT(temp_year + 1, '09-30'), DATE); 

    SET NEW.dc_date_start = date_min; 
    SET NEW.dc_date_end = date_max; 


    END; 
    // 
DELIMITER ; 

私はエラーを取得するしかし:

MySQL server version for the right syntax to use near 'SELECT CONVERT(SUBSTRING(NEW.dc_date_label,1,5), UNSIGNED INTEGER) ; 

何それは自動的に日付に従って行にフィールドを追加するには、これは私がmysqlの上で何をやったかである

CREATE FUNCTION convert_date() 
    RETURNS trigger 
    AS $$ 

declare 
    date_min DATE; 
    date_max DATE; 
    temp_year INTEGER; 
begin 
    SELECT SUBSTRING(NEW."dc_date_label",0,5)::integer 
    INTO temp_year; 

    SELECT date(temp_year || '-01-10') 
    INTO date_min; 

    SELECT date(temp_year +1 || '-09-30') 
    INTO date_max; 

    NEW."dc_date_start" = date_min; 
    NEW."dc_date_end" = date_max; 

    RETURN new; 
end; 

CREATE TRIGGER trig_b_i_compute_date() 
    BEFORE INSERT 
    ON campaigns 
    FOR EACH ROW 
    EXECUTE PROCEDURE convert_date(); 

を追加しましたプロシージャに間違っていますか?

+0

@s ..を削除してください。 –

+0

まだ同じエラーがあります – TLR

+0

dc_date_labelのデータタイプは?そして、価値観はどのように見えますか? –

答えて

0

あなたはSET文でSELECTを使用する場合は、カッコ内にそれを配置する必要があります:

SET temp_year = (SELECT ...); 

しかし、あなたの場合には、あなたがSELECTを必要としない、あなたはそれをスキップすることができます。

SET temp_year = CONVERT(...); 

SELECT CONVERT(...) INTO temp_year; 

そして12月に必要はありません:あなたはまた、MySQLでSELECT INTO構文を使用することができます

レアdate_minおよびdate_max。明示的にすべてをキャストする必要もありません。あなたのトリガー本体は次のようになります。

DECLARE temp_year INTEGER; 

SET temp_year = CONVERT(SUBSTRING(NEW.dc_date_label,1,5), UNSIGNED); 
SET NEW.dc_date_start = CONCAT(temp_year,  '-01-10'); 
SET NEW.dc_date_end = CONCAT(temp_year + 1, '-09-30'); 

私はdc_date_labelは次のようになり、そしてなぜ今年は5文字の長さでなければならないのか分かりません。だから、私はその年をそのまま保管しました。

SET temp_year = YEAR(NEW.dc_date_label); 

そして、それははるかに短いですから、あなたもインラインでそれを使用してtemp_year変数をスキップすることもできます:

SET NEW.dc_date_start = CONCAT(YEAR(NEW.dc_date_label),  '-01-10'); 
SET NEW.dc_date_end = CONCAT(YEAR(NEW.dc_date_label) + 1, '-09-30'); 

それはDATE、DATETIMEまたはTIMESTAMPだ場合でも、あなただけYEAR機能を使用することができます最後の1つ:ENDの後にセミコロンを削除します。それはうまくいくかもしれませんが、そこには属しません。