循环游标以匹配字段

时间:2015-07-10 11:44:46

标签: mysql sql loops cursor

我需要比较一个表中的两行来更新lineB中填充的lineB中的字段。我的问题是,我需要比较的两个字段只是部分匹配。所以我不能只通过LIKE比较执行更新语句。

我需要比较的字段包含生成的文件名。 这个名字在表中一次存在两次,没有单词'Bestand-'一次附加到开头一次。 为了使用lineA中的信息更新lineB,我需要匹配这两个名称。

该表的示意图如下所示。

 Id    DateinameMarbilder        PfadNeu       
  1    Bestand-one               night      
  2    Bestand-two               evening      
  3    Bestand-three             morning        
  4    Bestand-four              noon
  5    one                       NULL
  6    two                       NULL
  7    three                     NULL
  8    four                      NULL

这些只是我需要阅读的两个字段,表格要大得多。

我试图通过使用游标和循环来实现这一点。 我得到了第四行的语法错误,我似乎无法解决。这似乎是声明值的问题。 除此之外,我不太确定如何使第二个游标循环遍历所有行以找到匹配的字段然后执行更新。不幸的是,这个表没有组织,所以我不能只比较下一行与之前的那一行。

这是我试过的查询:

CREATE PROCEDURE curing()

BEGIN
DECLARE tester INT DEFAULT FALSE;
DECLARE name CHAR(50);
DECLARE tempColName CHAR(50);
DECLARE tempCol CHAR(30);

DECLARE schreiber_cursor1 CURSOR FOR 
SELECT DateinameMarbilder FROM marbilder;
DECLARE schreiber_cursor2 CURSOR FOR 
SELECT DateinameMarbilder FROM marbilder;

DECLARE update_cursor CURSOR FOR 
SELECT PfadNeu FROM marbilder;


DECLARE CONTINUE HANDLER 
FOR NOT FOUND SET tester = TRUE;


OPEN schreiber_cursor1; 
OPEN schreiber_cursor2;
OPEN update_cursor;

get_name: LOOP
FETCH schreiber_cursor1 INTO name;
FETCH schreiber_cursor2 INTO TempColName;
FETCH update_cursor INTO tempcol; 
IF tester THEN 
    LEAVE get_name;

IF name LIKE %TempColName THEN 
UPDATE marbilder SET 'PfadNeu'=update_cursor ;  

ELSE FETCH [[NEXT] FROM] schreiber_cursor2 INTO TempColName;

CLOSE schreiber_cursor;
CLOSE update_cursor;

END; 

1 个答案:

答案 0 :(得分:0)

如果我理解正确你所需要的只是这个。但请确保在执行此

之前获取此表的副本
Update marbilder as t1 inner join marbilder as t2 on 
t1.DateinameMarbilder  like  concat(',%',t2.DateinameMarbilder)       
set
t2.PfadNeu=t1.PfadNeu
where t1.DateinameMarbilder like '%-%' and t2.PfadNeu is null