процедура возвращает True или False

Мне нужна хранимая процедура в firebird 3.0, чтобы вернуть результат True, False или 1,0, чтобы проверить, существует ли этот человек или запись в базе данных. Если существует, процедура должна вернуть true, если не вернуть False, или вернуть 1, если не вернуть 0

Это моя процедура, но она выдает ошибку: https://i.ibb.co/HLZQY59/Capture.jpg

Недопустимый токен.
Динамическая ошибка SQL.
Код ошибки SQL = -104
Неизвестный токен — строка 10, столбец 1.
конец.

Я хочу проверить, существует ли запись или нет, проверив имя, фамилию и день рождения.

create procedure aa(
v varchar(20),
g varchar(20),
dd date)
as 
begin
select fname,lname,bday from STUDENT
where not exists (select fname,lname,bday from STUDENT  where fname=:v and lname=:g and bday=:dd)
end

person Sahat    schedule 15.08.2020    source источник
comment
Если вы столкнулись с ошибкой, укажите ее в своем вопросе, это поможет определить проблему и улучшит возможности поиска для будущих посетителей.   -  person Mark Rotteveel    schedule 16.08.2020
comment
Кроме того, объясните, чего именно вы пытаетесь достичь (например, при каких условиях она должна возвращать true?), потому что, кроме очевидных синтаксических ошибок, эта процедура никоим образом не пытается вернуть логическое значение, так что это не совсем очевидно. как исправить эту процедуру помимо исправления синтаксических ошибок.   -  person Mark Rotteveel    schedule 16.08.2020
comment
Я хочу проверить, существует ли эта запись или не проверять ее с первым именем Фамилия День рождения   -  person Sahat    schedule 16.08.2020
comment
И ошибка, которую вы получаете? И, пожалуйста, добавьте подробности в редактировать свой вопрос. Не добавляйте их в комментарии.   -  person Mark Rotteveel    schedule 16.08.2020
comment
я отредактировал свой пост с вопросом, база данных не сохраняет мою процедуру, я хочу проверить, существует ли этот человек или запись в базе данных   -  person Sahat    schedule 16.08.2020
comment
У вас есть опыт программирования на классических императивных языках (C, Java, Pascal, Basic)? Проблема в том, что в вашем коде нет конкретной ошибки, он просто не имеет смысла... Как несколько случайных команд, скопированных из случайных мест без понимания того, как и почему они вообще работают. Вы можете прочитать главу Procedural SQL документации, но она предполагает, что у вас есть базовые знания программирования на императивных языках, и она адаптирует ваши общие навыки к специфике PSQL, но если у вас их нет, она вам не поможет.   -  person Arioch 'The    schedule 17.08.2020
comment
Документы: firebirdsql .org/file/documentation/html/en/refdocs/fblangref25/ ~~~ у вашей процедуры нет выходных параметров, поэтому она не может вернуть никакого значения ~~~ external select в вашем proc некуда девать сохраните результаты в ~~~ ваш внешний select вернет менее одной строки или более одной строки - для этого нет обработки. /// Эти пробелы очевидны, но вместе взятые... Даже создание некоторого кода, который не вылетает с ошибками, не означает, что он возвращает правильные, ожидаемые данные во всех случаях   -  person Arioch 'The    schedule 17.08.2020
comment
я добавляю возвращаемую переменную, но та же проблема создает процедуру aa(v varchar(20), g varchar(20), dd date) возвращает (aa integer) as start select fname,lname,bday from STUDENT, где не существует (выберите fname, lname,bday из STUDENT, где fname=:v и lname=:g и bday=:dd) конец   -  person Sahat    schedule 17.08.2020
comment
та же процедура создания aa( v varchar(20), g varchar(20), dd date) возвращает (результат логического значения) as begin result=(выберите fname,lfname,bday из STUDENT, где не существует (выберите fname,lname,bday из STUDENT где fname=:v и lfname=:g и bday=:dd)); конец;   -  person Sahat    schedule 17.08.2020


Ответы (1)


Ваша хранимая процедура не работает, потому что 1) у нее нет RETURNSусловие, поэтому он не может возвращать true или false, и 2) для выбора в PSQL требуется INTOусловие для поместите значения в переменную или возвращаемый параметр.

На основе вашего кода хранимая процедура, которая делает то, что вы хотите, будет:

create procedure aa(
  v varchar(20),
  g varchar(20),
  dd date)
  returns (student_exists boolean)
as 
begin
  student_exists = exists (select * from STUDENT where fname=:v and lname=:g and bday=:dd);
end

В зависимости от того, чего вам нужно достичь, function может быть более подходящим:

create procedure aa(
  v varchar(20),
  g varchar(20),
  dd date)
  returns boolean
as 
begin
  return exists (select * from STUDENT where fname=:v and lname=:g and bday=:dd);
end
person Mark Rotteveel    schedule 22.08.2020