powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Процедура возвращает набор данных
25 сообщений из 30, страница 1 из 2
Процедура возвращает набор данных
    #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
Процедура возвращает набор данных
    #39800962
WellSlava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ошибка:

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

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

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

В Firebird выходные поля процедуры надо описывать явно. В документации поищи FOR SELECT ... INTO ... DO и SUSPEND;
...
Рейтинг: 0 / 0
Процедура возвращает набор данных
    #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
Процедура возвращает набор данных
    #39800972
WellSlava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, Досконально, не читал. Обратил внимание, что надо описывать возвращаемые параметры. Посмотрел примеры, но там ничего такого нет. В MS, если возвращаются переменные (числа, строки и т.д.), то их надо явно задавать. Но наборы данных возвращаются автоматически. Я думал и здесь также организовано. А так, это крайне неудобно, так как у меня все делается на сервере, включая все селекты, а из клиента идет только вызов процедур.
...
Рейтинг: 0 / 0
Процедура возвращает набор данных
    #39800976
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WellSlava,

ну это смотря с какой стороны посмотреть. Когда ХП вдруг начинает возвращать набор данных из-за описки в её коде это тоже не очень хорошо. В Firebird в этом смысле язык хранимок более строгий. Всё надо описывать.
...
Рейтинг: 0 / 0
Процедура возвращает набор данных
    #39801016
WellSlava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,Если у вас есть такой код, можно ли мне его дать? Я просто с примерами разбираюсь намного быстрее, чем при чтении документации, мне не надо получать фундаментальные знания?
...
Рейтинг: 0 / 0
Процедура возвращает набор данных
    #39801023
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтение документации - навык, который не относится к фундаментальным знаниям.
...
Рейтинг: 0 / 0
Процедура возвращает набор данных
    #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
Процедура возвращает набор данных
    #39801056
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Процедура возвращает набор данных
    #39801066
WellSlava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv, Благодарю.
Понял, наконец-то. Я все ожидал задание возвращаемых переменных в виде массива или чего-то подобного, а тут оказывается возвращается по одной записи. Сейчас буду работать.
...
Рейтинг: 0 / 0
Процедура возвращает набор данных
    #39801084
WellSlava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С этим разобрался. Теперь не могу понять другое - процедура возвращает набор данных с именами полей, как задавал переменные. Как сделать чтобы возвращался набор именно с именами полей?

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


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

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

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

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

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

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

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

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

Скорее всего забыл про обязательные двоеточия перед именами переменных в текстах собственно эапросов.
...
Рейтинг: 0 / 0
Процедура возвращает набор данных
    #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
Процедура возвращает набор данных
    #39801251
WellSlava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всех благодарю за ответы.
Если кто-то подскажет, как в процедуре вернуть набор данных с полями, как в запросе, то буду рад подсказке.

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

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


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