процедура создания в MySQL верстаке - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь создать процедуру в MySQL Workbench.но я не могу исправить ошибки в процедуре.ниже приведены мои таблицы и данные

создать табличный продукт (первичный ключ pid int, productname varchar (45)) вставить в значения продукта (10, 'a') вставить в значения продукта (12, 'a') вставитьв значения продукта (13, 'a')

создать таблицу productdata (первичный ключ prid int, prname varchar (45)) вставить в значения данных продукта (1, 'a') вставить в значения данных продукта (2, 'b ') вставить в значения данных продукта (3,' c ')

создать таблицу pr_status (первичный ключ pesid int, ссылки на pid int product (pid), stage varchar (20), statusdate varchar (45))

вставить в значения pr_status (1,10, '4', '2018-05-23') вставить в значения pr_status (4,10, '4', '2018-05-23') вставить в pr_statusзначения (2,12, '5', '2018-05-24') вставляются в значения pr_status (3,13, '4', '2018-05-25')

создание таблицы работ (видпервичный ключ int, prid int ссылается на productdata (prid), pid int ссылается на product (pid))

вставить в рабочие значения (1,2,10) вставить в рабочие значения (2,2,12) вставить врабочие значения (3,1,13)

отборct * из продукта select * из productdata select * from pr_status select * from work

Я пытаюсь получить данные из этой таблицы, используя процедуру.

  DROP PROCEDURE IF EXISTS test_mysql_while_loop$$
 DROP TEMPORARY  TABLE IF EXISTS esubmit$$
 CREATE PROCEDURE test_mysql_while_loop()
 BEGIN

    DECLARE  v_startdate VARCHAR(45), v_enddate VARCHAR(45)
SET  v_startdate='2018-05-22'
set v_enddate='2018-05-28'
declare v_sql longtext
create temporary table #esubmit(id int auto_increment,Name varchar(100));
SET v_sql = 'ALTER TABLE #esubmit ADD ';
declare v_status int
declare v_count int
set v_status=0
set v_count=1
while(v_status!=1)
do
/* print cast(TIMESTAMPADD(day, v_count, cast(v_startdate as datetime(3))) as date) */
/* print cast(v_enddate as date) */
if(cast(TIMESTAMPADD(day, v_count, cast(v_startdate as datetime(3))) as date)=cast(v_enddate as date))
then
/* print v_sql */
 set v_status=1;
 set v_sql+=Concat('[',cast(TIMESTAMPADD(day,v_count, cast(v_startdate as datetime(3))) as varchar(45)),'] varchar(45)') 
else
set v_sql+=Concat('[',cast(TIMESTAMPADD(day,v_count, cast(v_startdate as datetime(3))) as varchar(45)),'] varchar(45),') 
end if;
set v_count=v_count+1
end while
set @stmt_str = v_sql;
prepare stmt from @stmt_str;
execute stmt;
deallocate prepare stmt;
declare v_cid int
declare v_eid int
declare v_setdate varchar(45)
 c
fetch next from c into v_cid,v_eid
while(NOT_FOUND=0)
do
declare v_setcnt int
declare v_getdate varchar(45)
declare v_getname varchar(45)

open c1
fetch next from c1 into v_setdate
/* print v_setdate */
declare v_s int
set v_s=0
declare v_qry longtext
select prname into v_getname from productdata where prid=v_cid
/* print v_getname */
set v_qry=Concat('insert into #esubmit values(''',v_getname,''',')
/* print v_qry */
while(NOT_FOUND=0)
do

/* print CONVERT(CAST(v_setdate AS CHAR(24)), DATETIME) */
    select count(pid) into v_setcnt from pr_status where pid=(select pid from work where pid=v_eid and prid=v_cid) and
    cast(statusdate as date)=cast(v_setdate as date) and stage BETWEEN '4' AND '5'  group by pid,statusdate 
/* print v_setcnt */
    select statusdate into v_getdate from pr_status where pid=(select pid from work where pid=v_eid and prid=v_cid) and
    cast(statusdate as date) =cast(v_setdate as date) and stage BETWEEN '4' AND '5'  group by pid,statusdate 

    set v_qry=v_qry+cast(v_setcnt as varchar(10)),','
    /* print v_qry */
    fetch next from c1 into v_setdate
    set v_setcnt=0

end while
set v_qry=concat(substring(v_qry,0,char_length(rtrim(v_qry))),')')
set @stmt_str = v_qry;
prepare stmt from @stmt_str;
execute stmt;
deallocate prepare stmt;
set v_qry=''

deallocate c1   
fetch next from c into v_cid,v_eid
end while

END

, но получаю ошибку ниже ОшибкаКод: 1064. У вас ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который нужно использовать рядом с 'begin if (cast (TIMESTAMPADD (DAY, v_count, cast (v_startdate as datetime (3)))) как da' в строке 15 0,000 сек

...