MariaDB: Мифическая ошибка синтаксиса

212
23 мая 2018, 15:10

MariaDB 10.1.23, RDS.

Процедура:

delimiter ;;
drop procedure if exists p_GetRTS28Report_Oleg;;
create procedure p_GetRTS28Report_Oleg(IN lp_ClientID        int, IN 
lp_StartDate date, IN lp_EndDate date,
                              IN lp_AssetClass      varchar(500), IN 
lp_ReportType varchar(50),
                              IN lp_TransactionType varchar(50), IN 
lp_InvestorType varchar(50),
                              IN lp_PrivateFlag     bit, IN 
lp_ReportingEntity varchar(500))
BEGIN
DECLARE VAR_ExecQty, VAR_OrderCount decimal(18,6);
DROP TEMPORARY TABLE IF EXISTS temp;
CREATE TEMPORARY TABLE temp (
  RunID    int,
  ClientOrderID       varchar(50),
  esmaclassid         int,
  InvestorTypeID      char(1),
  reporttype          varchar(10),
  Venue    varchar(255),
  MarketAccess char(1),
  Directed          char(1),
  ExecutedQuantity decimal(18,6),
  NumberOfExecs  decimal(18,6),
  OrderCount decimal(18,6),
  PassiveExecutions decimal(18,6),
  AggressiveExecutions decimal(18,6),
  PassiveFactor decimal(18,6),
  AggressiveFactor decimal(18,6),
  OtherFactor decimal(18,6)
) ENGINE = MEMORY;
 INSERT INTO temp(RunID, ClientOrderID, esmaclassid, InvestorTypeID, reporttype, Venue, MarketAccess, Directed,
                  ExecutedQuantity, NumberOfExecs, OrderCount, PassiveExecutions,AggressiveExecutions, PassiveFactor,
                  AggressiveFactor,OtherFactor)
   select r.runid,
     rts.orderid,
     s.esmaclassid,
     rts.InvestorTypeID,
     rts.reporttype,
     IFNULL(CONCAT(m.mic, ' - ' , m.description),rts.venuedescription) as Venue,
     rts.strategyintentid,
     rts.isdirected,
     round(SUM(rts.volumeexecuted * (rate1.ExchangeRate / rate2.ExchangeRate)), 6) as ExecutedQuantity,
     SUM(numberofexecutions) as NumberOfExecs,
     COUNT(DISTINCT r.RunID,orderid) AS OrderCnt,
     SUM(passiveexecutions) as PassiveExecutions,
     SUM(aggressiveexecutions) as AggressiveExecutions,
     0,
     0,
     0
   from t_rts28data rts
     join t_run r on r.RunID = rts.RunID
     join t_security s
       on rts.RunID = s.RunID and rts.secid = s.SecurityID
     left outer join t_mic m
       on rts.venuedescription = m.MIC
     LEFT JOIN securitymasterdb.t_currencyconversionrates rate1
       ON rate1.CCY = s.CurrencyCode AND rate1.Date = r.TradeDate
     LEFT JOIN securitymasterdb.t_currencyconversionrates rate2
       ON rate2.CCY = 'EUR' AND rate2.Date = r.TradeDate
   where r.tradedate between lp_StartDate and lp_EndDate
         and r.clientid = lp_ClientID
         and r.isactive = 1
         and r.ProductID = 3
         and s.esmaclassid = lp_AssetClass
         and rts.reporttype = lp_ReportType
         and rts.transactiontypeid = lp_TransactionType
         and IFNULL(rts.investortypeid,'~~~') = IFNULL(lp_InvestorType,'~~~')
         and rts.isexception IS NULL
         and IFNULL(UPPER(rts.reportingentity), '~~~~~~~~~~~~~')=IFNULL(UPPER(lp_ReportingEntity), '~~~~~~~~~~~~~')
   GROUP BY r.runid,rts.orderid,s.esmaclassid, rts.InvestorTypeID, rts.reporttype, m.mic, m.description,
     rts.venuedescription,rts.strategyintentid, rts.isdirected;
  SELECT SUM(ExecutedQuantity), SUM(OrderCount) INTO VAR_ExecQty, VAR_OrderCount FROM temp;
IF lp_ReportType = 'RTS28' THEN
 UPDATE temp
  SET PassiveFactor = IF(Directed = 'D', 0, ifnull(PassiveExecutions / NumberOfExecs *  OrderCount, 0)),
      AggressiveFactor = IF(Directed = 'D', 0, IFNULL(AggressiveExecutions / NumberOfExecs *  OrderCount,0));
ELSE
  UPDATE temp
  SET   PassiveFactor = IFNULL(CASE
                                WHEN Directed = 'D' THEN 0
                                WHEN MarketAccess = 'P' AND NumberOfExecs = 0 THEN OrderCount
                                ELSE (PassiveExecutions / NumberOfExecs) * OrderCount
                              END,0),
        AggressiveFactor = IFNULL(CASE
                                    WHEN Directed = 'D' THEN 0
                                    WHEN MarketAccess = 'A' AND NumberOfExecs = 0 THEN OrderCount
                                    ELSE (AggressiveExecutions / NumberOfExecs) * OrderCount
                                  END,0);
END IF;
IF (lp_PrivateFlag = 0) THEN -- public
  select Venue,
    CAST(IFNULL(ExecutedQuantity/NULLIF(VAR_ExecQty,0) * 100,0) as DECIMAL(18, 6)) as VolumePct,
    CAST(IFNULL(OrderCnt / NULLIF(VAR_OrderCount,0) * 100,0) as DECIMAL(18,6)) as OrderPct,
    CAST(IFNULL(PassiveCnt/NULLIF(OrderCnt,0) * 100,0) as DECIMAL(18, 6)) as PassivePct,
    CAST(IFNULL(AggressiveCnt/NULLIF(OrderCnt,0) * 100,0) as DECIMAL(18,6)) as AggressivePct,
    CAST(IFNULL(DirectCnt / NULLIF(OrderCnt,0) * 100,0) as DECIMAL(18, 6)) as DirectedPct,
    PassiveCnt,
    AggressiveCnt,
    DirectCnt,
    OrderCnt,
    VolumeExecuted,
    NumberOfExecs,
    lp_ReportType AS ReportType,
    lp_TransactionType AS TransactionType,
    lp_InvestorType AS InvestorType,
    PassiveCnt as pf,
    AggressiveCnt as af
  from (
    SELECT
      Venue,
      SUM(ExecutedQuantity) as ExecutedQuantity,
      SUM(PassiveFactor)    as PassiveCnt,
      SUM(AggressiveFactor) as AggressiveCnt,
      SUM(CASE WHEN Directed = 'D'
        THEN OrderCount
          ELSE 0 END)       as DirectCnt,
      SUM(OrderCount)       as OrderCnt,
      SUM(ExecutedQuantity) as VolumeExecuted,
      SUM(NumberOfExecs)    as NumberOfExecs
    FROM temp t1
    GROUP BY Venue
  ) t1
  ORDER BY VolumeExecuted DESC, Venue
  LIMIT 5;
ELSE  -- private
  select Venue,
    CAST(IFNULL(ExecutedQuantity/NULLIF(VAR_ExecQty,0) * 100,0) as DECIMAL(18, 6)) as VolumePct,
    CAST(IFNULL(OrderCnt / NULLIF(VAR_OrderCount,0) * 100,0) as DECIMAL(18,6)) as OrderPct,
    CAST(IFNULL(PassiveCnt/NULLIF(OrderCnt,0) * 100,0) as DECIMAL(18, 6)) as PassivePct,
    CAST(IFNULL(AggressiveCnt/NULLIF(OrderCnt,0) * 100,0) as DECIMAL(18,6)) as AggressivePct,
    CAST(IFNULL(DirectCnt / NULLIF(OrderCnt,0) * 100,0) as DECIMAL(18, 6)) as DirectedPct,
    PassiveCnt,
    AggressiveCnt,
    DirectCnt,
    OrderCnt,
    VolumeExecuted,
    NumberOfExecs,
    lp_ReportType AS ReportType,
    lp_TransactionType AS TransactionType,
    lp_InvestorType AS InvestorType,
    PassiveCnt as pf,
    AggressiveCnt as af
  from (
    SELECT
      Venue,
      SUM(ExecutedQuantity) as ExecutedQuantity,
      SUM(PassiveFactor)    as PassiveCnt,
      SUM(AggressiveFactor) as AggressiveCnt,
      SUM(CASE WHEN Directed = 'D'
        THEN OrderCount
          ELSE 0 END)       as DirectCnt,
      SUM(OrderCount)       as OrderCnt,
      SUM(ExecutedQuantity) as VolumeExecuted,
      SUM(NumberOfExecs)    as NumberOfExecs
    FROM temp t1
    GROUP BY Venue
  ) t1
  ORDER BY VolumeExecuted DESC, Venue;
END IF;
DROP TEMPORARY TABLE IF EXISTS temp;
END;
delimiter ;

На запуске типа:

call tca.p_GetRTS28Report_Oleg(105, '2017-01-01', '2017-12-31', 10, '65.6', 'REG', 'P', 1, 'BFM-656')​;

Выдает ошибку синтаксиса. Проверил всё, что мог, ошибки не вижу в упор.

READ ALSO
SQL связь таблиц по телефону

SQL связь таблиц по телефону

Задача такая: Есть таблица клиентов CUSTOMERS с телефонами вида

184
поиск подстроки в mysql

поиск подстроки в mysql

можно ли в столбце из строки: 10,13,18/12:00:00/15:55:00 извлечь первые 3 цифры до символа '/' ? то есть мне надо что бы оператор LIKE сравнивал только (10,13,18),...

191
Todo list на php [закрыт]

Todo list на php [закрыт]

Подскажите, можно ли сделать простой Todo list без использования БД?

197
Как определить первую запись в цикле foreach

Как определить первую запись в цикле foreach

есть массив, после прохождения по массиву циклом foreach нужно определить первую запись к примеру:

198