Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Процедура возвращает набор данных  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Доброго времени суток.
Перевожу базу с MS SQL на FB. Не могу правильно создать процедуру, возвращающую набор данных.

Это MS SQL
create procedure Get_UserRole (@ID_User int)
as
begin
  if @ID_User is null 
    return 6001
  Select * From VUserRole Where ID_User = @ID_User
end


Вот, что у меня получается
create procedure Get_UserRole (vID_User int)
as
begin
  Select * From VUserRole Where ID_User = :vID_User;
end;
13 апр 19, 20:32    [21861258]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Вот ошибка:

Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 4, column 52.
;.

SQL Code: -104
IB Error Number: 335544569
13 апр 19, 20:33    [21861260]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9388
WellSlava,

это потому что ты не читаешь документацию.

В Firebird выходные поля процедуры надо описывать явно. В документации поищи FOR SELECT ... INTO ... DO и SUSPEND;
13 апр 19, 20:38    [21861269]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
AltHasp
Member

Откуда:
Сообщений: 95
WellSlava,

create or alter procedure GET_USER_ROLE (
    VID_USER integer)
returns (
    XYZ integer)
as
begin
  select first 1 coalesce(v.usr_role,-1)
   from vuserrole v where v.id_user = :vid_user into :xyz;
    suspend;
end


а вызывать так
select first 1 xyz from GET_USER_ROLE(:my_id)


как-то так. В селективных ХП нужен suspend, а coalesce для null значений например.
Удачи !
13 апр 19, 21:05    [21861307]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Симонов Денис, Досконально, не читал. Обратил внимание, что надо описывать возвращаемые параметры. Посмотрел примеры, но там ничего такого нет. В MS, если возвращаются переменные (числа, строки и т.д.), то их надо явно задавать. Но наборы данных возвращаются автоматически. Я думал и здесь также организовано. А так, это крайне неудобно, так как у меня все делается на сервере, включая все селекты, а из клиента идет только вызов процедур.
13 апр 19, 21:21    [21861322]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9388
WellSlava,

ну это смотря с какой стороны посмотреть. Когда ХП вдруг начинает возвращать набор данных из-за описки в её коде это тоже не очень хорошо. В Firebird в этом смысле язык хранимок более строгий. Всё надо описывать.
13 апр 19, 21:59    [21861348]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Симонов Денис,Если у вас есть такой код, можно ли мне его дать? Я просто с примерами разбираюсь намного быстрее, чем при чтении документации, мне не надо получать фундаментальные знания?
14 апр 19, 10:43    [21861492]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9073
Чтение документации - навык, который не относится к фундаментальным знаниям.
14 апр 19, 11:17    [21861502]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9388
WellSlava,

create procedure Get_UserRole (vID_User int)
returns (
   username type of column VUserRole.username, 
   rolename type of column VUserRole.rolename 
)
as
begin
  for select username, rolename 
       from VUserRole 
       where ID_User = :vID_User
       into username, rolename 
  do suspend;
end


неужели ты не смог найти это в документации?
14 апр 19, 13:18    [21861537]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 27910
WellSlava,

http://www.ibase.ru/sp_call/
14 апр 19, 14:24    [21861561]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
WellSlava
Member

Откуда:
Сообщений: 205
kdv, Благодарю.
Понял, наконец-то. Я все ожидал задание возвращаемых переменных в виде массива или чего-то подобного, а тут оказывается возвращается по одной записи. Сейчас буду работать.
14 апр 19, 15:12    [21861578]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
WellSlava
Member

Откуда:
Сообщений: 205
С этим разобрался. Теперь не могу понять другое - процедура возвращает набор данных с именами полей, как задавал переменные. Как сделать чтобы возвращался набор именно с именами полей?

Что-то типа
Select Var1 as Field1 From Procedure1

не предлагать.

Я уже выше писал, что на клиенте у меня идет обращение к процедуре и все. Что-то типа этого:

spName.CommandText := 'Procedure1';
spName.Open;
14 апр 19, 16:50    [21861626]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9388
WellSlava,

что сложно переменные назвать так же как поля?

>> Я уже выше писал, что на клиенте у меня идет обращение к процедуре и все.

не самый удобный подход. Фильтрацию уже нормально не привинтишь
14 апр 19, 16:55    [21861628]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 27910
WellSlava
Как сделать чтобы возвращался набор именно с именами полей?

что??? выходные параметры (переменные) процедуры - это и есть "поля".
14 апр 19, 19:53    [21861691]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
Ivan_Pisarevsky
Member

Откуда: НН
Сообщений: 8239
И еще до кучи: символ * в процедурах противопоказан.
14 апр 19, 22:00    [21861772]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
WellSlava
Member

Откуда:
Сообщений: 205
kdv,Вот именно, что названия выходных параметров, а не имена полей. У меня программа написана на MS SQL и должна теперь работать еще и на FB. У меня во всех грида и других полях прописаны названия полей, поэтому необходимо, чтобы и процедуры FB тоже возвращали имена полей. Если я переменные называю также как и поля, то выдается ошибка.
15 апр 19, 02:23    [21861841]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Ivan_Pisarevsky,Да я понял, что изначально FB/IB не предназначен для получения наборов данных из процедур, а вот такой возврат, который организован, больше всего напоминает заплатку.
15 апр 19, 02:27    [21861842]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 524
WellSlava
Если я переменные называю также как и поля, то выдается ошибка.


Врёш.
15 апр 19, 02:46    [21861844]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 524
WellSlava
Ivan_Pisarevsky,Да я понял, что изначально FB/IB не предназначен для получения наборов данных из процедур, а вот такой возврат, который организован, больше всего напоминает заплатку.


Ты смотри какой понятливый.
15 апр 19, 02:47    [21861845]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
m7m
Member

Откуда: Украина, Мариуполь
Сообщений: 1316
WellSlava
Если я переменные называю также как и поля, то выдается ошибка.

Ну так покажи ошибку
15 апр 19, 07:03    [21861890]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
Vlad F
Member

Откуда:
Сообщений: 752
WellSlava,

Скорее всего забыл про обязательные двоеточия перед именами переменных в текстах собственно эапросов.
15 апр 19, 08:23    [21861913]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Вот тело процедуры
create or alter procedure Get_StatusUsrTmp
returns (ID_Status int, Status_Name varchar(30))
as
begin
  for Select ID_Status, Status_Name From Status_Usr Order by Status_Name
      into :ID_Status, :Status_Name do
  begin
    suspend;
  end
end;


Мне необходимо, чтобы выходные поля были следующие: ID_Status, Status_Name
Вот ошибка:

Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Lock conflict on no wait transaction.
Unsuccessful metadata update.
Object PROCEDURE "" is in use.
15 апр 19, 08:52    [21861935]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Всех благодарю за ответы.
Если кто-то подскажет, как в процедуре вернуть набор данных с полями, как в запросе, то буду рад подсказке.

А так вышел из положения через временную процедуру, которая собирает нужный мне набор данных. А еще одна процедура, вызываемая из клиента, преобразует псевдонимы полей в нужные мне. Понимаю, что через одно место, но у меня просто нет времени сидеть и разбираться, а надо скорее переделать программу.
15 апр 19, 09:10    [21861944]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25193
WellSlava
Lock conflict on no wait transaction.
Unsuccessful metadata update.
Object PROCEDURE "" is in use.

Гугл-транслейт может помочь с переводом:
Конфликт блокировки при транзакции без ожидания.
Неудачное обновление метаданных.
Объект ПРОЦЕДУРА "" используется
15 апр 19, 09:20    [21861948]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возвращает набор данных  [new]
WellSlava
Member

Откуда:
Сообщений: 205
wadman, Вот только кто бы подсказал, откуда у меня в базе взялась процедура "" и как она задействована в создаваемой.
А так разобрался - все можно сделать, как мне надо. Просто так получилось, что на первой же создаваемой процедуре вылезла эта ошибка, вот и зациклился. Сейчас пересоздам базу и продолжу работать.

Всем всего хорошего.
15 апр 19, 09:23    [21861953]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить