2017-01-30 3 views
2

良い午後を含め2つのselect文、MYSQL:エラーは、私はMySQLでのコマンド「FOR SHOWの助成金」の動作をエミュレートするために保存された機能を作成したストアドファンクション

に入社。スクリプトの定義は次のとおりです。

CREATE FUNCTION get_grants(p_user text, p_host text, p_type text, p_obj text) 
    RETURNS text 
    NOT DETERMINISTIC 
    READS SQL DATA 
BEGIN 
... 
END; 

この関数をselect文で使用すると、正しく実行されます。例えば:しかし

SELECT User as USER, Host as HOST, 
     'GLOBAL' as PRIV_TYPE, NULL as DATABASE_NAME, 
     mydatabase.get_grants(User, Host, 'GLOBAL', '') as PRIVILEGES 
    FROM mysql.user 

、私はこのような異なるパラメータ値を持つ関数を呼び出す2つのSELECT文を、参加することALL声明UNIONまたはUNIONを使用します。

SELECT User as USER, Host as HOST, 
     'GLOBAL' as PRIV_TYPE, NULL as DATABASE_NAME, 
     mydatabase.get_grants(User, Host, 'GLOBAL', '') as PRIVILEGES 
    FROM mysql.user 
UNION ALL 
SELECT User as USER, Host as HOST, 
     'DB' as PRIV_TYPE, Db as DATABASE_NAME, 
     mydatabase.get_grants(User, Host, 'DB', Db) as PRIVILEGES 
    FROM mysql.db 
ORDER BY USER, HOST, DATABASE_NAME IS NULL, DATABASE_NAME; 

I次のエラーが発生します。#1222 - 使用されたSELECTステートメントの列数が異なります

誰でもここで何が起こっているのか、この問題を解決する方法を説明できますか?

ありがとうございます。

答えて

0

としてNULLを保ちます実際の問題は、MySQLが提供するエラーメッセージとは関係がありません(少なくとも、このエラーメッセージに関する説明はドキュメントに含まれていません)。

この場合、エラーはストアド・ファンクションの実装内にあります。 SELECT ... INTOコマンドでは、INTO節の2つの変数の間に "、"がありませんでした。選択された列の数がINTO節の変数の数に対応していましたが、問題は解決されていましたが、問題なく上記のクエリで関数を使用することができました。

参考のために、問題のクエリは:

SELECT Select_priv, Insert_priv, Update_priv, Delete_priv, 
     Create_priv, Alter_priv, Index_priv, Drop_priv, 
     Create_tmp_table_priv, Create_view_priv, Show_view_priv, 
     Create_routine_priv, Alter_Routine_priv, Execute_priv, 
     Event_priv, Trigger_priv, Grant_priv, Lock_tables_priv, 
     References_priv 
    INTO v_select_priv, v_insert_priv, v_update_priv, v_delete_priv, 
     v_create_priv, v_alter_priv, v_index_priv, v_drop_priv, 
     v_tmptables_priv, v_createview_priv, v_showview_priv, 
     v_createroutine_priv, v_alterroutine_priv, v_execute_priv, 
     v_event_priv, v_trigger_priv, v_grant_priv, v_locktables_priv, 
     v_references_priv 
    FROM mysql.db 
WHERE User = p_user 
    AND Host = p_host 
    AND Db = p_obj; 
0

問題を引き起こすのはUNION ALLだと思います。 通常、UNION ALLを使用する場合は、列の数が異なる場合でもUNIONを使用しても同じでなければなりません。 だから、どちらか試してください使用UNION ALLをし、DATABASE_NAMEとしてNULLを削除するか、のみUNIONを使用すると、ほとんど回ってしまう問題を発見しようとしている私の脳を揚げた後DATABASE_NAME

SELECT User as USER, Host as HOST, 
     'GLOBAL' as PRIV_TYPE, NULL as DATABASE_NAME, 
     mydatabase.get_grants(User, Host, 'GLOBAL', '') as PRIVILEGES 
    FROM mysql.user 
UNION 
SELECT User as USER, Host as HOST, 
     'DB' as PRIV_TYPE, Db as DATABASE_NAME, 
     mydatabase.get_grants(User, Host, 'DB', Db) as PRIVILEGES 
    FROM mysql.db 
ORDER BY USER, HOST, DATABASE_NAME IS NULL, DATABASE_NAME; 

OR

SELECT User as USER, Host as HOST, 
     'GLOBAL' as PRIV_TYPE, 
     mydatabase.get_grants(User, Host, 'GLOBAL', '') as PRIVILEGES 
    FROM mysql.user 
UNION ALL 
SELECT User as USER, Host as HOST, 
     'DB' as PRIV_TYPE, Db as DATABASE_NAME, 
     mydatabase.get_grants(User, Host, 'DB', Db) as PRIVILEGES 
    FROM mysql.db 
ORDER BY USER, HOST, DATABASE_NAME IS NULL, DATABASE_NAME; 
関連する問題