Форум: "Базы";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];
ВнизOracle Найти похожие ветки
← →
nnnicky (2008-12-16 12:19) [0]Добрый день!
Есть некая функция, которая вызывается через экшен.
Делаю так: в компонент OraQuery пишу запрос:
SELECT *
FROM TABLE (SVB_NETTING.build_netting_list
(
iNETTINGNUMBER IN NUMBER,
dDATENETTING IN DATE,
sUSERCREATE IN VARCHAR2
))RETURN RESULT_ERROR_NT
Соответственно вызываю:
procedure TfmHBBankNetting.act_BuildListExecute(Sender: TObject);
begin
inherited;
OraQuery.Execute;
end;
Нужно сделать: в случае если RESULT_ERROR_NT содержит записи показать в отдельном окне пользователю.
Вопрос простенький наверно, но что-то пока не пойму как сделать.
← →
Кщд (2008-12-16 12:44) [1]
SELECT *
FROM TABLE (SVB_NETTING.build_netting_list
(
iNETTINGNUMBER IN NUMBER,
dDATENETTING IN DATE,
sUSERCREATE IN VARCHAR2
))RETURN RESULT_ERROR_NT
это, простите, чушь
учите синтаксис
← →
Медвежонок Пятачок © (2008-12-16 12:48) [2]отчего же сразу чушь. эта оракул
← →
Кщд (2008-12-16 12:52) [3]>Медвежонок Пятачок © (16.12.08 12:48) [2]
>отчего же сразу чушь. эта оракул
настаиваете?)
← →
ANB (2008-12-16 12:52) [4]
> отчего же сразу чушь. эта оракул
Потому и чушь, что оракл.
Автор :
1. У тебя в девелопере этот запрос выполняется ?
2. Если уж хочешь вернуть набор данных, то надо делать Open.
← →
Медвежонок Пятачок © (2008-12-16 13:05) [5]я не пробовал, только визуально разбирал.
автор просто применяет псевдофункцию тэйбл к коллекции.
← →
nnnicky (2008-12-16 13:09) [6]Это функция из пакета Oracle и она прекрасно работает.
← →
Кщд (2008-12-16 13:17) [7]>nnnicky (16.12.08 13:09) [6]
1. не указана версия oracle
2. не указан тип значения, возвращаемого ф-цией
3. приведенный Вами синтаксис sql-запроса не существует в природе
>Медвежонок Пятачок © (16.12.08 13:05) [5]
>автор просто применяет псевдофункцию тэйбл к коллекции.
sql-level type, pipelined function?
и это только если поверить в Ваше допущение, что эта ф-ция(если это, действительно, ф-ция:)) возвращает не, например, xmltype)
← →
nnnicky (2008-12-16 13:17) [8]так как же мне выцепить RETURN RESULT_ERROR_NT?
← →
nnnicky (2008-12-16 13:20) [9]
> 3. приведенный Вами синтаксис sql-запроса не существует
> в природе
Но как-то странным образом прекрасно работает
← →
Кщд (2008-12-16 13:20) [10]>nnnicky (16.12.08 13:17) [8]
озвучьте, пожалуйста:
Кщд (16.12.08 13:17) [7]
+ тип RETURN RESULT_ERROR_NT
+ компоненты доступа
← →
Кщд (2008-12-16 13:21) [11]>nnnicky (16.12.08 13:20) [9]
>Но как-то странным образом прекрасно работает
в sqlplus работает?)
← →
nnnicky (2008-12-16 13:24) [12]
> (если это, действительно, ф-ция:))
FUNCTION build_banknetting_list
(
iNETTINGNUMBER IN NUMBER,
dDATENETTING IN DATE,
sUSERCREATE IN VARCHAR2
) RETURN RESULT_ERROR_NT
Нет. вот функция.)) А выше всего лишь способ ее вызова
← →
Кщд (2008-12-16 13:28) [13]>nnnicky (16.12.08 13:24) [12]
>Нет. вот функция.)) А выше всего лишь способ ее вызова
ну, дело Ваше)
успехов
← →
nnnicky (2008-12-16 13:44) [14]1. Oracle 9i
2. возвращает таблицу (RETURN RESULT_ERROR_NT - тип)
3. компоненты OraQuery oraDataSource
← →
Кщд (2008-12-16 13:54) [15]>nnnicky (16.12.08 13:44) [14]
>1. Oracle 9i
уже легче
>2. возвращает таблицу (RETURN RESULT_ERROR_NT - тип)
дефиницию типа привести не в состоянии?
>3. компоненты OraQuery oraDataSource
вероятно, это ODAC?
← →
nnnicky (2008-12-16 14:54) [16]2. TYPE RESULT_ERROR_T AS OBJECT(
CODE NUMBER(5,0),
DESCRIPTOIN VARCHAR2(255),
PARAM1 VARCHAR2(255),
PARAM2 VARCHAR2(255),
PARAM3 VARCHAR2(255),
CONSTRUCTOR FUNCTION RESULT_ERROR_T RETURN SELF AS RESULT
);
3. ODAC
← →
Медвежонок Пятачок © (2008-12-16 15:27) [17]опять по памяти нет под рукой сервера.
нужно тритить объект к типу и затем уже обращаться к атрибутам
← →
ANB (2008-12-16 17:17) [18]
> Нет. вот функция.)) А выше всего лишь способ ее вызова
Смущает меня такой способ вызова. И вряд ли он и из пакета работать будет.
Функция даже не пипелайновая, т.е. вертает просто рекорд.
Из клиента такую вызвать весьма непросто.
По любому как минимум безымянный блок нужен.
← →
Petr V. Abramov © (2008-12-16 19:50) [19]SELECT *
FROM TABLE (SVB_NETTING.build_netting_list
(
:i ,
:d ,
:s
))
должно на ура сработать
← →
Кщд (2008-12-17 11:37) [20]>Petr V. Abramov © (16.12.08 19:50) [19]
в 9i точно не нужно явно приводить к типу результата?
← →
ANB (2008-12-17 12:16) [21]create or replace type HCF_RESULT_ERROR_T as object
(
CODE number(5,0),
DESCRIPTOIN varchar2(255),
PARAM1 varchar2(255),
PARAM2 varchar2(255),
PARAM3 varchar2(255),
CONSTRUCTOR function HCF_RESULT_ERROR_T return SELF as RESULT
)
create or replace function build_banknetting_list
return HCF_RESULT_ERROR_T
is
v_HCF_RESULT_ERROR_T HCF_RESULT_ERROR_T;
begin
v_HCF_RESULT_ERROR_T := HCF_RESULT_ERROR_T;
v_HCF_RESULT_ERROR_T.CODE := 1;
v_HCF_RESULT_ERROR_T.DESCRIPTOIN := "F1";
v_HCF_RESULT_ERROR_T.PARAM1 := "F2";
v_HCF_RESULT_ERROR_T.PARAM2 := "F3";
v_HCF_RESULT_ERROR_T.PARAM3 := "F4";
return v_HCF_RESULT_ERROR_T;
end;
select * from table(build_banknetting_list()) - не ботает.
← →
Кщд (2008-12-17 14:08) [22]>select * from table(build_banknetting_list()) - не ботает.
create type HCF_RESULT_ERROR_NT as table of HCF_RESULT_ERROR_T;
create or replace function build_banknetting_list
return HCF_RESULT_ERROR_NT
is
...
select * from table(build_banknetting_list());
← →
nnnicky (2008-12-17 15:10) [23]SELECT *
FROM TABLE (SVB_NETTING.build_banknetting_list
(
10,
"08.12.2008",
"KEP"
)) RETURN RESULT_ERROR_NT
← →
ANB (2008-12-17 15:37) [24]
> SELECT *
> FROM TABLE (SVB_NETTING.build_banknetting_list
> (
> 10,
> "08.12.2008",
> "KEP"
> )) RETURN RESULT_ERROR_NT
RETURN RESULT_ERROR_NT - зачем это ?
← →
ANB (2008-12-17 15:39) [25]
> nnnicky (17.12.08 15:10) [23]
Прежде, чем пихать запрос в клиента - сначала добейся, чтобы он работал из девелопера.
← →
ANB (2008-12-17 15:42) [26]
> Кщд (17.12.08 14:08) [22]
А середку функции ?
← →
nnnicky (2008-12-17 16:02) [27]товарищи, в девелопере он работает и возвращает данные. Мне нужно функцию из Delphi вызывать.
FUNCTION build_banknetting_list
(
iNETTINGNUMBER IN NUMBER,
dDATENETTING IN DATE,
sUSERCREATE IN VARCHAR2
) RETURN RESULT_ERROR_NT
IS
retval RESULT_ERROR_NT := RESULT_ERROR_NT();
ErrorRec RESULT_ERROR_T := NEW RESULT_ERROR_T;
BEGIN
FOR nrec IN (
SELECT BL.ID,
BL.CUSTID,
BL.BANKNAME,
BL.ID_SVB_GROUPTYPELIST,
GTLD.DAYSTART,
GTLD.DAYEND
FROM SVB_BANKLIST BL
INNER JOIN SVB_GROUPTYPELIST GTL
ON BL.ID_SVB_GROUPTYPELIST = GTL.ID
INNER JOIN SVB_GROUPTYPELISTDAYS GTLD
ON GTL.ID = GTLD.ID_SVB_GROUPTYPELIST
WHERE GTLD.DAYNUMBER = to_char(dDATENETTING,"D")
)
LOOP
ErrorRec := SVB_BLIZKO_NETTING_LIB.ADD_BANK_TO_BANKNETTING (
iNETTINGNUMBER ,
nrec.ID ,
dDATENETTING ,
nrec.DAYSTART,
nrec.DAYEND,
sUSERCREATE ,
nrec.CUSTID,
nrec.BANKNAME
);
IF ErrorRec.CODE IS NOT NULL
THEN BEGIN
retval.extend;
retval(retval.last) := ErrorRec;
END;
END IF;
END LOOP;
RETURN retval;
END build_banknetting_list;
← →
ANB (2008-12-17 17:53) [28]
> товарищи, в девелопере он работает и возвращает данные.
С ретурном работает ? И вертает набор данных ?
← →
Petr V. Abramov © (2008-12-17 23:26) [29]
> nnnicky (17.12.08 16:02) [27]
поубивал би
> ANB (17.12.08 17:53) [28]
а че в девелопере не работать, test на ф-ции, девелопер и сгенерит скрипт.
← →
Кщд (2008-12-18 07:46) [30]>nnnicky (17.12.08 15:10) [23]
Вам ещё в Petr V. Abramov © (16.12.08 19:50) [19] всё сказали
← →
Кщд (2008-12-18 08:05) [31]>Petr V. Abramov © (17.12.08 23:26) [29]
>поубивал би
вполне нормальная ситуация для специализированного фреймворка
работает не самым быстрым образом - зато надежно
← →
Petr V. Abramov © (2008-12-18 13:45) [32]
> Кщд (18.12.08 08:05) [31]
вполне нормальная ситуация для незнания синтаксиса, это все одним селектом делается
← →
Petr V. Abramov © (2008-12-18 16:55) [33]а может, я и погорячился, переключений контекста меньше.
но
> IF ErrorRec.CODE IS NOT NULL
> THEN BEGIN
> retval.extend;
> retval(retval.last) := ErrorRec;
> END;
> END IF;
улыбает :)
← →
nnnicky (2008-12-18 17:29) [34]
> улыбает :)
чем же вас так улыбнуло?
← →
Petr V. Abramov © (2008-12-18 17:51) [35]
> nnnicky (18.12.08 17:29) [34]
не нужен там begin ... end, чай не паскаль.
и for nrec ... loop крутить ни к чему, select ... bulk collect into быстрее, если записей немного, если много, то fetch ... bulk collect into limit N
← →
Кщд (2008-12-19 10:50) [36]>Petr V. Abramov © (18.12.08 17:51) [35]
>не нужен там begin ... end, чай не паскаль.
но на производительность-таки этот анонимный блок не влияет)
>select ... bulk collect into быстрее
мне совсем не верится, что автор привел реальный код ф-ции и в цикле нет exit when.
иначе, не совсем понятно, а зачем, собственно, нужна такая ф-ция?
если придираться по-серьезному, то больше улыбает оптимизм решений на create type, поддержку которого oracle задекларировал, видимо, в чисто маркетинговых целях, т.к. до сих пор нет корректной поддержки работы с ним
и отдельный большой привет тем системам, что начали использовать наследование таких объектов в oracle
← →
Petr V. Abramov © (2008-12-19 11:19) [37]
> Кщд (19.12.08 10:50) [36]
> если придираться по-серьезному, то больше улыбает оптимизм
> решений на create type,
в 10-ке все очень культурно-мультурно работает, фактическ ине реализованы только foreign ключи на поля подтипов. В 8-ке, да, была жесть с объектными типами, 9-ку я пропустил.
← →
Кщд (2008-12-19 14:10) [38]>в 10-ке все очень культурно-мультурно работает
даже в 10-ке при изменении базового типа необходимо дропать ВСЁ дерево наследований и прокатывать заново
не дай боже поставить final-тип в качестве поля таблицы...
а без этого сам смысл использования теряется - проще пользоваться pipelined + pl/sql collections
т.е. как не было вменяемой поддержки типов, так и нет
и, судя по metalink, и не предвидится
← →
Petr V. Abramov © (2008-12-19 14:45) [39]
> Кщд (19.12.08 14:10) [38]
>при изменении базового типа необходимо дропать ВСЁ дерево наследований > и прокатывать заново
не надо, alter type нормально работает, по крайней мере, на добавление атрибутов
> не дай боже поставить final-тип в качестве поля таблицы...
а что будет?
← →
Кщд (2008-12-22 10:08) [40]>Petr V. Abramov © (19.12.08 14:45) [39]
>не надо, alter type нормально работает, по крайней мере, на добавление атрибутов
с добавлением всё в порядке - cascade или invalidate - и вперед
проблемы начинаются с drop attribute и целой череды ограничений, связанных с ним
плюс к этому до сих нерешенная проблема с одноименными типами в разных схемах одного инстанса
всё это, конечно, обходится, но желание задействовать ООП механизм Oracle в продуктиве уменьшает до нуля
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.005 c