Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » DJopek 16:53
 » NimnuL 16:51
 » KHot 16:47
 » AfiP 16:45
 » NWN 16:45
 » XepeR 16:41
 » Kenny 16:40
 » Magnus 16:37
 » Saszkin 16:36
 » elliot_pl 16:31
 » Artaa 16:30
 » Sherif 16:30
 » soyo 16:30
 » hokr 16:17
 » PaKu 16:14
 » Tomasz 16:08
 » myszon 16:08
 » exmac 15:54
 » bajbusek 15:54
 » SebaSTS 15:52

 Dzisiaj przeczytano
 41148 postów,
 wczoraj 25974

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2024
A R C H I W A L N A   W I A D O M O Ś Ć
    

[PL/SQL] Jak zadeklarowac kursor, w ktorym czesc zapytanie bedzie konkatenacja stringow? , waski 2/06/08 19:27
Pytanie w zasadzie w temacie :)

Powiedzmy ze chce zadeklarowac kursor
CURSOR c IS
SELECT val1
from table
where val2 = 123
and sSQL;
gdzie sSQL to string zawierajacy dodatkowe warunki where do zapytania, ktore przekaze jako parametr dla kursora czy tez otrzymam przez wywolanie funkcji...

Jakby co baza to oracle (wersja 9 lub XE).

SNAFU
Situation Normal, All Fucked Up

  1. wydaje mi sie ze musisz uzyc typu REF CURSOR , HussaR 2/06/08 22:31
    i całe zapytanie musi być lancuchem znakow.

    W DECLARE:

    TYPE typ_kursora IS REF CURSOR;
    moj_kursor typ_kursora;
    ciag_znakow VARCHAR2 := 'SELECT * FROM tabela';

    W sekcji BEGIN END procedury:

    OPEN cursor_name FOR ciag_znakow;

    Największym marzeniem człowieka jest latać i nie
    spaść na ryj

  2. dokładnie w ten deseń, jak to napisał HussaR , bwana 3/06/08 14:56
    jest kilka innych sposobów (starszych i działających również na starszych wersjach bazy), ale ten jest na pewno ok dla 9, 10 i XE.

    A skoro zaczynasz się bawić kursorami, zainteresuj się operacjami BULK i konstruktem FORALL - odkryjesz znaczny wzrost wydajności pl/sql nad czystym sql-em.

    Dla przykładu wyimek z mojej ostatniej klepaniny (sprawozdawczość z kadr/płac do GUS):

    function bulk_insert_proc(p_source_view_name in t_db_table_name, p_target_table_name in t_db_table_name) return t_dm_long_string is
    l_chunk_size number := 10000;
    begin
    return
    '
    declare
    type t_data is table of '||p_target_table_name||'%rowtype;
    l_data t_data;
    cursor c_data is select * from '||p_source_view_name||';
    begin
    open c_data;
    loop
    fetch c_data BULK COLLECT INTO l_data LIMIT '||l_chunk_size||';
    FORALL i IN 1..l_data.COUNT
    INSERT INTO '||p_target_table_name||' VALUES l_data(i);
    EXIT WHEN c_data%NOTFOUND;
    commit;
    end loop;
    close c_data;
    commit;
    end;
    ';

    end;

    Funkcja zwraca kod procedury, która wczytuje do kolekcji porcjami wiersze z podanego źródła i wstawia je do docelowej tabeli. To co zwraca funkcja uruchamiam EXECUTE IMMEDIATE i mam bardzo wydajne wstawienia wierszy (z view do tabeli) dzięki czemu zbieranie danych do self-made warehouse'a znacznie przyspieszyło. Polecam podręczniki wyd. O'Reilly.

    "you don't need your smile when I cut
    your throat"

  3. dziekuje , waski 3/06/08 17:59
    obu Panom :)

    Ref cursor dziala ok a sugestie bwany moga sie przydac w przyszlosci :)

    SNAFU
    Situation Normal, All Fucked Up

    
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL