簡體   English   中英

如何在Laravel 5.5遷移中將DB :: unprepared()用於mysql函數和存儲過程

[英]how to use DB::unprepared() for mysql function and stored procedure in laravel 5.5 migration

閱讀舊問題后,我嘗試在遷移文件中使用DB :: unprepared()。 但是它只給我“遇到非數值”錯誤,數據庫中沒有任何變化。 但是,當我通過添加定界符將sql語句直接輸入phpmyadmin時,它可以工作。 請建議我我所缺少的。

DB::unprepared('
    CREATE FUNCTION getNextCustomSeq
    (
        sSeqName VARCHAR(50),
        sSeqGroup VARCHAR(10)
    ) RETURNS VARCHAR(20)
    BEGIN
        DECLARE nLast_val INT;

        SET nLast_val =  (SELECT seq_val
                              FROM _sequence
                              WHERE seq_name = sSeqName
                                    AND seq_group = sSeqGroup);
        IF nLast_val IS NULL THEN
            SET nLast_val = 1;
            INSERT INTO _sequence (seq_name,seq_group,seq_val)
            VALUES (sSeqName,sSeqGroup,nLast_Val);
        ELSE
            SET nLast_val = nLast_val + 1;
            UPDATE _sequence SET seq_val = nLast_val
            WHERE seq_name = sSeqName AND seq_group = sSeqGroup;
        END IF;

        SET @ret = (SELECT concat(sSeqGroup,'-',lpad(nLast_val,6,0)));
        RETURN @ret;
    END//
    ');

哦,這是一個錯字。 您忘了逃避這一行:

SET @ret = (SELECT concat(sSeqGroup,'-',lpad(nLast_val,6,0)));

應該是:

SET @ret = (SELECT concat(sSeqGroup,\'-\',lpad(nLast_val,6,0)));

更新:

DB::unprepared('
    CREATE FUNCTION getNextCustomSeq
    (
        sSeqName VARCHAR(50),
        sSeqGroup VARCHAR(10)
    ) RETURNS VARCHAR(20)
    BEGIN
        DECLARE nLast_val INT;

        SET nLast_val =  (SELECT seq_val
                              FROM _sequence
                              WHERE seq_name = sSeqName
                                    AND seq_group = sSeqGroup);
        IF nLast_val IS NULL THEN
            SET nLast_val = 1;
            INSERT INTO _sequence (seq_name,seq_group,seq_val)
            VALUES (sSeqName,sSeqGroup,nLast_Val);
        ELSE
            SET nLast_val = nLast_val + 1;
            UPDATE _sequence SET seq_val = nLast_val
            WHERE seq_name = sSeqName AND seq_group = sSeqGroup;
        END IF;

        SET @ret = (SELECT concat(sSeqGroup,\'-\',lpad(nLast_val,6,0)));
        RETURN @ret;
    END//
');

此處發生的是您沒有逃脫引號,PHP認為您正在執行'long chunk of text' - 'long chunk of text' ,這當然會引發錯誤A non-numeric value encountered 此警告告訴您您正在嘗試對一個或多個非數字字符串進行數學表達式: http : //php.net/manual/en/migration71.other-changes.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM