Článek přečtěte do 4 min.

Transakce bez relací

Při vytváření systémů, které používají externí API, mohou transakce vyžadovat kombinaci volání do vaší databáze a externích rozhraní.

Například:

  1. Načíst data z databáze
  2. Volání externího API
  3. Zapis dat do databáze
  4. Zavolejte jiné externí API
  5. Zapis dat do databáze

Abyste zajistili transakční konzistenci databázových dat, musíte udržovat připojení k databázi neustále otevřené. To vám umožní vrátit změny zpět, pokud v procesu dojde k nějakým chybám.

Během volání externích API je databázové připojení nečinné. To plýtvá zdroji.

Alternativou bylo po každém volání databáze potvrdit provedenou práci, abyste mohli uvolnit připojení. To však ztěžovalo vrácení změn v případě chyby – museli jste napsat kód pro vrácení změn v databázi provedených do tohoto okamžiku.

Transakce bez relace ve verzi 23.6 tento problém řeší. Transakci můžete spustit v jedné relaci, pozastavit ji a poté ji obnovit a dokončit v jiné relaci. Transakce již není vázána na danou relaci, takže je bez relace.  Pro spuštění transakce bez relace je vyžadováno volání transakce – vaše stávající transakce, které jste doposud milovali a používali, zůstanou přesně stejné jako vždy.

Například toto spustí transakci bez relace v session 214, vloží řádek do table my_tablea poté transakci pozastaví:

zrušit tabulku, pokud existuje my_table;
vytvořit tabulku my_table (id int, text varchar2(255));

nastavit serveroutput on;
DECLARE
— definujte název vaší transakce (alternativně můžete jednoduše předat NULL a nechat si ji vygenerovat)
v_xid_raw RAW(21) := UTL_RAW.CAST_TO_RAW(‚název_vaše_transakce');
— Proměnná pro generované binární reprezentace ID transakce
v_xid_chars VARCHAR2(42); — zdvojnásobte délku názvu vaší transakce, protože řetězcová reprezentace je hexadecimální
BEGIN
v_xid_chars :=
DBMS_TRANSACTION.START_TRANSACTION (
v_xid_raw, — název transakce v binárním formátu
DBMS_TRANSACTION.TRANSACTION_TYPE_SESSIONLESS, — typ transakce
30, — časový limit transakce
DBMS_TRANSACTION.TRANSACTION_NEW — stav transakce
);

DBMS_OUTPUT.PUT_LINE(‚– v_xid_chars: ‚ || v_xid_chars);
END;
/
— v_xid_chars: 796F75725F7472616E73616374696F6E5F6E616D65

vložit do my_table (id, text) hodnoty (1, ‚Gerald');

vyberte t.*, sys_context(‚USERENV', ‚SID') sid FROM my_table t;

ID TEXT SID
_____ __________ ______
1 Gerald 214

— Pozastavit aktuální transakci (není potvrzena ani vrácena zpět)
exec DBMS_TRANSACTION.SUSPEND_TRANSACTION;

V tomto okamžiku je změna na my_tablenepotvrzená. Dotaz na tuto tabulku v 179níže uvedené relaci nevrátí žádné řádky. Nyní však můžete transakci obnovit v této druhé relaci, zobrazit změny z relace 214a potvrdit je:

SELECT počet(*) c, sys_context (‚USERENV', ‚SID') sid FROM moje_tabulka;

C SID
____ ______
0 179 — nová relace s jiným ID relace (SID), v tabulce zatím nejsou žádné řádky

nastavit serveroutput zapnuto;
DECLARE
v_xid_raw RAW(21) := UTL_RAW.CAST_TO_RAW(‚název_vaše_transakce');
v_xid_chars VARCHAR2(42);
BEGIN
— Obnovení pojmenované transakce bez relace, tento název odpovídá názvu z volání START_TRANSACTION
v_xid_chars :=
DBMS_TRANSACTION.START_TRANSACTION (
v_xid_raw,
DBMS_TRANSACTION.TRANSACTION_TYPE_SESSIONLESS,
30,
DBMS_TRANSACTION.TRANSACTION_RESUME
);

DBMS_OUTPUT.PUT_LINE(‚– v_xid_chars: ‚ || v_xid_chars);
END;
/
— v_xid_chars: 796F75725F7472616E73616374696F6E5F6E616D65 — stejné ID transakce jako z předchozí relace

VYBRAT * Z moje_tabulka;

ID TEXT
_____ _____
1 Gerald — transakce obnovena => vidí dosud nepotvrzené řádky vložené relací 214

spáchat;

Použití transakcí bez relace zjednodušuje kód pro koordinaci transakcí a uvolňuje databázové prostředky.

Více informací naleznete na adrese: https://docs.oracle.com/en/database/oracle/oracle-database/23/adfns/developing-applications-sessionless-transactions.html

Hybridní vektorový index

Vektorové vyhledávání umožňuje sémantické vyhledávání a nalezení dat souvisejících s vašimi hledanými výrazy. V mnoha případech to poskytuje lepší zážitek, když nepotřebujete znát přesná klíčová slova. Pokud chcete, aby se ve výsledcích zobrazovala konkrétní klíčová slova, je třeba data dále filtrovat.

Oracle Text nabízí výkonné funkce vyhledávání pomocí řetězců, které vám pomohou najít data pomocí konkrétních klíčových slov. Je to skvělé, když víte, co hledáte, ale pokud si nejste jisti, co se v datech nachází, může to vést k tomu, že budete muset provádět mnoho vyhledávání s různými variantami klíčových slov.

Hybridní vektorové indexy umožňují kombinovat obě tyto funkce v jednom indexu. Můžete definovat, které vyhledávací výrazy lze použít sémantické vyhledávání a které vyhledávání pomocí klíčových slov.

Například se v tabulce produktů v ukázkovém schématu SH vytvoří hybridní vektorový index. K vektorizaci názvů produktů se použije model LLM ALL_MINILM_L12_V2načtený do databáze ( další informace o načtení modelů ONNX do databáze naleznete v části Import modelů ONNX do databáze Oracle End-to-End Example ):

vytvořit hybridní vektorový index prod_name_i
na produktech (prod_name)
s parametry (‚model ALL_MINILM_L12_V2');

Balíček pak můžete použít dbms_hybrid_vectorke kombinaci vyhledávání podle klíčových slov a sémantického vyhledávání. Tyto dva dotazy nacházejí produkt „chrániče holení" různými způsoby. První používá sémantické vyhledávání pro výraz „chrániče" a vyhledávání podle klíčových slov pro „holeň". Druhý používá sémantické vyhledávání pro výraz „noha" a vyhledávání podle klíčových slov pro „chrániče":

nastavit dlouhou 10000 velikost stránky 1000

vyberte json_serialize (
dbms_hybrid_vector.search (
json (‚') )
vrací clob pretty
) shin_protector_matches;

ZÁPASY_CHRÁNIČŮ_HOLENÍ
________________________________[

]

vyberte json_serialize (
dbms_hybrid_vector.search (
json (‚' ) )
vrací clob pretty
) leg_guards_matches;

ZÁPASY_CHRÁTNÍKŮ_NOHOU
________________________________[

]

Více informací naleznete na adrese: https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/manage-hybrid-vector-indexes.html

Skrytá pole v zobrazeních JSON-relační duality

V zobrazeních JSON s relační dualitou můžete k vygenerování hodnot polí použít výrazy. Tyto hodnoty mohou být založeny na jiných polích, která jsou v dokumentu vráceném zobrazením skryta.

Skrytí polí používaných pouze k výpočtu hodnot pro jiná pole může zjednodušit vrácené dokumenty.

V tomto příkladu je zaměstnanec považován za vysoce příjmového, pokud je jeho odměna vyšší než průměr v jeho oddělení. Pohled relační duality JSON vypočítává highEarnerpole porovnáním vygenerovaných polí totalCompdeptAvgSalary. Pro zjednodušení vráceného dokumentu deptAvgSalaryje označeno jako hiddenpole a proto je z výstupu pohledu vynecháno:

vytvořit nebo nahradit json relační dualita zobrazení employee_dv jako

  select json
from employees e;

vyberte json_serialize(data vracející clob pretty) data
z employee_dv d
kde d.data.departmentId = 20;

DATA
———————————————————–

Více informací naleznete na adrese: https://docs.oracle.com/en/database/oracle/oracle-database/23/jsnvu/generated-fields-hidden-fields.html.

Pro další informace nás rovnou kontaktujte.

Zdroj: Oracle