FB Domyslna wartosc parametru, nazwa tabeli w PSQL jako parametr

pyt Q

Czy da się zdefiniować domyślną wartość parametru wejściowego dla procedury składowanej? O tym nie wiem, tez by mi sie przydalo :-) Pytanie 2 Czy da się podać nazwę tabeli jako parametr tabeli i użyć jej później w zapytaniu?
Da sie, ale jest to metoda nieco niebezpieczna, ale sam ocen:
destructor.de/firebird/1.5/execute_statement.txt

Wynalazłem ;)
Przykład:
CREATE OR ALTER PROCEDURE FULLTREE ( separator varchar(32) = '\') ..
Czyli po prostu - znak równości i wartość. Można przypisać parametrom (wejściowym, rzecz jasna) jak i zmiennym lokalnym.
Chyba niebezpieczna jedynie z powodu debuggowania. Już mam działający zestaw procedur, żeby go nie powielać. Ale chyba nie wykorzystam, bo nie da się w prosty sposób zrobić z tego select w zapytaniach rekurencyjnych. Pewnie zamotałbym się ;) Chyba szybciej będzie mi napisać prosty generatorek procedur.
jh

odp A

Nooo FB obsługuje parametry domyślne w SP od wersji 2.x Korzystając z rekurencji w FB 2.1 Z rekurencji czy z CTE? zrobiłem sobie obsługę drzewiastej struktury z dodawaniem, wstawianiem, przesuwaniem, usuwaniem całej lub pojedynczej gałezi, odczytem "ścieżki" itd. w postaci procedur składowanych. Ponieważ w bazie taki struktur będę miał co najmniej kilka, A dlaczego kilka tabel zamiast jednej? Można; poczytaj o execute statement, od wersji 1.5.
Generalnie - RTFM! ;-)
Użytkownik "wloochacz" napisał w wiadomości
Ano właśnie, bo zagoogle'ałem zamiast zerknąć głębioej do PDFa.
CTE. Przy tabeli Tree z ID, Title (tu jako np. nazwa folderu), PARENTID mam tak:
CREATE TABLE TREE ( ID INTEGER NOT NULL, TITLE VARCHAR(128), PARENTID INTEGER DEFAULT 0 NOT NULL );
CREATE OR ALTER PROCEDURE GETTITLEPATH ( startid integer, separator varchar(32) = '\') returns ( titlepath varchar()) as declare variable s varchar() = ''; begin for WITH RECURSIVE mytree AS ( SELECT id, title, parentid FROM tree WHERE id = :startid
UNION ALL
SELECT t.id, t.title, t.parentid FROM tree t, mytree mt WHERE t.id = mt.parentid ) SELECT title FROM mytree into :s do titlepath = :s||:separator||:titlepath; suspend; end
Czy to jest "po ludzku"? W zasadzie można niby to zagnieździć jako podzapytanie, w którym robię select list(s, :separator). Ale nie sprawdzałem, co jest szybsze

W sumie można w jednej, tylko, w tej tabeli poza tymi trzema standardowymi polami (jw) mam inne, różne pola, które są istotne prze definiowaniu szczegółów. W sumie można zrobić w jednej plus pole identyfikujące typ danych i wydzielić tabelę z detalami dla każdego typu danych.

To racja ;) Nie lubię postaci elektronicznej, wolę drukowane, stąd częściej google są w użyciu, tyle, że trzeba wiedzieć jak nazwać to, czego się szuka. Właśnie wydrukowałem sobie całe Release Notes dla 2.1 ;)
Ale co do execute statement nie bardzo umiem to zrobić w podanej wyżej procedurze. Chodzi mi o użycie z "with recursive" podmieniając każdą część zapytania. W zasadzie można całe "with recursive" wygenerować. Odpuszczam ten sposób z nazwami tabel jako parametry, bo wymaga każdorazowego prepare co przy wywołaniach rekurencyjnych pewnie dosyć spowolni całość (podana wyżej procka jest wykorzystywania w CTE innej procedury).
jh
P.S. do wloochacza only - takie stare pytanie na delphi.bazy-danych było. ;)

odp A

CTE. Przy tabeli Tree z ID, Title (tu jako np. nazwa folderu), PARENTID mam tak:
CREATE TABLE TREE ( ID INTEGER NOT NULL, TITLE VARCHAR(128), PARENTID INTEGER DEFAULT 0 NOT NULL );
CREATE OR ALTER PROCEDURE GETTITLEPATH ( startid integer, separator varchar(32) = '\') returns ( titlepath varchar()) as declare variable s varchar() = ''; begin for WITH RECURSIVE mytree AS ( SELECT id, title, parentid FROM tree WHERE id = :startid
UNION ALL
SELECT t.id, t.title, t.parentid FROM tree t, mytree mt WHERE t.id = mt.parentid ) SELECT title FROM mytree into :s do titlepath = :s||:separator||:titlepath; suspend; end
Kurcze, patrze i nie kumam. Na czym polega to CTE w prostych, "ludzkich" ;-) slowach? W docu od FB jest to jeszcze bardziej zamotane.
pozdrawiam Norbert

odp A

Kurcze, patrze i nie kumam. Na czym polega to CTE w prostych, "ludzkich" ;-) slowach? W docu od FB jest to jeszcze bardziej zamotane.

Może nie fachowo wytłumaczę - bardzo przepraszam wszystkich pro, ale w bardzo luźnym tłumaczeniu amatora wygląda to tak: CTE to taka "chwilowa" tabela, do której w odróżnieniu od podzapytania można odwoływać się wielokrotnie, i która pozwala na zapytania rekurencyjne. Można więc odczytywac strukture hierarchiczną korzystając z tabel relacyjnych. Zamiast wywoływać rekurencyjnie procedurę składowaną, co na pewno bardziej zżera zasoby odwołuję się rekurencyjnie do tej właśnie "chwilowej" tabeli.
jh

Dodaj odpowiedź

Tytuł:

Mail: (w celu weryfikacji posta)