Ошибка неожиданного токена в хранимой процедуре Advantage Database SQL - PullRequest
0 голосов
/ 24 мая 2018

У меня есть хранимая процедура, которая дает мне неожиданный токен;ЗАКАЖИТЕ, ожидая точку с запятой, когда у меня есть это утверждение в конце, когда я пытаюсь выполнить его.

выберите год из #temp, где год не равен ORDER BY year DESC;

, если я удалю ORDER BY year DESC; процедуруработает правильно.

Я пытался всеми возможными способами отсортировать полученную таблицу в порядке убывания.Я довольно новичок в SQL, поэтому я уверен, что это что-то простое.TIA.

// --------- полная хранимая процедура ------ //

ALTER PROCEDURE GetYearForExhaustCatalog
   ( 
      CatCodeString Memo,
      Year CHAR ( 4 ) OUTPUT
   ) 
BEGIN 
/*

  EXECUTE PROCEDURE GetYearForExhaustCatalog('(e.catalogcode= ''2182'')');

  EXECUTE PROCEDURE GetYearForExhaustCatalog('');


*/  

DECLARE @CatCodeString string;
DECLARE @SQL string;

@CatCodeString = (SELECT CatCodeString FROM __input);

if @CatCodeString IS NULL or @CatCodeString = '' then
  select e2.year,
  (SELECT top 1 e2.year
  FROM  eenginecatalog e LEFT JOIN exhaustengine e2 ON e2.app_no=e.app_no)
  as year
  into #temp
  from Exhaustengine e2;
  select year from #temp where year is not null
  GROUP BY  year
  ORDER BY  year DESC;
else
  @SQL = 
    'select e2.year, '+ 
    '(SELECT top 1 e2.year '+
    'FROM  eenginecatalog e LEFT JOIN exhaustengine e2 ON e2.app_no=e.app_no and '+
       @CatCodeString +' ) '+ 
    'as year '+
    'into #temp '+
    'from Exhaustengine e2; '+
    'select year from #temp where year is not null '+
    'GROUP BY  year '+
    'ORDER BY  year DESC ';
  execute immediate @SQL;
end;

insert into __output
  select year from #temp where year is not null ORDER BY year;
  drop table #temp;

END;

Ответы [ 2 ]

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

Таблица __output не является виновником.В стандарте SQL ORDER BY вообще не разрешен в подзапросах.Причина в том, что сортировка набора строк не должна иметь никакого эффекта во время внутреннего разрешения запроса.Это полезно только в конечном результате.В смысле чистого SQL единственное действие, гарантирующее сортировку результата, - это ORDER BY для конечного результата.

Если следовать этой логике, возможной альтернативой не является попытка поместить данные в таблицу __output.в отсортированном порядке, но чтобы окончательный результат сортировался со следующим:

SELECT * FROM (EXECUTE PROCEDURE MyProcedure(inParam)) t ORDER BY t.year
0 голосов
/ 24 мая 2018

Кажется, что ADS не нравится предложение ORDER BY при вставке в специальную таблицу __output.

Это также не работает:

CREATE PROCEDURE MyProcedure(Year INTEGER OUTPUT) 
BEGIN 

CREATE TABLE #tmp ("Year" INTEGER);

INSERT INTO #tmp ("Year") VALUES (2019);
INSERT INTO #tmp ("Year") VALUES (2017);
INSERT INTO #tmp ("Year") VALUES (2018);

INSERT INTO
  __output
SELECT
  "Year"
FROM #tmp
ORDER BY
  "Year";

DROP TABLE #tmp;

END;

Сбой прито же самое сообщение об ошибке, которое вы получили:

poQuery: Error 7200:  AQE Error:  State = 42000;   NativeError = 2117;  [SAP][Advantage SQL Engine]Unexpected token: ORDER -- Expecting semicolon. -- Location of error in the SQL statement is: 269 (line: 15 column: 1)

В качестве обходного пути вы можете создать другую временную таблицу с отсортированным результатом:

CREATE PROCEDURE MyProcedure(Year INTEGER OUTPUT) 
BEGIN 

CREATE TABLE #tmp ("Year" INTEGER);

INSERT INTO #tmp ("Year") VALUES (2019);
INSERT INTO #tmp ("Year") VALUES (2017);
INSERT INTO #tmp ("Year") VALUES (2018);

SELECT
  *
INTO #sorted
FROM #tmp
ORDER BY
  "Year"
;

INSERT INTO
  __output
SELECT
  "Year"
FROM #sorted;

DROP TABLE #sorted;
DROP TABLE #tmp;

END;

Это работает без ошибок, и данные сортируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...