MYSQL-设置子句不更新变量值

时间:2018-09-02 13:18:54

标签: mysql

请原谅我有限的MySQL知识/技能。我有一个名为flexcube_data

的表

下表如下

+---------+--------+--------------+-------------+-----------------+-----------------+------------------+
| item_no | CIF_NO | CIF_NAME     | PRIMARY_KEY | Collateral_Type | Collateral_Code | Stamped_to_Cover |
+---------+--------+--------------+-------------+-----------------+-----------------+------------------+
|       1 | 801125 | John Doe     | YES         | 06              | J1              |                0 |
|       2 | 801125 | John Doe     | YES         | 08              | J5              |                0 |
|       3 | 801125 | John Doe     | YES         | 26              | J25             |                0 |
|       4 | 801125 | John Doe     | YES         | 26              | J25             |                0 |
|       5 | 801125 | John Doe     | YES         | 89              | J53             |                0 |
|       6 | 801125 | John Doe     | YES         | 98              | J57             |                0 |
|       7 | 801125 | John Doe     | YES         | 58              | J88             |                0 |
|       8 | 800102 | John Doe     |             | 19              | J03             |                0 |
|       9 | 800102 | Mary Jane    | YES         | 22              | J1              |                0 |
|      10 | 800102 | Mary Jane    | YES         | 90              | J5              |                0 |
|      11 | 800102 | Mary Jane    | YES         | 01              | J25             |                0 |
|      12 | 800102 | Mary Jane    | YES         | 77              | J25             |                0 |
|      13 | 800102 | Mary Jane    | YES         | 42              | J53             |                0 |
|      14 | 800102 | Mary Jane    | YES         | 25              | J57             |                0 |
|      15 | 800102 | Mary Jane    | YES         | 36              | J88             |                0 |
|      16 | 800102 | Mary Jane    |             | 32              | J03             |                0 |
|      17 | 563021 | Jack Daniels | YES         | 58              | ab22            |                0 |
|      18 | 563021 | Jack Daniels | YES         | 51              | ca55            |                0 |
+---------+--------+--------------+-------------+-----------------+-----------------+------------------+

我的目标是:

  • 删除 flexcube_table
  • 中重复的 CIF_NO 列值
  • 我更喜欢通过创建新表名 tmp_table (临时表)并仅插入重复值之一来实现此目的

我对tmp_table的预期结果应该是

+---------+--------+--------------+-------------+-----------------+-----------------+------------------+
| item_no | CIF_NO | CIF_NAME     | PRIMARY_KEY | Collateral_Type | Collateral_Code | Stamped_to_Cover |
+---------+--------+--------------+-------------+-----------------+-----------------+------------------+
|       1 | 801125 | John Doe     | YES         | 06              | J1              |                0 |
|       9 | 800102 | Mary Jane    |             | 19              | J03             |                0 |
|      17 | 563021 | Jack Daniels | YES         | 58              | ab22            |                0 |
+---------+--------+--------------+-------------+-----------------+-----------------+------------------+

我的示例代码如下:

DELIMITER //
DROP PROCEDURE if exists FLEX //
use members_db;
Drop table if exists tmp_table;
CREATE TABLE tmp_table (
    item_no INT AUTO_INCREMENT,
    CIF_NO VARCHAR(255),
    CIF_NAME VARCHAR(255),
    Collateral_Type_1 VARCHAR(255),
    Collateral_Code_1 VARCHAR(255),
    Stamped_to_Cover_1 BIGINT,
    Collateral_Type_2 VARCHAR(255),
    Collateral_Code_2 VARCHAR(255),
    Stamped_to_Cover_2 BIGINT,
    Collateral_Type_3 VARCHAR(255),
    Collateral_Code_3 VARCHAR(255),
    Stamped_to_Cover_3 BIGINT,
    Collateral_Type_4 VARCHAR(255),
    Collateral_Code_4 VARCHAR(255),
    Stamped_to_Cover_4 BIGINT,
    Collateral_Type_5 VARCHAR(255),
    Collateral_Code_5 VARCHAR(255),
    Stamped_to_Cover_5 BIGINT,
    PRIMARY KEY (item_no)
);
Drop table if exists flexcube_table;
CREATE TABLE flexcube_table (
    item_no INT AUTO_INCREMENT,
    CIF_NO VARCHAR(255),
    CIF_NAME VARCHAR(255),
    PRIMARY_KEY VARCHAR(255),
    Collateral_Type VARCHAR(255),
    Collateral_Code VARCHAR(255),
    Stamped_to_Cover BIGINT,
    PRIMARY KEY (item_no)
);
/* I INSERTED A COUPLE OF VALUES IN THE FLEXCUBE TABLE AS A SAMPLE */ 
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("801125","YES","John Doe","06","J1","$20,000");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("801125","YES","John Doe","08","J5","$22,000");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("801125","YES","John Doe","26","J25","$5,100");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("801125","YES","John Doe","26","J25","$5,100");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("801125","YES","John Doe","89","J53","$111,000");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("801125","YES","John Doe","98","J57","$118,000");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("801125","YES","John Doe","58","J88","$103,000");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("800102","","John Doe","19","J03","$114,000");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("800102","YES","Mary Jane","22","J1","$20,125");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("800102","YES","Mary Jane","90","J5","$88,135");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("800102","YES","Mary Jane","01","J25","$3,401");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("800102","YES","Mary Jane","77","J25","$8,301");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("800102","YES","Mary Jane","42","J53","$25,501");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("800102","YES","Mary Jane","25","J57","$82,101");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("800102","YES","Mary Jane","36","J88","$156,222");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("800102","","Mary Jane","32","J03","$187,256");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("563021","YES","Jack Daniels","58","ab22","$10,110");
insert into flexcube_table (CIF_NO,PRIMARY_KEY,CIF_NAME,Collateral_Type,Collateral_Code,Stamped_to_Cover) values("563021","YES","Jack Daniels","51","ca55","$26,725");
CREATE PROCEDURE FLEX()
BEGIN
DECLARE total_flex_rows INT DEFAULT 0; 
DECLARE tmp_table_rows INT DEFAULT 0;
DECLARE counter INT DEFAULT 0;
DECLARE tmp_table_counter INT DEFAULT 0;
DECLARE FLEXCUBE_CIF_NO VARCHAR(255);
DECLARE TEMPORARY_CIF_NO VARCHAR(255);
DECLARE MATCH_FOUND INT DEFAULT 0;
DECLARE COLLATERAL_EXIST INT DEFAULT 0;
/* GET TOTAL ROWS IN ORIGINAL TABLE TO LOOP THROUGH  AND STORE IT INTO VARIABLE*/
SELECT COUNT(*) FROM flexcube_table INTO total_flex_rows;
SET counter=0;
/* GET TOTAL ROWS IN TMP TABLE AND STORE IT IN VARIABLE */
  SET tmp_table_rows=(SELECT COUNT(*) FROM tmp_table);
  IF tmp_table_rows=0 THEN
      INSERT INTO tmp_table (CIF_NO) VALUES("1");
  END IF;
/* LOOP THROUGH EVERY ROW IN ORIGINAL TABLE TO DETERMINE IF CIF_NO VALUE EXIST IN TEMPORARY TABLE */
WHILE counter<=total_flex_rows DO
/* SET MATCH FOUND TO 0 - NO MATCH IS FOUND AS YET */
  SET MATCH_FOUND=0; 
  SET FLEXCUBE_CIF_NO=""; 
  SET FLEXCUBE_CIF_NO=(SELECT CIF_NO FROM flexcube_table WHERE PRIMARY_KEY="YES" LIMIT counter,1);
/* FOR EACH CIF_NO VALUE IN ORIGINAL TABLE, LOOP THROUGH EVERY ROW IN TEMPORARY TABLE TO CHECK IF VALUE ALREADY EXISTS */
  SELECT COUNT(*) FROM tmp_table INTO tmp_table_rows;
    sub_loop:WHILE tmp_table_counter<=tmp_table_rows DO
        /* THE PROBLEM IS TEMPORARY_CIF_NO IS NOT NEW VALUES */ 
    SET TEMPORARY_CIF_NO=(SELECT CIF_NO FROM tmp_table LIMIT tmp_table_counter,1); 
    IF FLEXCUBE_CIF_NO = TEMPORARY_CIF_NO THEN
        /* WE CIF_NO IN ORIGINAL TABLE IS EQUAL TO CIF_NO VALUE IN TEMPORARY TABLE MATCH_FOUND=1 (TRUE) */
      SET MATCH_FOUND=1;
          SELECT "I FOUND A MATCH!!!!!!!!!!!!";
          SET COLLATERAL_EXIST=0;
        /* LEAVE WHILE LOOP SINCE THERE IS NO NEED TO CONTINUE FINDING CIFS */
      LEAVE sub_loop;
    END IF;
  /* CONTINUE TEMPORARY TABLE ROW COUNTER INCREMENTING COUNTER */
    SET tmp_table_counter=tmp_table_counter+1;
    END WHILE sub_loop;
/* IF NOT MATCH IS FOUND THEN ADD NEW CIF_VALUE TO TEMPORARY TABLE */
  IF MATCH_FOUND=0 THEN
    /*IF NO MATCH IS FOUND INSERT THE NEW CIF_NO VALUE IN THE TEMPORARY TABLE */
    INSERT INTO tmp_table (CIF_NO) VALUES((SELECT (CIF_NO) FROM flexcube_table LIMIT counter,1));
  END IF;
  SET counter = counter + 1;
  SET MATCH_FOUND=0;
END WHILE;
End//
DELIMITER //
CALL FLEX();
select * from tmp_table; 

问题

循环遍历Temporary表中的行时,我将每行的CIF_NO值存储在名为TEMPORARY_CIF_NO的变量中。 尽管我将SELECT TEMPORARY_CIF_NO; VALUE设置为临时表中当前行的CIF_NO值,但行NULL返回TEMPORARY_CIF_NO

问题

为什么变量TEMPORARY_CIF_NO返回NULL? 我更喜欢基于现有代码的解决方案,因为这些代码只是原始代码的示例。

1 个答案:

答案 0 :(得分:0)

第一期

Set子句按预期工作。 tmp_table_counter变量在每个完整循环后都会从最后一个计数开始滴答。

也就是说,在遍历tmp_table中的所有行之后,我没有将tmp_table_counter变量重置为0。

更正后的代码为:

 SET tmp_table_counter=0; /* I NEEDED THIS LINETO RESET THE COUNTER BEFORE LOOPING AGAIN
  SET MATCH_FOUND=0;
    sub_loop:WHILE tmp_table_counter<=tmp_table_rows DO
    ..................
    LEAVE sub_loop;

第二期

下面的行

`SET FLEXCUBE_CIF_NO=(SELECT CIF_NO FROM flexcube_table WHERE PRIMARY_KEY="YES" LIMIT` counter,1);

为什么我要遍历原始(flexcube_data)表中的每一行,却没有条件地不检索CIF_NO

逻辑解决方案是创建一个主键变量并存储当前行的主键 然后更改

IF FLEXCUBE_CIF_NO = TEMPORARY_CIF_NO THEN

TO

IF FLEXCUBE_CIF_NO = TEMPORARY_CIF_NO AND PRIMARY_KEY="YES" THEN