Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос из хранимой процедуры / 12 сообщений из 12, страница 1 из 1
26.08.2018, 10:26
    #39693360
SergIvanov80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из хранимой процедуры
Начал изучать ОРАКЛ(часть базы на него переезжает с MS SQL), просто вошел в ступор на простейшем вопросе, я наверное что то в совсем ином подходе не понимаю ((..

Код на MS SQL, т.е. просто вернули селект с максимальным значением в новом поле

DECLARE
@l_MaxC integer;

SELECT @l_MaxC=MAX(CountR) FROM Table1

SELECT Namer, CountR, @l_MaxC MaxCount FROM Table1


Код на Oracle
DECLARE
l_MaxC integer;

BEGIN
SELECT MAX(CountR) INTO l_MaxC FROM Table1

????

END;

Не понял как в итоге вернуть SELECT Namer, CountR, l_MaxC MaxCount FROM Table1 ????
Или как то иначе надо?
...
Рейтинг: 0 / 0
26.08.2018, 10:33
    #39693365
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из хранимой процедуры
SergIvanov80как в итоге вернуть SELECT Namer, CountR, l_MaxC MaxCount FROM Table1 ????

Куда вернуть?
Клиенту отдать - просто select.
В переменную - select into, все верно.
Test case дайте.
...
Рейтинг: 0 / 0
26.08.2018, 10:37
    #39693366
SergIvanov80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из хранимой процедуры
dmdmdmКуда вернуть?
Клиенту отдать - просто select.
Да, требуется просто вернуть клиенту итоговый Select
...
Рейтинг: 0 / 0
26.08.2018, 10:47
    #39693368
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из хранимой процедуры
Клиентское приложение делает select, который может включать вызов функции, получает данные.
Если хотите процедурный подход, используйте SYS_REFCURSOR.
...
Рейтинг: 0 / 0
26.08.2018, 21:18
    #39693472
SergIvanov80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из хранимой процедуры
dmdmdmКлиентское приложение делает select, который может включать вызов функции, получает данные.
Если хотите процедурный подход, используйте SYS_REFCURSOR.В итоге переписал через SYS_REFCURSOR, потом другим способом через функцию с packages.

А вот решил попробовать с функцией без packages и возникли проблемы.


create or replace TYPE t_TestT as object
(
table1_id integer,
NameR varchar2(20),
CountR integer,
MaxC integer
);

create or replace TYPE t_TestTS as table of t_TestT


create or replace function f_RetTestT (id_Table integer) return t_TestTS pipelined
as

BEGIN
for rec in
(
select
T1.id,
T1.NameR,
T1.CountR
from
table1 T1
where
(T1.id = id_Table OR -1=id_Table)
)
loop
pipe row (rec);
end loop;

return;

end;

На строчке " pipe row (rec); " выдает ошибку
Error(18,10): PL/SQL: Statement ignored
Error(18,20): PLS-00382: expression is of wrong type
...
Рейтинг: 0 / 0
26.08.2018, 22:24
    #39693479
SergIvanov80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из хранимой процедуры
Переписал с фетчем, работает

create or replace function f_RetTestT (id_Table integer) return t_TestTS pipelined
as

v_cur SYS_REFCURSOR;
v_res t_TestT:=t_TestT(Null, Null,Null, Null);

BEGIN

OPEN v_cur FOR
select
T1.id,
T1.NameR,
T1.CountR,
T1.maxc
from
table1 T1
where
(T1.id = id_Table OR -1=id_Table) ;

LOOP
FETCH v_cur INTO
v_res.table1_id,
v_res.NameR,
v_res.CountR,
v_res.MaxC;

EXIT WHEN v_cur%NOTFOUND;
PIPE ROW(v_res);

END LOOP;

RETURN;

end;

з.ы. Жаль непонятно что не так так с прошлым вариантом...всем спасибо)
...
Рейтинг: 0 / 0
27.08.2018, 04:35
    #39693498
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из хранимой процедуры
SergIvanov80з.ы. Жаль непонятно что не так так с прошлым вариантом...всем спасибо)Да всё тут понятно - другая СУБД, другая парадигма, следовательно - другие подходы в решении аналогичных задач.
Если вы до этого имели дело только с MS SQL Server, а сейчас переходите на Oracle, то много неожиданностей вас поджидает... В этих двух СУБД общего - сильно меньше, чем различающегося...
...
Рейтинг: 0 / 0
27.08.2018, 05:48
    #39693500
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из хранимой процедуры
Щукина АннаЕсли вы до этого имели дело только с MS SQL Serverсудя по бесполезности трех из четырех приведенных mssql-строк, они не проистекают ни из знаний, ни из сына ошибок трудных.
...
Рейтинг: 0 / 0
27.08.2018, 08:20
    #39693518
SergIvanov80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из хранимой процедуры
-2-судя по бесполезности трех из четырех приведенных mssql-строк, они не проистекают ни из знаний, ни из сына ошибок трудных.Бесполезное это ваше сообщение, которое не несет никакого смысла и пользы. Я просто привел простейший пример на MS SQL написанный за пару сек, меня интересовал общий смысл реализации подобного на ORACLE.
Вы предлагаете мне публиковать многостраничный расчет зп участков продаж и отчетов по ним и спрашивать "а как сделать так же на ORACLE", смешно...
...
Рейтинг: 0 / 0
27.08.2018, 09:01
    #39693523
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из хранимой процедуры
SergIvanov80интересовал общий смысл реализации подобного на ORACLE.В oracle, да и в mssql, подобное решается простым селектом. Причем одинаковым.
...
Рейтинг: 0 / 0
27.08.2018, 09:13
    #39693524
Бельфя
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из хранимой процедуры
SergIvanov80, должно заработать вот так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create or replace function f_RetTestT(id_Table integer) return t_TestTS
  pipelined as

begin
  for rec in (select t_TestT(table1_id => T1.id
                     	        ,NameR => T1.NameR
                               ,CountR => T1.CountR
                                 ,MaxC => null) res_row
                from table1 T1
               where (T1.id = id_Table or - 1 = id_Table))
  loop
    pipe row(rec.res_row);
  end loop;
  return;
end;


В вашем варианте с циклом непонятно, что передается на выход функции.
...
Рейтинг: 0 / 0
27.08.2018, 10:21
    #39693562
SergIvanov80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из хранимой процедуры
БельфяSergIvanov80, должно заработать вот так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create or replace function f_RetTestT(id_Table integer) return t_TestTS
  pipelined as

begin
  for rec in (select t_TestT(table1_id => T1.id
                     	        ,NameR => T1.NameR
                               ,CountR => T1.CountR
                                 ,MaxC => null) res_row
                from table1 T1
               where (T1.id = id_Table or - 1 = id_Table))
  loop
    pipe row(rec.res_row);
  end loop;
  return;
end;


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


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