Форум: "Базы";
Текущий архив: 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.032 c