sql >> Databáze >  >> RDS >> Oracle

kolikrát volaná funkce pl/sql?

Toto je typ situace, kdy je užitečné nějaké experimentování (to bylo provedeno na 10 g). Pomocí následujícího dotazu můžeme říci, že normální funkce se stejnými parametry (v tomto případě žádnými) budou provedeny pokaždé, když jsou volány:

select dbms_random.value() from all_tables

Je to proto, že Oracle předpokládá, že funkce nebude vracet stejnou hodnotu konzistentně, pokud jí neřeknete jinak. Můžeme to udělat vytvořením funkce pomocí deterministic klíčové slovo:

CREATE FUNCTION rand_det
   RETURN NUMBER
   DETERMINISTIC AS
BEGIN
   RETURN DBMS_RANDOM.VALUE ();
END;

Použití této funkce namísto dbms_random v prvním dotazu nám říká, že dotaz se provádí pouze jednou, navzdory mnoha voláním. Ale to pouze objasňuje select sekce. Co když použijeme stejnou deterministickou funkci v obou select a where doložka. Můžeme to otestovat pomocí následujícího dotazu:

SELECT rand_det
FROM   all_tables
WHERE  rand_det > .5;

Možná to budete muset spustit několikrát, abyste viděli náš důkaz, ale nakonec uvidíte seznam hodnot menší než 0,5. To nám poskytuje důkaz, že dokonce i deterministická funkce se provádí dvakrát:jednou pro každou sekci, ve které se objeví. Alternativně můžete naši deterministickou funkci upravit následovně a poté spustit následující dotaz, který odhalí 2 řádky zapsané do DBMS_OUTPUT .

CREATE OR REPLACE FUNCTION rand_det
   RETURN NUMBER
   DETERMINISTIC AS
BEGIN
   DBMS_OUTPUT.put_line ('Called!');
   RETURN DBMS_RANDOM.VALUE ();
END;

SELECT rand_det
FROM   all_tables;


  1. Spojte tabulky ve sloupcích složeného cizího / primárního klíče v dotazu

  2. Proč Eclipse navrhuje objekt jako výchozí typ mapování pro datový typ Text?

  3. undefined method při použití form_for v New controller method

  4. async a čeká na volání MySQL v node js