nativecode=2013 ** Lost connection to MySQL server during query I think 2016 is Lost database connection
What I am doing is I have a PHP class object that calls a stored procedure. I don't think I'm hitting any timeouts because it happens in less than a second. So here is my stored procedure: create procedure getElement (IN n VARCHAR(255),IN ptime DOUBLE) BEGIN DECLARE mfid INT UNSIGNED; DECLARE pid INT UNSIGNED; DECLARE foffset INT UNSIGNED; DECLARE flength INT UNSIGNED; DECLARE vid INT UNSIGNED; DECLARE rfid INT UNSIGNED; DECLARE tpid INT UNSIGNED; DECLARE fdata BLOB; DECLARE fdata_tmp BLOB; DECLARE fdata_bigint BIGINT UNSIGNED; DECLARE fdata_signed INT; DECLARE fdata_unsigned INT UNSIGNED; DECLARE fdata_float DOUBLE; DECLARE data_type VARCHAR(20); DECLARE byte_order VARCHAR(20); DECLARE conv_param VARCHAR(255); SELECT major_frame_desc_id, parent_id, frame_offset, frame_length, version_id, top_level_parent_id FROM MajorFrameDescription WHERE name=n INTO mfid,pid,foffset,flength,vid,tpid; SELECT attribute_value FROM MajorFrameAttributes WHERE major_frame_desc_id=mfid AND attribute_name="NormalizedType" INTO data_type; SELECT attribute_value FROM MajorFrameAttributes WHERE major_frame_desc_id=mfid AND attribute_name="ConvParams" INTO conv_param; SELECT attribute_value FROM MajorFrameAttributes WHERE major_frame_desc_id=mfid AND attribute_name="ByteOrder" INTO byte_order; SELECT MAX(raw_major_frame_id) FROM RawMajorFrames WHERE major_frame_desc_id=tpid INTO rfid; IF rfid >0 THEN SELECT payload_time, SUBSTR(BINARY(frame_data), FLOOR(foffset/8)+1, CEIL((flength + (foffset %8 ))/8)) FROM RawMajorFrames WHERE raw_major_frame_id=rfid INTO ptime,fdata; call toBigInt(fdata,fdata_bigint); IF (foffset %8) >0 THEN SET @mask_off=foffset%8; call mask_data(fdata,@mask_off,fdata_bigint); END IF; IF (8-((flength+(foffset%8)) %8)) > 0 THEN SELECT (fdata_bigint >> (8-((flength+(foffset%8)) %8))) INTO fdata_bigint; END IF; CASE data_type WHEN "Float" THEN call toFloat(fdata_bigint,fdata_float); IF(!ISNULL(conv_param)) THEN call polyConv(fdata_float,conv_param,fdata_float); END IF; SET @fdata_converted=fdata_float; WHEN "Double" THEN call toFloat(fdata_bigint,fdata_float); IF(!ISNULL(conv_param)) THEN call polyConv(fdata_float,conv_param,fdata_float); END IF; SET @fdata_converted=fdata_float; WHEN "Signed" THEN call toSigned(fdata_bigint,fdata_signed); SET @fdata_converted=fdata_signed; WHEN "Unsigned" THEN SET @fdata_converted=fdata_bigint; ELSE SET @fdata_converted=HEX(fdata); END CASE; call enumConv(fdata_bigint,mfid,@fdata_enum); IF(!ISNULL(@fdata_enum)) THEN SET @[EMAIL PROTECTED]; END IF; SELECT mfid AS major_frame_desc_id, n AS name, pid AS parent_id, tpid AS top_level_parent_id, rfid AS raw_major_frame_id, foffset AS frame_offset, flength AS frame_length, vid AS version_id, ptime AS payload_time, HEX(fdata) AS raw_data, @fdata_converted AS converted_data; ELSE SELECT rfid; END IF; END Some procedures it uses are: CREATE PROCEDURE toBigInt (IN fdata BLOB,OUT fdata_int BIGINT UNSIGNED) BEGIN SET @string_data=CONCAT('0x',HEX(fdata)); DROP TEMPORARY TABLE IF EXISTS make_conversion; CREATE TEMPORARY TABLE make_conversion(toint BIGINT UNSIGNED); SET @q=CONCAT('INSERT INTO make_conversion set toint=(',@string_data,'+0)'); PREPARE st1 from @q; EXECUTE st1; DEALLOCATE PREPARE st1; SELECT toint from make_conversion into fdata_int; END $$ CREATE PROCEDURE toUnsigned (IN fdata BIGINT UNSIGNED,OUT fdata_int INT UNSIGNED) BEGIN SET @string_data=CONCAT('0x',HEX(fdata)); DROP TEMPORARY TABLE IF EXISTS make_conversion; CREATE TEMPORARY TABLE make_conversion(toint INT UNSIGNED); SET @q=CONCAT('INSERT INTO make_conversion set toint=(',@string_data,'+0)'); PREPARE st1 from @q; EXECUTE st1; DEALLOCATE PREPARE st1; SELECT toint from make_conversion into fdata_int; END $$ CREATE PROCEDURE toSigned (IN fdata BIGINT UNSIGNED,OUT fdata_int INT) BEGIN SET @string_data=CONCAT('0x',HEX(fdata)); DROP TEMPORARY TABLE IF EXISTS make_conversion; CREATE TEMPORARY TABLE make_conversion(toint INT); SET @q=CONCAT('INSERT INTO make_conversion set toint=(',@string_data,'+0)'); PREPARE st1 from @q; EXECUTE st1; DEALLOCATE PREPARE st1; SELECT toint from make_conversion into fdata_int; END $$ CREATE PROCEDURE toFloat (IN fdata BIGINT UNSIGNED,OUT fdata_float DOUBLE) BEGIN SET @string_data=CONCAT('0x',HEX(fdata)); DROP TEMPORARY TABLE IF EXISTS make_conversion; CREATE TEMPORARY TABLE make_conversion(tofloat DOUBLE); SET @q=CONCAT('INSERT INTO make_conversion set tofloat=(',@string_data,'+0)'); PREPARE st1 from @q; EXECUTE st1; DEALLOCATE PREPARE st1; SELECT tofloat from make_conversion into fdata_float; END $$ CREATE PROCEDURE shift_right(IN fdata_bigint BIGINT UNSIGNED,IN shift INT UNSIGNED,OUT fdata_bigint2 BIGINT UNSIGNED) BEGIN SELECT fdata_bigint >> shift INTO fdata_bigint2; END $$ CREATE PROCEDURE mask_data(IN fdata BLOB,IN mask_off INT UNSIGNED,OUT fdata_bigint2 BIGINT UNSIGNED) BEGIN DECLARE top_byte TINYBLOB; DECLARE top_int BIGINT UNSIGNED; SELECT SUBSTR(BINARY(fdata),1,1) INTO top_byte; call toBigInt(top_byte,top_int); SELECT ((top_int << mask_off) & 0xFF) >> mask_off INTO top_int; SET @string_data=CONCAT('0x',HEX(top_int),HEX(SUBSTR(BINARY(fdata),2))); DROP TEMPORARY TABLE IF EXISTS make_conversion; CREATE TEMPORARY TABLE make_conversion(toint INT); SET @q=CONCAT('INSERT INTO make_conversion set toint=(',@string_data,'+0)'); PREPARE st1 from @q; EXECUTE st1; DEALLOCATE PREPARE st1; SELECT toint FROM make_conversion INTO fdata_bigint2; END $$ CREATE PROCEDURE polyConv(IN fdata DOUBLE,IN conv_param VARCHAR(255),OUT fdata_converted DOUBLE) BEGIN DECLARE beginning VARCHAR(255); DECLARE end_of VARCHAR(255); DECLARE query VARCHAR(255); SELECT SUBSTR(conv_param,1,POSITION('x' in conv_param)-1) INTO beginning; SELECT SUBSTR(conv_param,POSITION('x' in conv_param)+1) INTO end_of; SET @string_query=CONCAT("SELECT ",beginning,fdata,end_of,"INTO @fdata_converted"); PREPARE st1 FROM @string_query; EXECUTE st1; DEALLOCATE PREPARE st1; SELECT @fdata_converted INTO fdata_converted; END $$ CREATE PROCEDURE enumConv(IN fdata INT UNSIGNED,mfid INT UNSIGNED,OUT fdata_converted VARCHAR(100)) BEGIN SELECT name FROM EnumLiterals WHERE major_frame_desc_id=mfid AND value=fdata INTO fdata_converted; END Are there some error cases I'm failing to catch and that is the cause of the apparent database connection loss? BTW: these are the first procedures I've writting so I'm a novice with stored procedures. Accomplishing the impossible means only that the boss will add it to your regular duties. David Godsey -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]