0

我有一个令人讨厌的、令人讨厌的数据布局,我不得不使用它。我终于得到了一个使用 C# 的工作查询和一个 for 循环,一遍又一遍地执行相同的查询,但调整了哪些字段被调用,但现在我想知道是否可以使用 while 循环来做到这一点。我收到一个错误,我不确定是因为我使用 Faircom / C-tree 作为数据库,还是我的查询有问题。我通常是 Mysql 用户。

该表有 20 个我关心并希望提取到 csv 列表中的字段。它们是 codetype1-codetype20,我希望它像value1, value2, value3...现在这样我一次将它们全部取回。麻烦的是 codetype1 依赖于另一个字段来确定我去哪里查找该代码的信息,这就是 case 语句的原因。

DROP PROCEDURE IF EXISTS proc_loop_test;
CREATE PROCEDURE proc_loop_test()
    SET @index = 1;
    WHILE(@index  < 21) DO

        SELECT Replace(Concat(To_char(apptid), To_char(.@index) ), ' ', '') AS reference_id,
                   apptid                                                              AS a_reference_id,
                   CASE
                     WHEN c.ee > 0 THEN d.amt
                     ELSE insfee.amt
                   END                                                    AS amount,
                   CASE
                     WHEN c.ee > 0 THEN Rtrim(e.moneyname)
                     ELSE insname.namefeecatid
                   END                                                    AS moneyschedule_name,
                   CASE codetype@index
                              WHEN 1 THEN rtrim(a.descript)
                              ELSE rtrim(b.descript0)
                   END                                                                  AS description,
                   CASE codetype@index
                              WHEN 1 THEN rtrim(a.abbrevdescript)
                              ELSE rtrim(b.abbrev0)
                   END                                                                  AS abbreviated_description,
                   CASE codetype@index
                              WHEN 1 THEN rtrim(a.thiscode)
                              ELSE rtrim(b.thiscode0)
                   END AS code
        FROM       meetings
        LEFT JOIN
                   (
                        SELECT     admin.table2.procid,
                                    admin.table2.this_code_id,
                                    admin.v_table1.descript,
                                    admin.v_table1.abbrevdescript,
                                    admin.v_table1.thiscode
                        FROM       admin.table2
                        INNER JOIN admin.v_table1
                        ON         admin.table2.this_code_id = admin.v_table1.this_code_id) AS a
        ON         meetings.codeid@index = a.procid
        LEFT JOIN
                   (
                          SELECT admin.v_table1.descript       AS descript0,
                                 admin.v_table1.abbrevdescript AS abbrev0,
                                 admin.v_table1.thiscode        AS thiscode0,
                                 admin.v_table1.this_code_id
                          FROM   admin.v_table1) AS b
        ON         meetings.codeid@index = b.this_code_id
        LEFT JOIN
                   (
                          SELECT patid AS id,
                                 ee
                          FROM   admin.customer) AS c
        ON         meetings.patid = c.id
        LEFT JOIN
                   (
                          SELECT this_code_id AS redid,
                                 eecategoryid,
                                 amt
                          FROM   admin.eeule) AS d
        ON         c.ee = d.eecategoryid
        AND        d.redid = b.this_code_id
        LEFT JOIN
                   (
                          SELECT eecategoryid AS namefeecatid,
                                 moneyname
                          FROM   admin.eeulenames) AS e
        ON         d.eecategoryid = e.namefeecatid
        LEFT JOIN (SELECT pi.customer_id,
                            pi.primarykk_id AS picid,
                            pi.primarykk_name,
                            pi.first_name,
                            pi.last_name,
                            i.groupname,
                            i.ee
                    FROM   admin.v_pir AS pi
                            LEFT JOIN admin.money AS i
                                ON pi.primarykk_id = i.insid) AS
                    ins
                ON ins.customer_id = c.id
        LEFT JOIN (SELECT this_code_id AS redid,
                            eecategoryid,
                            amt
                    FROM   admin.eeule) AS insfee
                ON ins.ee = insfee.eecategoryid
                    AND insfee.redid = b.this_code_id
       LEFT JOIN (SELECT eecategoryid AS namefeecatid,
                         moneyname
                  FROM   admin.eeulenames) AS insname
              ON insfee.eecategoryid = insname.namefeecatid
        WHERE      codeid@index >= 1
    END WHILE;
END;

我从来没有使用过while循环,虽然我有点理解我应该选择它来进入某些东西,我是否需要创建一个临时表,或者它可以全部存储在内存中直到循环结束并返回.

值得一提的是,当您将 SELECT 替换为@index连接格式时,整个 SELECT 查询都可以在 C# 中工作" . index . "

4

1 回答 1

0

根据您提供的信息,强烈建议您为此联系您的供应商。但是,您正在尝试使用 mySQL 专有语法创建存储过程。每个数据库供应商都支持存储过程。FairCom 的 c-treeACE SQL 实际上使用 Java 支持跨平台,使用 .NET 支持 Windows。

https://docs.faircom.com/doc/jspt/#cover.htm

存储过程开发需要对高度依赖于应用程序的数据库布局有深入的了解。在这种情况下,可能会涉及许多遗留应用程序依赖项。同样,您最好的信息来源将是您的应用程序供应商。

于 2018-03-14T18:45:07.010 回答