Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Процедура возвращает набор данных / 25 сообщений из 30, страница 1 из 2
13.04.2019, 20:32
    #39800961
WellSlava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
Доброго времени суток.
Перевожу базу с MS SQL на FB. Не могу правильно создать процедуру, возвращающую набор данных.

Это MS SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
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



Вот, что у меня получается
Код: sql
1.
2.
3.
4.
5.
create procedure Get_UserRole (vID_User int)
as
begin
  Select * From VUserRole Where ID_User = :vID_User;
end;
...
Рейтинг: 0 / 0
13.04.2019, 20:33
    #39800962
WellSlava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
Вот ошибка:

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

SQL Code: -104
IB Error Number: 335544569
...
Рейтинг: 0 / 0
13.04.2019, 20:38
    #39800964
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
WellSlava,

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

В Firebird выходные поля процедуры надо описывать явно. В документации поищи FOR SELECT ... INTO ... DO и SUSPEND;
...
Рейтинг: 0 / 0
13.04.2019, 21:05
    #39800968
AltHasp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
WellSlava,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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



а вызывать так
Код: plsql
1.
select first 1 xyz from GET_USER_ROLE(:my_id)



как-то так. В селективных ХП нужен suspend, а coalesce для null значений например.
Удачи !
...
Рейтинг: 0 / 0
13.04.2019, 21:21
    #39800972
WellSlava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
Симонов Денис, Досконально, не читал. Обратил внимание, что надо описывать возвращаемые параметры. Посмотрел примеры, но там ничего такого нет. В MS, если возвращаются переменные (числа, строки и т.д.), то их надо явно задавать. Но наборы данных возвращаются автоматически. Я думал и здесь также организовано. А так, это крайне неудобно, так как у меня все делается на сервере, включая все селекты, а из клиента идет только вызов процедур.
...
Рейтинг: 0 / 0
13.04.2019, 21:59
    #39800976
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
WellSlava,

ну это смотря с какой стороны посмотреть. Когда ХП вдруг начинает возвращать набор данных из-за описки в её коде это тоже не очень хорошо. В Firebird в этом смысле язык хранимок более строгий. Всё надо описывать.
...
Рейтинг: 0 / 0
14.04.2019, 10:43
    #39801016
WellSlava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
Симонов Денис,Если у вас есть такой код, можно ли мне его дать? Я просто с примерами разбираюсь намного быстрее, чем при чтении документации, мне не надо получать фундаментальные знания?
...
Рейтинг: 0 / 0
14.04.2019, 11:17
    #39801023
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
Чтение документации - навык, который не относится к фундаментальным знаниям.
...
Рейтинг: 0 / 0
14.04.2019, 13:18
    #39801043
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
WellSlava,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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



неужели ты не смог найти это в документации?
...
Рейтинг: 0 / 0
14.04.2019, 14:24
    #39801056
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
...
Рейтинг: 0 / 0
14.04.2019, 15:12
    #39801066
WellSlava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
kdv, Благодарю.
Понял, наконец-то. Я все ожидал задание возвращаемых переменных в виде массива или чего-то подобного, а тут оказывается возвращается по одной записи. Сейчас буду работать.
...
Рейтинг: 0 / 0
14.04.2019, 16:50
    #39801084
WellSlava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
С этим разобрался. Теперь не могу понять другое - процедура возвращает набор данных с именами полей, как задавал переменные. Как сделать чтобы возвращался набор именно с именами полей?

Что-то типа
Код: sql
1.
Select Var1 as Field1 From Procedure1


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

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

spName.CommandText := 'Procedure1';
spName.Open;
...
Рейтинг: 0 / 0
14.04.2019, 16:55
    #39801085
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
WellSlava,

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

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

не самый удобный подход. Фильтрацию уже нормально не привинтишь
...
Рейтинг: 0 / 0
14.04.2019, 19:53
    #39801111
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
WellSlava Как сделать чтобы возвращался набор именно с именами полей?
что??? выходные параметры (переменные) процедуры - это и есть "поля".
...
Рейтинг: 0 / 0
14.04.2019, 22:00
    #39801152
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
И еще до кучи: символ * в процедурах противопоказан.
...
Рейтинг: 0 / 0
15.04.2019, 02:23
    #39801186
WellSlava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
kdv,Вот именно, что названия выходных параметров, а не имена полей. У меня программа написана на MS SQL и должна теперь работать еще и на FB. У меня во всех грида и других полях прописаны названия полей, поэтому необходимо, чтобы и процедуры FB тоже возвращали имена полей. Если я переменные называю также как и поля, то выдается ошибка.
...
Рейтинг: 0 / 0
15.04.2019, 02:27
    #39801187
WellSlava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
Ivan_Pisarevsky,Да я понял, что изначально FB/IB не предназначен для получения наборов данных из процедур, а вот такой возврат, который организован, больше всего напоминает заплатку.
...
Рейтинг: 0 / 0
15.04.2019, 02:46
    #39801189
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
WellSlavaЕсли я переменные называю также как и поля, то выдается ошибка.

Врёш.
...
Рейтинг: 0 / 0
15.04.2019, 02:47
    #39801190
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
WellSlavaIvan_Pisarevsky,Да я понял, что изначально FB/IB не предназначен для получения наборов данных из процедур, а вот такой возврат, который организован, больше всего напоминает заплатку.

Ты смотри какой понятливый.
...
Рейтинг: 0 / 0
15.04.2019, 07:03
    #39801210
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
WellSlava Если я переменные называю также как и поля, то выдается ошибка.
Ну так покажи ошибку
...
Рейтинг: 0 / 0
15.04.2019, 08:23
    #39801226
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
WellSlava,

Скорее всего забыл про обязательные двоеточия перед именами переменных в текстах собственно эапросов.
...
Рейтинг: 0 / 0
15.04.2019, 08:52
    #39801244
WellSlava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
Вот тело процедуры
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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.
...
Рейтинг: 0 / 0
15.04.2019, 09:10
    #39801251
WellSlava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
Всех благодарю за ответы.
Если кто-то подскажет, как в процедуре вернуть набор данных с полями, как в запросе, то буду рад подсказке.

А так вышел из положения через временную процедуру, которая собирает нужный мне набор данных. А еще одна процедура, вызываемая из клиента, преобразует псевдонимы полей в нужные мне. Понимаю, что через одно место, но у меня просто нет времени сидеть и разбираться, а надо скорее переделать программу.
...
Рейтинг: 0 / 0
15.04.2019, 09:20
    #39801254
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
WellSlavaLock conflict on no wait transaction.
Unsuccessful metadata update.
Object PROCEDURE "" is in use.
Гугл-транслейт может помочь с переводом:
Конфликт блокировки при транзакции без ожидания.
Неудачное обновление метаданных.
Объект ПРОЦЕДУРА "" используется
...
Рейтинг: 0 / 0
15.04.2019, 09:23
    #39801257
WellSlava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура возвращает набор данных
wadman, Вот только кто бы подсказал, откуда у меня в базе взялась процедура "" и как она задействована в создаваемой.
А так разобрался - все можно сделать, как мне надо. Просто так получилось, что на первой же создаваемой процедуре вылезла эта ошибка, вот и зациклился. Сейчас пересоздам базу и продолжу работать.

Всем всего хорошего.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Процедура возвращает набор данных / 25 сообщений из 30, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]