Aby to byl skutecny prepared statement (a ne jeho "emulace" na klientovi), tak to musi fungovat na strane serveru. Tj. serveru se posle template, on si ho naparsuje, udela query plan ad. a pak se do nej uz posilaji jen hodnoty.
Pokud to nejde (at uz na strane klientske knihovny nebo serveru), tak se da podobneho vysledku dosahnout pomoci stored procedury (v podstate obaleny dotaz) za cenu vice rucni prace.
Ne. Stored procedure je kód uložený na serveru, je to imperativní kód (posloupnost příkazů), a není v SQL, ale buď v nějakém jazyku podobném SQL, rozšířením pro potřeby psaní imperativího kódu – např. Pl/SQL. Nebo mohou být psané i v jiných jazycích, třeba Python nebo Java. Prepared statement je normální SQL příkaz (třeba SELECT), který se jenom rozparsuje a připraví předem a pak se může volat opakovaně, většinou s různými parametry (předanými hodnotami).
Ne, kód procedury je naprosto to samé "čisté" SQL, ve kterém se v PostgreSQL píše "přímo".
Není to žádné "rozšíření" postgresího SQL jazyka alá PL/pgSQL - teda kromě placeholderů za parametry, což je ale právě to, co to dělá hodně příbuzné k prepared statements.
Jo, striktně ve standardu SQL to není, ale ve standardu SQL není co vím specifikován jazyk uložených procedur vůbec, ani žádný ze SQL dialektů v libovolné databázi neodpovídá žádnému SQL standardu, takže v tomto ohledu by bylo rozšíření SQL vše. Naopak postgresí SQL je z množství SQL dialektů jeden z těch, co se standardu drží co možná nejvíce.
Definice uložených procedur JE součástí SQL standardu, konkrétně featura T-321 SQL 1999, a to dokonce přímo "Core SQL"....
Takže ano, rozumím Ti . Snažíš se svoje předchozí vyjádření překroutit, abys nemusel uznat omyl
- ale - protože evidentně toho o SQL procedurách zas tolik nevíš - tak do toho jen víc zbředáváš :-)
PS: Sorry za sarkastický tón, ale naběh sis...
Když chcete být puntičkář, měl byste být důsledný a netvářit se, že kód (implementace) procedury, celá procedura a definice procedur ve standardu je jedno a to samé. Jinak se klidně můžeme dohadovat, zda
CREATE PROCEDURE select_data() LANGUAGE SQL AS $$ SELECT * FROM tbl; $$;
je SQL dle standardu, ale dohadujte se beze mne.
Snažíš, se vybruslit, snažíš..... Až na to, že původně jsme se bavili o SQL a ty jsi tvrdil, že se v SQL vůbec procedury nepíšou, následně pak že SQL procedury je nějaké rozšíření. Co tvrdíš vlastně teď jsem z Tvého postu odhalit nedokázal, evidentně jsi se poučil a radši nepíšeš nic konkrétního, aby Ti to zas nebylo vyvráceno.
Pravda, že zrovna zápis SQL procedur v Postgresu není 100% konformní se SQL standardem, ale to není v podstatě žádný SQL dialekt: To bys pak musel tvrdit, že se v reálu nikde nepíše v SQL, protože každá implementace SQL má nějaké nestandardnosti.
Prostě postgresql je dialekt SQL a SQL funkce do něj naprosto inherentně patří, stejně jako patří do standardu SQL, takže Tvé (implicitní) tvrzení, že se v SQL nepíšou uložené procedury bylo blbina, stejně jako byla nepravda, že je to nějaké rozšíření SQL.
A to, že místo uznání, jo, to jsem nevěděl, sorry, se z toho snažíš takhle slovíčkařením vybrušovat, když už jsi do toho zabrušoval.... To je tvoje vizitka, ne moje.
Už to chápu, vy jenom špatně čtete. Já jsem nepsal, že se v SQL vůbec procedury nepíšou, napsal jsem, že se nepíšou v (čistém) SQL, ale mohou být v jazyce podobném SQL. Například jazyk, který vezme z SQL některé konstrukce (a jiné zakáže), je jazyk podobný SQL. Ale uznávám, že se to dá nazvat i tak, že je to SQL, akorát si prostě použití v uložených procedurách vyžádá nějaká omezení. Že „SQL procedury je nějaké rozšíření“ jsem také nepsal. Příklad kódu mi připadá dost konkrétní. Howgh.
Standard SQL, dokonce i v nejužší "core standard" definuje SQL funkce, které nazývá SQL funkce. Takže podle Tebe standard SQL definuje jazyk podobný SQL a mylně ho nazývá SQL? Nebo jak to mám chápat?
Tvůj názor je podobně "divnej", jako kdybys tvrdil, že funkce v Cčku nejsou napsané v Cčku, protože uvnitř funkcí Cčka nemůžeš použít veškeré konstrukce Cčka.....
Tady máš odkaz na gramatiku SQL 1999, kde jsou SQL uložené procedury definované:
https://ronsavage.github.io/SQL/sql-99.bnf.html
To je samozřejmě nesmysl. Nevím, co myslíte čistým SQLkem - patrně jeho relační část . Důvodem existence uložených procedur je rozšíření funkcionality volané na serveru o procedurální kód - a pokud bych vzal nejrozšířenější Oracle syntax, tak do těch 99% to bude hodně daleko. Příkaz CALL, kterým se uložené procedury spouštěly dlouho nebyl částí SQL - a asi bych lehko spočítal lidi v republice, kteří vědí o SQL/PSM.
Ano, svým způsobem jde o totéž. V obou případech je v databázi oddělená fáze přípravy prováděcího plánu a fáze samotného provedení.
Prepared statement se vytváří v SQL jazyce SQL příkazem PREPARE a spouští se SQL příkazem EXECUTE. Připravený dotaz můžete spustit opakovaně. Díky chybějící fázi přípravy prováděcího plánu tak může být při opakovaném volání dotaz vyvolaný příkazem EXECUTE rychlejší.
Stored procedure se liší způsobem vytvoření, použitým jazykem a způsobem vyvolání.
U rozumné databáze jde prostředky databáze samotné a neměl by na to mít vliv aplikační jazyk.
Prepared statements - předpřipravené dotazy - je technologie, která původně umožňovala (a umožňuje dodnes) redukovat režii optimalizátoru. SQL příkaz si můžete představit jako zdrojový kód programu ze kterého se generuje strojový kód. Je tam celá řada optimalizací - kde se mají použít indexy, v jakém pořadí se mají spojovat relace, jaké se mají použít algoritmy pro spojování relací, agregaci, .. Výsledkem práce kompilátoru je strojový kód - výsledkem práce SQL optimalizátoru je prováděcí plán dotazu.
U komerčních databází se implicitně ukládá do plan cache. U open source databází se po vykonání zahazuje. Opakované použití plánu si lze vynutit vytvořením tzv předpřipraveného dotazu (PREPARE) - kdy se prováděcí plán pojmenuje a uloží do plan cache. Speciálním příkazem (EXECUTE) se dohledá plán v plan cache a nechá se vykonat. Poté, co se objevil problém SQL injection se ukázalo, že PS jsou principiálně imunní vůči těmto útokům.
Jelikož PP používají komplikovanější protokol, jehož použití může být pro dotazy, které se neopakují neefektivní, přišlo JDBC s tzv. client side PP. API je pro vývojáře stejné, implementace úplně jiná - dotaz je rozparsovaný na klientské strane, a před vlastním voláním JDBC znovu sestaví dotaz a parametry nahradí oescapeovanými hodnotami. Dotaz se pak vykoná klasicky. Např. Postgres JDBC prvních 5 iterací dotazu řeší na klientské straně, a až pro 6 iteraci se vytvoří server side PS.
Uložené procedury je kód, který se spouští na serveru z "user space". Dost často se může jednat o kód, který obsahuje SQL příkazy, a pokud se použije nativní jazyk pro uložené procedury - PLpgSQL, PL/SQL, SQL/PL - tak pro embedované SQL příkazy jsou automaticky vytvořené PS.