[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
Thread - 08-08-2007 00:03
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
Witam! Proszę o pomoc w takiej sprawie.
Mam tabele, np: CREATE TABLE "MY_TABLE2" ( "OPIS" VARCHAR2(200), "WARTOSC" NUMBER(2) ) z danymi: VALUES ('Trzeci wpis w tab2', 3) VALUES ('Drugi wpis w tab2', 2) VALUES ('Pierwszy wpis w tab2', 1)
CREATE TABLE "MY_TABLE1" ( "KOMENTARZ" VARCHAR2(200), "WARTOSC" NUMBER(2) ) z danymi: VALUES ('Czwarty wpis w tabeli1', 4) VALUES ('Trzeci wpis w tabeli1', 3) VALUES ('Drugi wpis w tabeli1', 2) VALUES ('Pierwszy wpis w tabeli1', 1)
oraz tabele przejścia: CREATE TABLE "TAB_PRZEJSCIA" ( "NAZWA_TABELI" VARCHAR2(40), "WARTOSC" NUMBER(2), "STATUS" NUMBER(2) ) z danymi: VALUES ('my_table2', 3, 4) VALUES ('my_table2', 1, 4) VALUES ('my_table1', 4, 2) VALUES ('my_table1', 3, 2)
Teraz potrzebuję napisać funkcję w PL/SQLu "pobierz_dane()" (z zapytaniem dynamicznym), która pobierze dane z np. "opis/komentarz" oraz "wartosc" najlepiej w postaci jakiegoś kursora. Nagłówek funkcji ma być uzależniony od nazwy tabeli i statusu.
Przykład: Dla wywołania funkcji "pobierz_dane(nazwa_mojej_tabeli varchar2, moj_status number)" z parametrami aktualnymi ("my_table2", 4) jako rezultat funkcja zwróci: "Pierwszy wpis w tab2", 1 "Trzeci wpis w tab2", 3
Bardzo wersja robocza zapytania wygląda mniej więcej: select my_tab.komentarz/my_tab.opis, tab_prz.wartosc from "nazwa_mojej_tabeli" my_tab inner join tab_przejscia tab_prz on my_tab.wartosc = tab_prz.wartosc where tab_prz.status = "moj_status" and tab_prz.nazwa_tabeli = "nazwa_mojej_tabeli"
Prawdopodobnie należy użyć EXECUTE IMMEDIATE. Mam problem z napisaniem odpowiedniego selecta i zapakowanie tych danych do kursora. Da się coś takiego stworzyć?
Pozdrawiam, Thread -- ..:: Thread ..:: Andrzej Kłopotowski ..:: thread{at}o2{bez_tego}{dot}pl
dap - 17-08-2007 00:01
Hej,
A co chcesz osiągnąć? Oracle posiada bardzo duże wbudowane możliwości tworzenia dynamicznych zapytań, ale nie zawsze jest to zalecane.
dap
Thread - 17-08-2007 00:01
dap pisze: > Hej, hej
> > A co chcesz osiągnąć? Oracle posiada bardzo duże wbudowane możliwości > tworzenia dynamicznych zapytań, ale nie zawsze jest to zalecane.
Dzięki, że się odezwałeś.
Tak, wiem, że nie zawsze są zalecane. Sam się zastanawiałem, czy się w to pchać, ale chciałem zobaczyć przynajmniej czy da się takie coś zrobić.
Chodzi o to, że mam różne tabele słownikowe: MY_TABLE2, MY_TABLE1, gdzie jest jakieś ID (w tym przypadku podałem "wartosc") oraz jakiś opis: OPIS, KOMENTARZ (celowo podałem różne nazwy, bo tak faktycznie jest teraz zrobione). Teraz potrzebuję zrobić, aby tylko niektóre pola z tabeli słownikowej były pobierane. Dlatego chciałem zrobić tabele TAB_PRZEJSCIA, gdzie byłby robiony taki "szacher macher". Jak widać w tej tabeli jest nazwa tabeli z której mają być brane dane oraz konkretne wartości z tej tabeli. Czyli tak jak podałem we wcześniejszym przykładzie dla pobierz_dane( "my_table1", dla_okreslonego_statusu ) funkcja dynamicznie wyplułaby odpowiednie wartości. Oczywiście tabele w słowniku nie mogą się zmienić. Mam nadzieję, że dość jasno swój pomysł przedstawiłem;)
Do wszystkich krytykantów: Wiem, że istnieją inne sposoby, aby coś takiego osiągnąć, np. robić taką tabelę przejścia oddzielnie dla każdej tabeli: "my_table1", "my_table2" lub dodać dodatkowe pole do tych table z informacją czy wyświetlać dany rekord czy nie. Pewnie jeszcze inne rozwiązania też by się znalazły. W sumie jestem otwarty na dobre propozycje. Jednak myślę, że mając taką jedną tabelę i sprytną funkcję byłoby bardzo przyjemnie administrować wyświetlaniem wartości słowników.
> > dap
Pozdrawiam, Thread -- ..:: Thread ..:: Andrzej Kłopotowski ..:: thread{at}o2{bez_tego}{dot}pl
Thomas Olszewicki - 17-08-2007 00:01
=?iso-8859-2?q?Re:_zapytanie_dynamiczne_z_=22dynamiczn=B1_naz w=B1_tabeli=22?=
On Aug 7, 6:08 pm, Thread <thread@{wycinanka}o2.pl> wrote: > Witam! > Proszę o pomoc w takiej sprawie. > > Mam tabele, np: > CREATE TABLE "MY_TABLE2" > ( "OPIS" VARCHAR2(200), > "WARTOSC" NUMBER(2) > ) > z danymi: > VALUES ('Trzeci wpis w tab2', 3) > VALUES ('Drugi wpis w tab2', 2) > VALUES ('Pierwszy wpis w tab2', 1) > > CREATE TABLE "MY_TABLE1" > ( "KOMENTARZ" VARCHAR2(200), > "WARTOSC" NUMBER(2) > ) > z danymi: > VALUES ('Czwarty wpis w tabeli1', 4) > VALUES ('Trzeci wpis w tabeli1', 3) > VALUES ('Drugi wpis w tabeli1', 2) > VALUES ('Pierwszy wpis w tabeli1', 1) > > oraz tabele przejścia: > CREATE TABLE "TAB_PRZEJSCIA" > ( "NAZWA_TABELI" VARCHAR2(40), > "WARTOSC" NUMBER(2), > "STATUS" NUMBER(2) > ) > z danymi: > VALUES ('my_table2', 3, 4) > VALUES ('my_table2', 1, 4) > VALUES ('my_table1', 4, 2) > VALUES ('my_table1', 3, 2) > > Teraz potrzebuję napisać funkcję w PL/SQLu "pobierz_dane()" (z > zapytaniem dynamicznym), która pobierze dane z np. "opis/komentarz" oraz > "wartosc" najlepiej w postaci jakiegoś kursora. Nagłówek funkcji mabyć > uzależniony od nazwy tabeli i statusu. > > Przykład: Dla wywołania funkcji "pobierz_dane(nazwa_mojej_tabeli > varchar2, moj_status number)" z parametrami aktualnymi ("my_table2", 4) > jako rezultat funkcja zwróci: > "Pierwszy wpis w tab2", 1 > "Trzeci wpis w tab2", 3 > > Bardzo wersja robocza zapytania wygląda mniej więcej: > select my_tab.komentarz/my_tab.opis, tab_prz.wartosc from > "nazwa_mojej_tabeli" my_tab > inner join tab_przejscia tab_prz on my_tab.wartosc = tab_prz.wartosc > where tab_prz.status = "moj_status" > and tab_prz.nazwa_tabeli = "nazwa_mojej_tabeli" > > Prawdopodobnie należy użyć EXECUTE IMMEDIATE. Mam problem z napisaniem > odpowiedniego selecta i zapakowanie tych danych do kursora. > Da się coś takiego stworzyć? > > Pozdrawiam, > Thread > -- > .:: Thread > .:: Andrzej Kłopotowski > .:: thread{at}o2{bez_tego}{dot}pl
Do tworzenia dynamicznych SELECT w PL/SQL uzyj syntax: .... cStmt VARCHAR2(40) := 'SELECT * FROM '; cTable VARCHAR2(40) := 'MYTABLE'; cWhere VARCHAR2(50) := ' WHERE MyCol=:1'; curCursor SYS_REFCURSOR; .... OPEN curCursor FOR cStmt||cTable||cWhere USING 20; FETCH ... lub BULK COLLECT... CLOSE curCursor; Zobacz : http://download.oracle.com/docs/cd/B...htm#sthref1550
HTH Thomas
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle 19g +Insert +Insert +Insert...
MSSQL Express czy Oracle Express
[Oracle, Toad] Zaladowanie obiektu w TOAD
[Oracle][Reports30] 10G nie dziala razem z Reports3.0
[Oracle] catalog.sql i catproc.sql - bledy
klient oracle (zmiana domyslna klienta oracla)
[oracle] [xml] XML na bazie istniejacej struktury ?
[Oracle] W jaki sposób skopiować całą zawartość schemy jednego użytkownika do nowo utworzonego użytkownika?
klient Oracle 10g SE a Windows 98 SE
Oracle Standard Edition One - czym sie rozni od wersji standard iexpress?
zanotowane.pldoc.pisz.plpdf.pisz.plmorebeer.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|