2017-06-12 2 views
0

Ich habe den folgenden Beispielcode, aber ich habe die verschiedenen Verhaltensweisen, wenn Varchar und Integer-Spalten in der Behandlung von Ausnahmen kommt.Fehlercode 1265 nicht in Ausnahmeblock eher kommen aus der Prozedur

Ich hole Namen und Gehaltsspalten Wert aus der Tabelle, aber ich habe Variablen in der Prozedur deklariert, die weniger die Tabellenspaltengröße ist.

so für Integer-Spalte Ich erhalte die folgenden Fehler

1264 | ERROR 1264 (22003): Bereich Wert für Spalte ‚v_sal‘

es wird immer in meinen Ausnahmeblock, die ich in dem Verfahren codierte

aber für varchar Spalt Ich erhalte die folgenden Fehler

eRROR 1265 (01000): Daten abgeschnitten für Spalte ‚v_ename‘ in Zeile 1

aber es ist nicht in meinem Ausnahmeblock immer eher Fehler werfen und kommen aus Verfahren

warum das Verhalten also, wie ich mit diesem VARCHAR-Szenario umgehen muss, das in meinen Ausnahmeblock kommen sollte, anstatt abrupt zu kommen.

Ich verwende MySQL 5,7

Table structure 

empid int(4) 
ename varchar(10)    
sal smallint(6) 




CREATE PROCEDURE samp_proc(in p_empno int(4), 
          out p_sal smallint, 
          out p_error_code INT, 
          out p_errmsg VARCHAR(500) 
) 

BEGIN 

declare v_ename varchar(3); 

declare v_sal tinyint; 

DECLARE EXIT HANDLER FOR SQLEXCEPTION 

begin 
    GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, 
    @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT; 

SET @full_error = CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text); 

    set p_error_code = @errno; 

    set p_errmsg = @full_error ; 

    select p_error_code,p_errmsg; 

    rollback; 
end; 


select ename,sal into v_ename,v_sal from kk_chk where empid = p_empno; 

    /* since ename is first in the fetch the varchar behavior takes the precedence 
    if we make sal column as first in the fetch the integer behavior takes the precdednce */ 


end $$ 

delimiter ; 

dank & Grüße

Karthikeyan.R

Antwort

0

Ich denke, der Fehlerblock wie erwartet verhält. gegeben

MariaDB [sandbox]> select * from users; 
+------+------+----------+-------+-----------+----------+---------+ 
| id | name | password | email | firstname | lastname | sal  | 
+------+------+----------+-------+-----------+----------+---------+ 
| 1 | aaa | NULL  | NULL | aaa  | aaa  | 1000000 | 
| 2 | bbbb | NULL  | NULL | NULL  | NULL  | 1000000 | 
+------+------+----------+-------+-----------+----------+---------+ 
2 rows in set (0.00 sec) 

Dieses leicht geänderte Verfahren

drop procedure if exists samp_proc; 
delimiter $$ 

CREATE PROCEDURE samp_proc(
    in p_empno int(4) 
    #,out p_sal smallint,out p_error_code INT,out p_errmsg VARCHAR(500) 
) 
BEGIN 
declare v_ename varchar(3); 
declare v_sal tinyint; 
declare v_id int; 
DECLARE EXIT HANDLER FOR SQLEXCEPTION 

begin 
    GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, 
    @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT; 

    SET @full_error = CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text); 
    #set p_error_code = @errno; 
    #set p_errmsg = @full_error ; 
    #select p_error_code,p_errmsg; 
    select 'error block message - ' ,@errno,@full_error; 
# rollback; 
end; 

    select name,sal,id into v_ename,v_sal,v_id from users where id = p_empno; 

    /* since ename is first in the fetch the varchar behavior takes the precedence 
    if we make sal column as first in the fetch the integer behavior takes the precdednce */ 
end $$ 

delimiter ; 

Erzeugt diese Ergebnisse

MariaDB [sandbox]> call samp_proc(1); 
+------------------------+--------+--------------------------------------------------------------------+ 
| error block message - | @errno | @full_error              | 
+------------------------+--------+--------------------------------------------------------------------+ 
| error block message - | 1264 | ERROR 1264 (22003): Out of range value for column 'v_sal' at row 1 | 
+------------------------+--------+--------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.01 sec) 

MariaDB [sandbox]> 
MariaDB [sandbox]> call samp_proc(2); 
+------------------------+--------+-----------------------------------------------------------------+ 
| error block message - | @errno | @full_error              | 
+------------------------+--------+-----------------------------------------------------------------+ 
| error block message - | 1406 | ERROR 1406 (22001): Data too long for column 'v_ename' at row 2 | 
+------------------------+--------+-----------------------------------------------------------------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

Vielleicht habe ich das Modell falsch, aber es sieht für mich in Ordnung.

+0

Danke für die Antwort, mit dem gleichen Code nur Tabellenname geändert, aber ich bekomme immer noch das gleiche Verhalten für Name Spalte. Fehler 1265 (01000): Daten für Spalte 'v_ename' abgeschnitten. Aber Sie erhalten Fehlercode 1406, aber für mich 1265, wie kommen Codes für dasselbe Szenario irgendwelche Konfigurationseinstellungen? – Keyan

Verwandte Themen