Вложенные курсоры с циклом while - PullRequest
0 голосов
/ 11 мая 2018

Я хочу написать вложенный курсор с циклом while, чтобы получить результаты из таблицы table_B, когда имя столбца из таблицы Table_A совпадает с col1 таблицы Table_B.
если выбрать col1, col2, col3 из Table_B, где col1 = tblA_col1 равно нулю, то перейти к следующей строке и вернуть col1.
И мне нужно сохранить результаты столбца в переменных.

  Delimiter $$
  DROP PROCEDURE IF EXISTS sp_test;
  CREATE PROCEDURE sp_test() 
  begin 
    DECLARE done, done1 int DEFAULT 0; 
    DECLARE tblA_col1 varchar(255); 
    DECLARE tblB_col1 varchar(255);
    DECLARE tblB_col2 varchar(255);
    DECLARE tblB_col3 varchar(255);
      DECLARE curA CURSOR FOR   SELECT column_name   FROM   Table_A; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
    open curA; 

      WHILE (done = 0) do
      FETCH next   FROM  curA   INTO  tblA_col1;
     DECLARE curB CURSOR FOR   select col1, col2, col3 from Table_B where col1 = tblA_col1;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1 = 1; 
      open curB;
    Fetch next from curB into tblB_col1,tblB_col2,tblB_col3;
    select tblB_col1;
   select tblB_col2;
    select tblB_col3;
    close curB;
  if tblB_col1 is null then 
  tblB_col1 = tblB_col1;
  end if;

    end while;
    close curA;
    end;
    $$
  --  call sp_test

Я новичок в курсорах, и у меня возникают проблемы при использовании вложенного curB. Можете ли вы помочь?

1 Ответ

0 голосов
/ 11 мая 2018

Единственные очевидные синтаксические проблемы, которые я замечаю, это DECLARES в цикле.

DECLARE разрешено только внутри составного оператора BEGIN ... END и должно быть в его начале, до любых других операторов.

https://dev.mysql.com/doc/refman/8.0/en/declare.html

Проблема в том, что вы точно не указали наличие , может проясниться, если вы положите BEGIN после первой выборки и END после закрытия curB.Вам также может понадобиться сбрасывать done1 каждую внешнюю итерацию (я не припоминаю, если бы она удерживала значение из предыдущих итераций.)

...