2

MySQL を使用して、phpmyadmin を使用してユーザー定義のデータベース関数をある db サーバーから別の db サーバーにインポートするにはどうすればよいですか?

ユーザー定義関数のリストは、次の SQL を使用して取得できます。

select * from information_schema.routines;

別のデータベースサーバーに移動したい私の機能は次のとおりです。

CREATE DEFINER=`XXX`@`%` FUNCTION `BDayDiff`( d1 DATE, d2 DATE ) RETURNS int(11)
   DETERMINISTIC
BEGIN
 DECLARE dow1, dow2, days, wknddays INT;
 SET dow1 = DAYOFWEEK(d1);
 SET dow2 = DAYOFWEEK(d2);
 SET days = DATEDIFF(d2,d1);
 SET wknddays = 2 * FLOOR( days / 7 ) +
                IF( dow1 = 1 AND dow2 > 1, 1,                              
                    IF( dow1 = 7 AND dow2 = 1, 1,              
                        IF( dow1 > 1 AND dow1 > dow2, 2,      
                            IF( dow1 < 7 AND dow2 = 7, 1, 0 )  
                          )
                      )
                  );
 RETURN FLOOR(days - wkndDays);
END

しかし、私はエラーが発生します:

Error

SQL query:

CREATE DEFINER = `XXX`@`%` FUNCTION `BDayDiff` (
d1 DATE,
d2 DATE
) RETURNS INT( 11 ) DETERMINISTIC BEGIN DECLARE dow1,
dow2,
days,
wknddays INT;

MySQL said: Documentation
#1064 - You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use 
near '' at line 5 
4

5 に答える 5

6

$ を追加してこれを試してみてください。

DELIMITER $

CREATE DEFINER=`XXX`@`%` FUNCTION `BDayDiff`( d1 DATE, d2 DATE ) RETURNS int(11)
   DETERMINISTIC
BEGIN
 DECLARE dow1, dow2, days, wknddays INT;
 SET dow1 = DAYOFWEEK(d1);
 SET dow2 = DAYOFWEEK(d2);
 SET days = DATEDIFF(d2,d1);
 SET wknddays = 2 * FLOOR( days / 7 ) +
                IF( dow1 = 1 AND dow2 > 1, 1,                              
                    IF( dow1 = 7 AND dow2 = 1, 1,              
                        IF( dow1 > 1 AND dow1 > dow2, 2,      
                            IF( dow1 < 7 AND dow2 = 7, 1, 0 )  
                          )
                      )
                  );
 RETURN FLOOR(days - wkndDays);
END$
于 2012-06-13T06:41:03.287 に答える
2

これがphpmyadminで可能であることを願っています:

  • SHOW CREATE FUNCTIONを実行
  • CREATE FUNCTION ステートメントが表示されます。別の MySQL サーバーに対して実行します。
  • 関数ごとにこの手順を繰り返します。

関数にはセキュリティ オプション (DEFINER、SQL SECURITY) がある場合があることに注意してください。これらのオプションについては、ドキュメント (CREATE PROCEDURE および CREATE FUNCTION 構文) を参照してください。それらを使用する場合は、指定したユーザーが別のサーバーに作成されていることを確認してください。

SHOW CREATE FUNCTION 構文.

于 2012-06-12T14:11:14.377 に答える
0
If you are using phpmyadmin interface to execute the query for function then you should follow the steps as below: 

DELIMITER $$

CREATE FUNCTION `BDayDiff`( d1 DATE, d2 DATE ) RETURNS int(11)
    DETERMINISTIC
BEGIN
 DECLARE dow1, dow2, days, wknddays INT;
 SET dow1 = DAYOFWEEK(d1);
 SET dow2 = DAYOFWEEK(d2);
 SET days = DATEDIFF(d2,d1);
 SET wknddays = 2 * FLOOR( days / 7 ) +
                IF( dow1 = 1 AND dow2 > 1, 1,                              
                    IF( dow1 = 7 AND dow2 = 1, 1,              
                        IF( dow1 > 1 AND dow1 > dow2, 2,      
                            IF( dow1 < 7 AND dow2 = 7, 1, 0 )  
                          )
                      )
                  );
 RETURN FLOOR(days - wkndDays);
END $$

DELIMITER ;
于 2014-04-13T10:53:50.090 に答える
0

ユーザー定義関数をエクスポートするには:

PhpMyAdmin で DB を開きます。その後、「エクスポート」ボタンをクリックします。開いているウィンドウでは、次のチェックボックスを使用する必要があります (表示されていない場合は、[カスタム - 可能なすべてのオプションを表示] を選択します): 1) DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT を追加します。2) CREATE PROCEDURE / FUNCTION / EVENT を追加します。チェックしてエクスポートします。

DB にインポートするだけで問題なく動作します。

PS これらの関数は、情報スキーマ DB の Routines テーブルで確認できますが、root ユーザーであっても権限がないため、直接インポートすることはできません。

于 2015-09-03T08:16:20.253 に答える