Skip to content
Advertisement

Operand Should Contain 1 Column(s), Trying to generate volunteer data

I can’t seem to troubleshoot my problem.

My stored procedure:

CREATE DEFINER=`myschoolusername`@`%` PROCEDURE `generate_volunteers`(in nfolks int)
BEGIN
  set @i=0;
  while @i < nfolks do
     insert into Volunteer(firstname, lastname, dateofbirth) 
     values (((floor(1+(rand()*(4-1))), "Fred", "Wang", "Fatimah", "Marcella")),
     ((floor(1+(rand()*(3-1))), "Kaser", "Fang", "Kumar")),
     DATE_ADD('1965-01-01', INTERVAL rand()*200000 DAY));
  set @i = @i+1;
  end while;
END

Additionally, here is my volunteer table in my MYSQL script:

drop table if exists Volunteer;
create Table Volunteer(
member_num int not null auto_increment primary key,
firstname varchar(20) not null,
lastname varchar(20) not null,
dateofbirth date not null
);

I am trying to insert 500 lines into this table, however error 1305 is coming up.

Any help is heavily appreciated, I am quite unsure of where to go from this point.

Advertisement

Answer

This logic doesn’t do anything:

(floor(1+(rand()*(4-1))), "Fred", "Wang", "Fatimah", "Marcella"))

Although not the most efficient, this should be fine for 500 rows:

 insert into Volunteer(firstname, lastname, dateofbirth) 
     select f.firstname, l.lastname,
            DATE_ADD('1965-01-01', INTERVAL rand()*200000 DAY)
     from (select 'Fred' as firstname union all
           select 'Wang' union all
           select 'Fatimah' union all
           select 'Marcella'
          ) f cross join
          (select 'Kaser' as lastname union all
           select 'Fang' union all
           select 'Kumar'
          ) l
     order by rand()
     limit 1;

I think you are actually trying to write:

 insert into Volunteer(firstname, lastname, dateofbirth) 
     select elt(floor(rand() * 4) + 1,
                'Fred', 'Wang', 'Fatimah', 'Marcella'
               ) as firstname,
            elt(floor(rand() * 3) + 1,
                'Kaser', 'Fang', 'Kumar'
               ) as lastname,
            DATE_ADD('1965-01-01', INTERVAL rand()*200000 DAY);
User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement