-
Добрый день!
Есть некая функция, которая вызывается через экшен.
Делаю так: в компонент 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 содержит записи показать в отдельном окне пользователю.
Вопрос простенький наверно, но что-то пока не пойму как сделать.
-
SELECT *
FROM TABLE (SVB_NETTING.build_netting_list
(
iNETTINGNUMBER IN NUMBER,
dDATENETTING IN DATE,
sUSERCREATE IN VARCHAR2
))RETURN RESULT_ERROR_NT
это, простите, чушь
учите синтаксис
-
отчего же сразу чушь. эта оракул
-
>Медвежонок Пятачок © (16.12.08 12:48) [2]
>отчего же сразу чушь. эта оракул
настаиваете?)
-
> отчего же сразу чушь. эта оракул
Потому и чушь, что оракл.
Автор :
1. У тебя в девелопере этот запрос выполняется ?
2. Если уж хочешь вернуть набор данных, то надо делать Open.
-
я не пробовал, только визуально разбирал.
автор просто применяет псевдофункцию тэйбл к коллекции.
-
Это функция из пакета Oracle и она прекрасно работает.
-
>nnnicky (16.12.08 13:09) [6]
1. не указана версия oracle
2. не указан тип значения, возвращаемого ф-цией
3. приведенный Вами синтаксис sql-запроса не существует в природе
>Медвежонок Пятачок © (16.12.08 13:05) [5]
>автор просто применяет псевдофункцию тэйбл к коллекции.
sql-level type, pipelined function?
и это только если поверить в Ваше допущение, что эта ф-ция(если это, действительно, ф-ция:)) возвращает не, например, xmltype)
-
так как же мне выцепить RETURN RESULT_ERROR_NT?
-
> 3. приведенный Вами синтаксис sql-запроса не существует
> в природе
Но как-то странным образом прекрасно работает
-
>nnnicky (16.12.08 13:17) [8]
озвучьте, пожалуйста:
Кщд (16.12.08 13:17) [7]
+ тип RETURN RESULT_ERROR_NT
+ компоненты доступа
-
>nnnicky (16.12.08 13:20) [9]
>Но как-то странным образом прекрасно работает
в sqlplus работает?)
-
> (если это, действительно, ф-ция:))
FUNCTION build_banknetting_list
(
iNETTINGNUMBER IN NUMBER,
dDATENETTING IN DATE,
sUSERCREATE IN VARCHAR2
) RETURN RESULT_ERROR_NT
Нет. вот функция.)) А выше всего лишь способ ее вызова
-
>nnnicky (16.12.08 13:24) [12]
>Нет. вот функция.)) А выше всего лишь способ ее вызова
ну, дело Ваше)
успехов
-
1. Oracle 9i
2. возвращает таблицу (RETURN RESULT_ERROR_NT - тип)
3. компоненты OraQuery oraDataSource
-
>nnnicky (16.12.08 13:44) [14]
>1. Oracle 9i
уже легче
>2. возвращает таблицу (RETURN RESULT_ERROR_NT - тип)
дефиницию типа привести не в состоянии?
>3. компоненты OraQuery oraDataSource
вероятно, это ODAC?
-
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
-
опять по памяти нет под рукой сервера.
нужно тритить объект к типу и затем уже обращаться к атрибутам
-
> Нет. вот функция.)) А выше всего лишь способ ее вызова
Смущает меня такой способ вызова. И вряд ли он и из пакета работать будет.
Функция даже не пипелайновая, т.е. вертает просто рекорд.
Из клиента такую вызвать весьма непросто.
По любому как минимум безымянный блок нужен.
-
SELECT *
FROM TABLE (SVB_NETTING.build_netting_list
(
:i ,
:d ,
:s
))
должно на ура сработать
-
>Petr V. Abramov © (16.12.08 19:50) [19]
в 9i точно не нужно явно приводить к типу результата?
-
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()) - не ботает.
-
>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());
-
SELECT *
FROM TABLE (SVB_NETTING.build_banknetting_list
(
10,
'08.12.2008',
'KEP'
)) RETURN RESULT_ERROR_NT
-
> SELECT *
> FROM TABLE (SVB_NETTING.build_banknetting_list
> (
> 10,
> '08.12.2008',
> 'KEP'
> )) RETURN RESULT_ERROR_NT
RETURN RESULT_ERROR_NT - зачем это ?
-
> nnnicky (17.12.08 15:10) [23]
Прежде, чем пихать запрос в клиента - сначала добейся, чтобы он работал из девелопера.
-
> Кщд (17.12.08 14:08) [22]
А середку функции ?
-
товарищи, в девелопере он работает и возвращает данные. Мне нужно функцию из 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;
-
> товарищи, в девелопере он работает и возвращает данные.
С ретурном работает ? И вертает набор данных ?
-
> nnnicky (17.12.08 16:02) [27]
поубивал би
> ANB (17.12.08 17:53) [28]
а че в девелопере не работать, test на ф-ции, девелопер и сгенерит скрипт.
-
>nnnicky (17.12.08 15:10) [23]
Вам ещё в Petr V. Abramov © (16.12.08 19:50) [19] всё сказали
-
>Petr V. Abramov © (17.12.08 23:26) [29]
>поубивал би
вполне нормальная ситуация для специализированного фреймворка
работает не самым быстрым образом - зато надежно
-
> Кщд (18.12.08 08:05) [31]
вполне нормальная ситуация для незнания синтаксиса, это все одним селектом делается
-
а может, я и погорячился, переключений контекста меньше.
но
> IF ErrorRec.CODE IS NOT NULL
> THEN BEGIN
> retval.extend;
> retval(retval.last) := ErrorRec;
> END;
> END IF;
улыбает :)
-
> улыбает :)
чем же вас так улыбнуло?
-
> nnnicky (18.12.08 17:29) [34]
не нужен там begin ... end, чай не паскаль.
и for nrec ... loop крутить ни к чему, select ... bulk collect into быстрее, если записей немного, если много, то fetch ... bulk collect into limit N
-
>Petr V. Abramov © (18.12.08 17:51) [35]
>не нужен там begin ... end, чай не паскаль.
но на производительность-таки этот анонимный блок не влияет)
>select ... bulk collect into быстрее
мне совсем не верится, что автор привел реальный код ф-ции и в цикле нет exit when.
иначе, не совсем понятно, а зачем, собственно, нужна такая ф-ция?
если придираться по-серьезному, то больше улыбает оптимизм решений на create type, поддержку которого oracle задекларировал, видимо, в чисто маркетинговых целях, т.к. до сих пор нет корректной поддержки работы с ним
и отдельный большой привет тем системам, что начали использовать наследование таких объектов в oracle
-
> Кщд (19.12.08 10:50) [36]
> если придираться по-серьезному, то больше улыбает оптимизм
> решений на create type,
в 10-ке все очень культурно-мультурно работает, фактическ ине реализованы только foreign ключи на поля подтипов. В 8-ке, да, была жесть с объектными типами, 9-ку я пропустил.
-
>в 10-ке все очень культурно-мультурно работает
даже в 10-ке при изменении базового типа необходимо дропать ВСЁ дерево наследований и прокатывать заново
не дай боже поставить final-тип в качестве поля таблицы...
а без этого сам смысл использования теряется - проще пользоваться pipelined + pl/sql collections
т.е. как не было вменяемой поддержки типов, так и нет
и, судя по metalink, и не предвидится
-
> Кщд (19.12.08 14:10) [38]
>при изменении базового типа необходимо дропать ВСЁ дерево наследований > и прокатывать заново
не надо, alter type нормально работает, по крайней мере, на добавление атрибутов
> не дай боже поставить final-тип в качестве поля таблицы...
а что будет?
-
>Petr V. Abramov © (19.12.08 14:45) [39]
>не надо, alter type нормально работает, по крайней мере, на добавление атрибутов
с добавлением всё в порядке - cascade или invalidate - и вперед
проблемы начинаются с drop attribute и целой череды ограничений, связанных с ним
плюс к этому до сих нерешенная проблема с одноименными типами в разных схемах одного инстанса
всё это, конечно, обходится, но желание задействовать ООП механизм Oracle в продуктиве уменьшает до нуля
-
> Кщд (22.12.08 10:08) [40]
так и drop column только аж в 8-й версии появилось.
я использую, от кучи другого гимра избавляет
-
SELECT *
FROM TABLE (SVB_BLIZKO_NETTING.build_banknetting_list
( :NETTINGNUMBER,
:DATENETTING,
user
))
dsHB.Params[0].AsNumber := 10;
dsHB.Params[1].AsDate := 08-12-2008;
Не работают параметры... Тип Number и Date. Когда явно указываю значения - все ок. А так говорит нет таких данных
-
>nnnicky (24.12.08 12:11) [42]
приводите оригинальный текст ошибки
>dsHB.Params[1].AsDate := '08-12-2008';
передавайте дату, а не строку
-
> передавайте дату, а не строку
у него не строка вообще то, насколько вижу, а число, результат странных вычислений...
-
ORA - 22905: Cannot access rows from a non-nested table item
-
ORA-22905 cannot access rows from a non-nested table item
Cause: An attempt was made to access rows of an item whose type is not known at parse time or that is not of a nested table type.
Action: Use CAST to cast the item to a nested table type.
Так и в таблице такой тип....
-
это связано с параметрами или нет???
-
ошибка возникает при использовании параметров... Ну по всякому уже и всеравно никак :(
-
>nnnicky (24.12.08 12:11)
[42]
SELECT *
FROM TABLE (cast(SVB_BLIZKO_NETTING.build_banknetting_list
( :NETTINGNUMBER,
:DATENETTING,
user
) as YourFunctionsType))
-
procedure TfmHBListBank.Set_DataSet(bActive : Boolean);
var iID : integer;
iData : STRING;
i : integer;
iSelectedCount : integer;
begin
iSelectedCount := fmHBBankNetting.gBaseDBtv.Controller.SelectedRecordCount;
if iSelectedCount < 1 then exit;
if iSelectedCount > 0 then
begin
for i := 0 to iSelectedCount -1 do
iID := fmHBBankNetting.gBaseDBtv.Controller.SelectedRecords[i].Values[fmHBBankNetting.g BaseDBtv.GetColumnByFieldName('ID').Index];
DSHB.ParamByName('NETTINGNUMBER').AsInteger := iID ;
end;
Параметры из другой таблицы... Нужно выбором строки из Grida их читать. Т.е. выбираем строку с параметрами, жмем кнопку и вызываем процедуру. Параметры не видит...
-
> nnnicky (25.12.08 16:16) [50]
оттестируй запрос с параметрами в pl/sql developer, потм будем с "выбором строки из Grida их читать" разбираться
-
> оттестируй запрос с параметрами в pl/sql developer, потм
> будем с "выбором строки из Grida их читать" разбираться
работает
-
тема открыта... работает в developer всего лишь... )