Синтаксис цикла while в запросе HSQL - PullRequest
0 голосов
/ 17 октября 2019

Прежде всего, я новичок в программировании, поэтому извините, если я делаю синтаксические ошибки или задаю глупые вопросы. Я хочу зациклить запрос (сам запрос работает) в HSQL, и я попробовал его с помощью оператора WHILE, с оператором IF, но ни один из них не работает. Идея состоит в том, что я хочу использовать значение в таблице, сгенерированной моим запросом, и использовать это значение в следующем операторе WHERE (выберите, откуда, где), пока это значение не равно NULL. Что я делаю не так? Уже в объявлении переменных? В коде я пропустил некоторый код из оператора SELECT / FROM, поскольку этот оператор работает, когда он не «зациклен».

CREATE PROCEDURE (a)
BEGIN ATOMIC
DECLARE input INTEGER;
SET input = 49;
WHILE input = NOT NULL
DO
SELECT "SampleID"."Sample ID", "SampleID"."Originating from SampleID",   "SampleID"."Info" "ProjectID"."ProjectName" 
FROM { oj "SampleID" LEFT OUTER JOIN "ProjectID" ON "SampleID"."ProjectID" = "ProjectID"."ProjectID"  
WHERE ( "SampleID"."Sample ID" = input);
SET input= ("SampleID"."Originating from SampleID")
END WHILE;
END

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Спасибо за ответ. Итеративный оператор FOR будет именно тем, что мне нужно.

Правильно ли я понимаю, если невозможно вставить OUTER JOIN в процедуру?

Что касается всего моего запроса, он все еще не запущен. Неожиданный токен: ПРОЦЕДУРА в утверждении [CREATE PROCEDURE].

Лучше ли создать ФУНКЦИЮ? А что с объявлением переменной, лучше объявить курсор?

Привет, и еще раз спасибо за помощь,

Linsey

0 голосов
/ 18 октября 2019

Прежде всего, вы можете добавить условие NOT NULL в ваш запрос:

SELECT "SampleID"."Sample ID", "SampleID"."Originating from SampleID",  "SampleID"."Info" "ProjectID"."ProjectName" 
FROM "SampleID" LEFT OUTER JOIN "ProjectID" ON "SampleID"."ProjectID" = "ProjectID"."ProjectID"  
WHERE "SampleID"."Sample ID" = input AND "SampleID"."Originating IS NOT NULL;

Обратите внимание, что вы не можете использовать синтаксис {oj в процедуре.

Теперь, если вы хотитетолько "Исходя из SampleID" из запроса, зачем выбирать другие столбцы? Вы также можете упростить объединение.

SELECT "SampleID"."Originating from SampleID"
FROM "SampleID" LEFT OUTER JOIN "ProjectID" USING ("ProjectID")
WHERE "SampleID"."Sample ID" = input AND "SampleID"."Originating IS NOT NULL;

Цикл FOR ... DO ... END предназначен для проверки и использования строк из SELECT. Вы можете добавить дополнительные операторы внутри цикла:

for_label: FOR 
SELECT "SampleID"."Sample ID", "SampleID"."Originating from SampleID",  "SampleID"."Info" "ProjectID"."ProjectName" 
FROM "SampleID" LEFT OUTER JOIN "ProjectID" ON "SampleID"."ProjectID" = "ProjectID"."ProjectID"    
WHERE "SampleID"."Sample ID" = input AND "SampleID"."Originating IS NOT NULL 
DO
SET input= ("SampleID"."Originating from SampleID")
END FOR for_label;

См. Руководство: http://hsqldb.org/doc/2.0/guide/sqlroutines-chapt.html#src_psm_for_statement

Оператор создания процедуры должен иметь имя. Например:

CREATE PROCEDURE a()
BEGIN ATOMIC

Вы можете иметь OUTER JOIN и все другие варианты объединений в хранимых процедурах.

...