Hello everyone. I have a really strange issue here that I thought maybe someone could give me some insight on. I have a set of stored procedures that to my knowledge worked just fine before. To my knowledge, nothing has changed. Just yesterday I decided to test a source of data that is in the same existing format but shorter. MySQL came back with an error that says:
So, like any good experimenter, I decided to feed some of the older formatted data back in and whammo, I get the same error. Now I start scratching my head going "huh?" I then reinstall my stored procedures from backup, does the same stupid thing. So now I turn to you experts hoping someone, anyone can shed some light on why this error is happening since the SP I'm running hasn't changed.
1st procedure: parse_raw
2nd procedure - get node content:
3rd sp: GET FIRST NODE NAME
I've included my entire stored procedure file for reference if I forgot any of the SPs in the body of this message. Many thanks all :)
Code:
#1136 - Column count doesn't match value count at row 1
1st procedure: parse_raw
Code:
################### delimiter ; DROP PROCEDURE IF EXISTS `parse_raw`; DELIMITER $$ CREATE PROCEDURE `parse_raw`() BEGIN DECLARE x_id BIGINT; DECLARE xtext text; DECLARE useless1 text; DECLARE useless2 text; DECLARE x_device_string varchar(30); DECLARE x_device_id BIGINT; DECLARE slice_text text; DECLARE time_text text; DECLARE new_slice_id BIGINT; DECLARE msmnt_tag VARCHAR(30); DECLARE value_text text; DECLARE x_msmnt_type_id BIGINT; #Loop for all rows in table main_loop: LOOP #Get a row, if we can't we're done SET x_id = -1; SELECT ewise_raw_data_in.raw_id, ewise_raw_data_in.raw_data_xml FROM ewise_raw_data_in LIMIT 1 INTO x_id, xtext; IF (x_id = -1) THEN LEAVE main_loop; END IF; CALL get_node_content(xtext, 'energywise', xtext, useless1, useless2); CALL get_node_content(xtext, 'device', x_device_string, useless1, xtext); set x_device_id = 0; SELECT ewise_device.device_id FROM ewise_device WHERE ewise_device.device_string = x_device_string INTO x_device_id; IF (x_device_id = 0) THEN INSERT INTO ewise_device VALUES (default, NULL, x_device_string, NULL, NULL, NULL, NULL); SELECT LAST_INSERT_ID() INTO x_device_id; END IF; WHILE length(xtext) > 0 DO CALL get_node_content(xtext, 'slice', slice_text, useless1, xtext); IF length(slice_text) >0 THEN CALL get_node_content(slice_text, 'time', time_text, useless1, slice_text); INSERT INTO ewise_slice VALUES (default, x_device_id, time_text); SELECT LAST_INSERT_ID() INTO new_slice_id; WHILE length(slice_text) > 0 DO set x_msmnt_type_id = 0; CALL get_first_node_name(slice_text, msmnt_tag); CALL get_node_content(slice_text, msmnt_tag, value_text, useless1, slice_text); IF length(msmnt_tag) >0 THEN SELECT ewise_msmnt_type.msmnt_type_id FROM ewise_msmnt_type WHERE ewise_msmnt_type.msmnt_type_code=LEFT(msmnt_tag,8) INTO x_msmnt_type_id; IF (x_msmnt_type_id = 0) THEN INSERT INTO ewise_msmnt_type VALUES (default, LEFT(msmnt_tag, 8), NULL, NULL); SELECT LAST_INSERT_ID() INTO x_msmnt_type_id; END IF; INSERT INTO ewise_slice_msmnt VALUES (default, new_slice_id, x_msmnt_type_id, value_text); END IF; END WHILE; END IF; END WHILE; #Delete the data row DELETE FROM ewise_raw_data_in WHERE ewise_raw_data_in.raw_id=x_id; END LOOP main_loop; END $$
Code:
###################
delimiter ;
DROP PROCEDURE IF EXISTS `get_node_content`;
DELIMITER $$
CREATE PROCEDURE `get_node_content`(IN in_xml text, IN in_node_tag VARCHAR(30), OUT node_contents text, OUT prev_string text, OUT post_string text )
BEGIN
DECLARE node_start int;
DECLARE node_content_start int;
DECLARE node_end int;
DECLARE node_tag_start varchar(30);
DECLARE node_tag_end varchar(30);
set node_tag_start = concat('<',in_node_tag,'>');
set node_tag_end = concat('</',in_node_tag,'>');
set node_start = locate(node_tag_start, in_xml) ;
set node_end = locate(node_tag_end, in_xml);
set node_content_start = node_start + length(node_tag_start);
set node_contents = if(node_start=0,'', if(node_end <= node_content_start, '', substring(in_xml, node_content_start, node_end - node_content_start)));
set prev_string = if(node_contents = '','',substring(in_xml, 1, node_start-1));
set post_string = if(node_contents = '','',substring(in_xml, node_end + length(node_tag_end), length(in_xml)));
END
$$
###################
Code:
###################
delimiter ;
DROP PROCEDURE IF EXISTS `get_first_node_name`;
DELIMITER $$
CREATE PROCEDURE `get_first_node_name`(IN in_xml TEXT, OUT out_node_name VARCHAR(30))
BEGIN
DECLARE node_start int;
DECLARE node_end int;
set node_start = locate('<', in_xml);
set node_end = locate('>', in_xml);
set out_node_name = if(node_start=0,'', if(node_end <=node_start, '', substring(in_xml, node_start + 1, node_end - node_start - 1)));
END
$$
###################
Comment