2017-01-30 4 views
2

좋은 오후를 포함 2 선택 문을 결합 오류 MYSQL : 저장 기능

나는 MySQL의에서 명령 "에 대한 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 

, 나는 UNION 또는 UNION과 같이 다른 매개 변수 값으로 함수를 호출이 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 
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을 DATABASE_NAME로 NULL을 제거하거나에만 UNION을 사용하고 유지 실제 문제는 MySQL이 제공 한 오류 메시지와 관련이 없습니다 (적어도이 오류 메시지에 대한 설명은 설명서에 나와 있지 않음).

이 경우 오류는 Stored Function 구현 내에 있습니다. SELECT ... INTO 명령에서 INTO 절의 두 변수 사이에 ","가 없습니다. 선택된 열 수는 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로

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; 

또는

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;