Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];

Вниз

Вернуть данные из процедуры Oracle в dbgrid Delphi   Найти похожие ветки 

 
Серж   (2004-01-14 10:21) [0]

ПроцеДура Oracle из нескольких таблиц динамическим SQL (DBMS) составляет строку,

все это делается в цикле. Делаю возврат в dbgrid через "Open Cursor For Select

p1, p2...pn From Dual;". Проблема: в DBgrid возвращается только одна последняя

строка, как достать остальные (может другие способы решения)? Используем: Delphi 6, Odac 4.10.


 
Vlad   (2004-01-14 10:36) [1]

Для этого используй Ref Cursor


 
Серж   (2004-01-14 11:03) [2]

Ref Cursor? Так его и использую! Плиз Подробнее можно??


 
Sergey13   (2004-01-14 11:25) [3]

А какой Оракл? То что это вообще отрабатывает "Open Cursor For Select p1, p2...pn From Dual;" для меня новость. Я через DOA работаю. Там по другому. Сторедпроцедуре надо дать выходной парамет типа РефКурсор и именное его в грид выводить.


 
Vlad   (2004-01-14 11:28) [4]

Ну если используешь, то чего подробнее то ?
В спецификации пакета объявляешь тип:
TYPE TRefCursor is Ref Cursor;
В Body пишешь функцию:
FUNCTION MyFunc(<параметры>) RETURN TRefCursor IS
fResult TRefCursor;
BEGIN
OPEN fResult FOR SELECT ......
RETURN fResult;
END;


На клиенте делаешь запрос(в Query или что ты там используешь):

begin
:c:=MyFunc(<параметры>);
end;

Где :c - Bind-переменная типа cursor


 
Серж   (2004-01-14 14:04) [5]

Ещё раз
В теле такая функция. Нужно в DBGride получить обе строчки. Получаем одну первую.
Как получить обе????

FUNCTION MyFunc
RETURN MyCur IS fResult MyCur;
p1 NUMBER ;
p2 NUMBER ;
BEGIN
FOR j IN 1..2 LOOP
IF j=1 THEN p1:=150; p2:=250;
ELSIF j=2 THEN p1:=180; p2:=280;
END IF;

OPEN fResult FOR SELECT p1, p2 FROM dual;

RETURN fResult;
END LOOP;
END;

На клиенте OraStoredProc;


 
Vlad   (2004-01-14 14:18) [6]


> Серж (14.01.04 14:04) [5]

зачем open засунул в цикл ? Смысл ?

>Получаем одну первую.
сколько строчек в таблице dual ? :-)

Почему бы тебе не сделать UNION ?


 
roottim   (2004-01-14 14:19) [7]

я бы это только с большого бодуна смог написать.. :-)


 
roottim   (2004-01-14 14:25) [8]

>ПроцеДура Oracle из нескольких таблиц динамическим SQL (DBMS) составляет строку
лучше приведите реальный код...


 
Серж   (2004-01-14 14:33) [9]

В dual одна. Open из цикла можно вынуть и что?
Если не лень то пример плиз...-).
Полученую строчку перегнать в DBGrid


 
Vlad   (2004-01-14 14:38) [10]

open fResult for
select 150 as A, 250 as B from dual
union
select 180 as A, 280 as B from dual


 
Серж   (2004-01-14 14:39) [11]

Реальный код полученные строки нужно получить в DBGride

PROCEDURE Provod (CurVoz OUT MyCur) IS
v_CursorID INTEGER;
v_NumRows INTEGER;
v_Stroka VARCHAR2(200);
v_StrokaTab1 VARCHAR2(200);
p_id BUH_PROVODKI.ID%TYPE;
p_data BUH_PROVODKI.data%TYPE;
p_debit BUH_PROVODKI.debit%TYPE;
p_d_subs1 BUH_PROVODKI.d_subs1%TYPE;
p_d_subs2 BUH_PROVODKI.d_subs2%TYPE;
p_d_subk BUH_PROVODKI.d_subk1%TYPE;
p_d_subk1 BUH_PROVODKI.d_subk1%TYPE;
p_d_subk2 BUH_PROVODKI.d_subk2%TYPE;
p_d_subk3 BUH_PROVODKI.d_subk3%TYPE;

p_ImaTab BUH_SPRAVKI.SPRAV%TYPE;
p_ImaTab1 BUH_SPRAVKI.SPRAV%TYPE;
p_ImaTab2 BUH_SPRAVKI.SPRAV%TYPE;
p_ImaTab3 BUH_SPRAVKI.SPRAV%TYPE;
p_subk1_bills BUH_BILLS.SUBK1%TYPE;
p_subk2_bills BUH_BILLS.SUBK2%TYPE;
p_subk3_bills BUH_BILLS.SUBK3%TYPE;
p_name VARCHAR2(100);
p_name1 VARCHAR2(100);
p_name2 VARCHAR2(100);
p_name3 VARCHAR2(100);

BEGIN

v_CursorID :=DBMS_SQL.OPEN_CURSOR;
v_Stroka:= "SELECT id, data, debit, d_subs1, d_subs2, d_subk1, d_subk2, d_subk3 FROM BUH_PROVODKI" ;
DBMS_SQL.parse(v_CursorID, v_Stroka, dbms_sql.v7);
dbms_sql.define_column(v_CursorID, 1, p_id) ;
dbms_sql.define_column(v_CursorID, 2, p_data) ;
dbms_sql.define_column(v_CursorID, 3, p_debit, 5) ;
dbms_sql.define_column(v_CursorID, 4, p_d_subs1, 2);
dbms_sql.define_column(v_CursorID, 5, p_d_subs2, 2);
dbms_sql.define_column(v_CursorID, 6, p_d_subk1);
dbms_sql.define_column(v_CursorID, 7, p_d_subk2);
dbms_sql.define_column(v_CursorID, 8, p_d_subk3);
v_NumRows :=DBMS_SQL.EXECUTE(v_cursorID);
LOOP
IF DBMS_SQL.FETCH_ROWS(v_CursorID) =0 THEN
-- CLOSE CurVoz;
EXIT;
END IF;
dbms_sql.column_value(v_CursorID, 1, p_id) ;
dbms_sql.column_value(v_CursorID, 2, p_data) ;
dbms_sql.column_value(v_CursorID, 3, p_debit) ;
dbms_sql.column_value(v_CursorID, 4, p_d_subs1);
dbms_sql.column_value(v_CursorID, 5, p_d_subs2);
dbms_sql.column_value(v_CursorID, 6, p_d_subk1);
dbms_sql.column_value(v_CursorID, 7, p_d_subk2);
dbms_sql.column_value(v_CursorID, 8, p_d_subk3);


DECLARE
v_CurID INTEGER;
v_NumRows2 INTEGER;
CURSOR TabBills IS
SELECT BUH_BILLS.SUBK1, BUH_BILLS.SUBK2, BUH_BILLS.SUBK3 FROM BUH_BILLS WHERE BUH_BILLS.BILL=p_debit AND BUH_BILLS.subs1=p_d_subs1 AND BUH_BILLS.subs2=p_d_subs2 ;
CURSOR TabSpravki1 IS
SELECT BUH_SPRAVKI.SPRAV FROM BUH_SPRAVKI WHERE BUH_SPRAVKI.ID=p_subk1_bills;
CURSOR TabSpravki2 IS
SELECT BUH_SPRAVKI.SPRAV FROM BUH_SPRAVKI WHERE BUH_SPRAVKI.ID=p_subk2_bills;
CURSOR TabSpravki3 IS
SELECT BUH_SPRAVKI.SPRAV FROM BUH_SPRAVKI WHERE BUH_SPRAVKI.ID=p_subk3_bills;
BEGIN
OPEN TabBills;
FETCH TabBills INTO p_subk1_bills, p_subk2_bills, p_subk3_bills;
CLOSE TabBills;

OPEN TabSpravki1;
FETCH TabSpravki1 INTO p_ImaTab1;
CLOSE TabSpravki1;

OPEN TabSpravki2;
FETCH TabSpravki2 INTO p_ImaTab2;
CLOSE TabSpravki2;

OPEN TabSpravki3;
FETCH TabSpravki3 INTO p_ImaTab2;
CLOSE TabSpravki3;

v_CurID :=DBMS_SQL.OPEN_CURSOR;

FOR j IN 1..3 LOOP
IF j=1 THEN p_ImaTab:=p_ImaTab1; p_d_subk:=p_d_subk1;
ELSIF j=2 THEN p_ImaTab:=p_ImaTab2; p_d_subk:=p_d_subk2;
ELSIF j=3 THEN p_ImaTab:=p_ImaTab3; p_d_subk:=p_d_subk3;
END IF;

v_StrokaTab1:="SELECT name FROM " || p_ImaTab || " WHERE id=" || p_d_subk;
DBMS_SQL.parse(v_CurID, v_StrokaTab1, dbms_sql.v7);
dbms_sql.define_column(v_CurID, 1, p_name, 100) ;
v_NumRows2 :=DBMS_SQL.EXECUTE(v_CurID);
IF DBMS_SQL.FETCH_ROWS(v_CurID) != 0 THEN
dbms_sql.column_value(v_CurID, 1, p_name) ;
END IF;
IF j=1 THEN p_name1:=p_name;
ELSIF j=2 THEN p_name2:=p_name;
ELSIF j=3 THEN p_name3:=p_name;
END IF;
END LOOP;

DBMS_SQL.CLOSE_CURSOR(v_CurID);
EXCEPTION
WHEN OTHERS THEN
DBMS_SQL.CLOSE_CURSOR(v_CurID);
END;

OPEN CurVoz FOR SELECT p_id, p_data, p_debit, p_d_subs1, p_d_subs2, p_name1, p_name2, p_name3 FROM dual;

END LOOP;
DBMS_SQL.CLOSE_CURSOR(v_CursorID);
EXCEPTION
WHEN OTHERS THEN
DBMS_SQL.CLOSE_CURSOR(v_CursorID);
-- RAISE;
CLOSE CurVoz;
END Provod;


 
Серж   (2004-01-14 14:39) [12]

Реальный код полученные строки нужно получить в DBGride

PROCEDURE Provod (CurVoz OUT MyCur) IS
v_CursorID INTEGER;
v_NumRows INTEGER;
v_Stroka VARCHAR2(200);
v_StrokaTab1 VARCHAR2(200);
p_id BUH_PROVODKI.ID%TYPE;
p_data BUH_PROVODKI.data%TYPE;
p_debit BUH_PROVODKI.debit%TYPE;
p_d_subs1 BUH_PROVODKI.d_subs1%TYPE;
p_d_subs2 BUH_PROVODKI.d_subs2%TYPE;
p_d_subk BUH_PROVODKI.d_subk1%TYPE;
p_d_subk1 BUH_PROVODKI.d_subk1%TYPE;
p_d_subk2 BUH_PROVODKI.d_subk2%TYPE;
p_d_subk3 BUH_PROVODKI.d_subk3%TYPE;

p_ImaTab BUH_SPRAVKI.SPRAV%TYPE;
p_ImaTab1 BUH_SPRAVKI.SPRAV%TYPE;
p_ImaTab2 BUH_SPRAVKI.SPRAV%TYPE;
p_ImaTab3 BUH_SPRAVKI.SPRAV%TYPE;
p_subk1_bills BUH_BILLS.SUBK1%TYPE;
p_subk2_bills BUH_BILLS.SUBK2%TYPE;
p_subk3_bills BUH_BILLS.SUBK3%TYPE;
p_name VARCHAR2(100);
p_name1 VARCHAR2(100);
p_name2 VARCHAR2(100);
p_name3 VARCHAR2(100);

BEGIN

v_CursorID :=DBMS_SQL.OPEN_CURSOR;
v_Stroka:= "SELECT id, data, debit, d_subs1, d_subs2, d_subk1, d_subk2, d_subk3 FROM BUH_PROVODKI" ;
DBMS_SQL.parse(v_CursorID, v_Stroka, dbms_sql.v7);
dbms_sql.define_column(v_CursorID, 1, p_id) ;
dbms_sql.define_column(v_CursorID, 2, p_data) ;
dbms_sql.define_column(v_CursorID, 3, p_debit, 5) ;
dbms_sql.define_column(v_CursorID, 4, p_d_subs1, 2);
dbms_sql.define_column(v_CursorID, 5, p_d_subs2, 2);
dbms_sql.define_column(v_CursorID, 6, p_d_subk1);
dbms_sql.define_column(v_CursorID, 7, p_d_subk2);
dbms_sql.define_column(v_CursorID, 8, p_d_subk3);
v_NumRows :=DBMS_SQL.EXECUTE(v_cursorID);
LOOP
IF DBMS_SQL.FETCH_ROWS(v_CursorID) =0 THEN
-- CLOSE CurVoz;
EXIT;
END IF;
dbms_sql.column_value(v_CursorID, 1, p_id) ;
dbms_sql.column_value(v_CursorID, 2, p_data) ;
dbms_sql.column_value(v_CursorID, 3, p_debit) ;
dbms_sql.column_value(v_CursorID, 4, p_d_subs1);
dbms_sql.column_value(v_CursorID, 5, p_d_subs2);
dbms_sql.column_value(v_CursorID, 6, p_d_subk1);
dbms_sql.column_value(v_CursorID, 7, p_d_subk2);
dbms_sql.column_value(v_CursorID, 8, p_d_subk3);


DECLARE
v_CurID INTEGER;
v_NumRows2 INTEGER;
CURSOR TabBills IS
SELECT BUH_BILLS.SUBK1, BUH_BILLS.SUBK2, BUH_BILLS.SUBK3 FROM BUH_BILLS WHERE BUH_BILLS.BILL=p_debit AND BUH_BILLS.subs1=p_d_subs1 AND BUH_BILLS.subs2=p_d_subs2 ;
CURSOR TabSpravki1 IS
SELECT BUH_SPRAVKI.SPRAV FROM BUH_SPRAVKI WHERE BUH_SPRAVKI.ID=p_subk1_bills;
CURSOR TabSpravki2 IS
SELECT BUH_SPRAVKI.SPRAV FROM BUH_SPRAVKI WHERE BUH_SPRAVKI.ID=p_subk2_bills;
CURSOR TabSpravki3 IS
SELECT BUH_SPRAVKI.SPRAV FROM BUH_SPRAVKI WHERE BUH_SPRAVKI.ID=p_subk3_bills;
BEGIN
OPEN TabBills;
FETCH TabBills INTO p_subk1_bills, p_subk2_bills, p_subk3_bills;
CLOSE TabBills;

OPEN TabSpravki1;
FETCH TabSpravki1 INTO p_ImaTab1;
CLOSE TabSpravki1;

OPEN TabSpravki2;
FETCH TabSpravki2 INTO p_ImaTab2;
CLOSE TabSpravki2;

OPEN TabSpravki3;
FETCH TabSpravki3 INTO p_ImaTab2;
CLOSE TabSpravki3;

v_CurID :=DBMS_SQL.OPEN_CURSOR;

FOR j IN 1..3 LOOP
IF j=1 THEN p_ImaTab:=p_ImaTab1; p_d_subk:=p_d_subk1;
ELSIF j=2 THEN p_ImaTab:=p_ImaTab2; p_d_subk:=p_d_subk2;
ELSIF j=3 THEN p_ImaTab:=p_ImaTab3; p_d_subk:=p_d_subk3;
END IF;

v_StrokaTab1:="SELECT name FROM " || p_ImaTab || " WHERE id=" || p_d_subk;
DBMS_SQL.parse(v_CurID, v_StrokaTab1, dbms_sql.v7);
dbms_sql.define_column(v_CurID, 1, p_name, 100) ;
v_NumRows2 :=DBMS_SQL.EXECUTE(v_CurID);
IF DBMS_SQL.FETCH_ROWS(v_CurID) != 0 THEN
dbms_sql.column_value(v_CurID, 1, p_name) ;
END IF;
IF j=1 THEN p_name1:=p_name;
ELSIF j=2 THEN p_name2:=p_name;
ELSIF j=3 THEN p_name3:=p_name;
END IF;
END LOOP;

DBMS_SQL.CLOSE_CURSOR(v_CurID);
EXCEPTION
WHEN OTHERS THEN
DBMS_SQL.CLOSE_CURSOR(v_CurID);
END;

OPEN CurVoz FOR SELECT p_id, p_data, p_debit, p_d_subs1, p_d_subs2, p_name1, p_name2, p_name3 FROM dual;

END LOOP;
DBMS_SQL.CLOSE_CURSOR(v_CursorID);
EXCEPTION
WHEN OTHERS THEN
DBMS_SQL.CLOSE_CURSOR(v_CursorID);
-- RAISE;
CLOSE CurVoz;
END Provod;


 
roottim   (2004-01-15 13:35) [13]

естественно ничего не проверял, но вот что мне видится...

доп-я процедура
FUNCTION GET_SPRAV_NAME(P_TNAME IN VARCHAR2, P_DSUBK IN NUMBER) RETURN VARCHAR2
IS
RESULT VARCHAR2(300);
BEGIN
-- В 9.2 Я СДЕЛАЛ ТАК, ЕСЛИ У ВАС 7, ТО ИСПРЛЬЗУЙТЕ DBMS_SQL КАК ОБЫЧНО
EXECUTE IMMEDIATE "SELECT NAME FROM "||P_TNAME||" WHERE ID="||P_DSUBK INTO RESULT;
RETURN RESULT;
EXCEPTION
WHEN OTHERS THEN RETURN "NO NAME";
END;


примерно запрос будет выглядеть так
SELECT
BP.ID,
BP.DATA,
BP.DEBIT,
BP.D_SUBS1,
BP.D_SUBS2,
GET_SPRAV_NAME
(
SELECT BUH_SPRAVKI.SPRAV FROM BUH_SPRAVKI WHERE BUH_SPRAVKI.ID = BB.SUBK1,
BP.D_SUBK1
) NAME1,
GET_SPRAV_NAME
(
SELECT BUH_SPRAVKI.SPRAV FROM BUH_SPRAVKI WHERE BUH_SPRAVKI.ID = BB.SUBK2,
BP.D_SUBK2
) NAME2,
GET_SPRAV_NAME
(
SELECT BUH_SPRAVKI.SPRAV FROM BUH_SPRAVKI WHERE BUH_SPRAVKI.ID = BB.SUBK3,
BP.D_SUBK3
) NAME3,
FROM
BUH_PROVODKI BP,
BUH_BILLS BB
WHERE
BB.BILL = BP.DEBIT
AND BB.SUBS1 = BP.D_SUBS1
AND BB.SUBS2 = BP.D_SUBS2



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.031 c
14-16624
Andersen
2004-01-14 12:10
2004.02.06
Чудеса да и только


14-16589
syte_ser78
2004-01-15 15:11
2004.02.06
Удаление файла досовскими командами


8-16531
Sapersky
2003-10-01 13:19
2004.02.06
Запихнуть комментарий в JPEG


14-16598
RealRascal
2003-12-21 10:05
2004.02.06
Аномальная перезагрузка


14-16669
syte_ser78
2004-01-17 15:03
2004.02.06
Siemens A50





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский