ďťż
 
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?= ďťż
 
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • morebeer.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com