Mariusz Lustofin

Mariusz Lustofin Usługi Informatyczne
Mariusz Lustofin

Temat: [pl/sql] bulk collect into odwrotnie :)

Witam,

Problem jest następujący: generuje sobie string'a z pewnym zapytaniem. Zapytanie to może zawierać różną ilość pól do wyciągnięcia, ale zawsze tylko jeden rekord. I teraz chciałbym wyniki zwrócone przez takiego selecta wrzucić do kolekcji - taki bulk collect ale nie per wiersz tylko per kolumnę.

Problem jest prawdopodobnie banalny, ale 10h w pracy robi swoje:)

konto usunięte

Temat: [pl/sql] bulk collect into odwrotnie :)

Chyba pobladziles, wiec najpierw napisz co bys chcial z takim rekordem pozniej zrobic :)
Mariusz Lustofin

Mariusz Lustofin Usługi Informatyczne
Mariusz Lustofin

Temat: [pl/sql] bulk collect into odwrotnie :)

chciałbym po prostu załadować wynik poszczególnego pola do kolekcji. Najlepiej zobrazuje to chyba przykład:)

select a, b, c from dual; - zapytanie wraca jeden wiersz

w kolekcji chcę aby znalazły się wartości a,b,c jedna pod drugą - uwaga ważna jest kolejność w kolekcji!!

oczywiście mógłbym robić osobne zapytanie dla każdego wyciąganego pola albo coś w stylu
select a from dual
union
select b from dual

ale chcę żeby to było optymalnie i..ładnie:)

Cały problem polega na tym, że ten selecta jest składany dynamicznie i czasem może przybrać forme: select a from dual a czasem select a, b, c, d, ...z from dual.

konto usunięte

Temat: [pl/sql] bulk collect into odwrotnie :)

Możesz wyciagnąć dane tak:
select a ||','|| b ||','|| ... ||','|| z from dual
i użyć funkcji rozbijającej łańcuch (zobacz tu: http://www.techrepublic.com/article/oracle-tip-create-.... Ale to właśnie nie jest za ładne - łączysz łańcuchy, żeby zaraz potem je rozdzielać.

Jeśli zapytanie jest budowane dynamicznie, to "select .. union .. select .." jest najprostszym i najskuteczniejszym rozwiązaniem - wynik zapytania od razu ładujesz do kolekcji bez zbędnych przekształceń.

Swoją drogą takie pytanie sugeruje jakiś problem z modelem danych, więc warto byłoby się mu przyjrzeć, o ile oczywiście masz możliwość jakichś zmian tutaj.
Mariusz Lustofin

Mariusz Lustofin Usługi Informatyczne
Mariusz Lustofin

Temat: [pl/sql] bulk collect into odwrotnie :)

OK. Dzięki za pomoc. Rozwiąże mój problem unionami:). Model danych jest OK...problemem jest generyczność modułu który chcę zaimplementować. Czyli jak coś zrobić, żeby się nie narobić:)

Generalnie chodzi o opartą na DB linkach weryfikacją zgodności elementu słownikowego na pozostałych bazach. Przy czym tych słowników jest prawie 50 jedne proste ( bez dodatkowych relacji ) inne złożone. W skrócie plan mam taki, że generuje sobie dynamicznie SQLa wyciągającego element ( rekord ) słownika który chce weryfikować, następnie ładuje dane właśnie do tej kolekcji. Robię to na wszystkich bazach, a następnie iteruje po kolekcji i weryfikuje zgodność poszczególnych pól. W przypadku braku zgodności odkładam sobie SID bazy w celu późniejszej prezentacji użytkownikowi;)

konto usunięte

Temat: [pl/sql] bulk collect into odwrotnie :)

Mowilem, ze bladzisz :)
Do takich celow najlepiej skorzystac z widokow systemowych (all_tab_columns).
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: [pl/sql] bulk collect into odwrotnie :)

Jeśli masz Oracle 11g... to pozostaje kwestia obudowania zapytania, które dynamicznie generujesz z wykorzystaniem UNPIVOT.
http://www.orafaq.com/wiki/UNPIVOT

Jeśli masz wcześniejsze wersje metoda jest podana tutaj...
http://www.bobjankovsky.org/show.php?seq=97Łukasz Kurowski edytował(a) ten post dnia 15.02.11 o godzinie 07:56

Temat: [pl/sql] bulk collect into odwrotnie :)

select substr(:text,
        decode (rownum, 1, 1, instr(:text, ',', 1, (rownum - 1)) + 1),
        decode (instr(:text, ',', 1, (rownum)), 0, length(:text) + 1, instr(:text, ',', 1, (rownum)))
        - decode (rownum, 1, 1, instr(:text, ',', 1, (rownum - 1)) + 1)
       ) col1
 from dual
connect by rownum <= length(:text) - length(replace(:text, ',', null)) + 1

Zakładając, że znakiem rozdzielającym wartości jest przecinek (co chyba nie jest problemem).Wojciech T. edytował(a) ten post dnia 15.02.11 o godzinie 15:12

Następna dyskusja:

[MS SQL] INSERT INTO tab1 S...




Wyślij zaproszenie do