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

Jaký datový typ bych měl svázat jako parametr dotazu pro použití se sloupcem NUMBER(15) v Oracle ODBC?

Mým osobním přáním je vytvořit proměnnou vazby znakové řetězce (VARCHAR2) a nechat Oracle provést převod ze znaku na svůj vlastní interní formát úložiště. Je dost snadné (v C) získat datové hodnoty reprezentované jako null ukončené řetězce v přijatelném formátu.

Takže místo psaní SQL takto:

SET MY_NUMBER_COL = :b1
  , MY_DATE_COL = :b2

SQL píšu takto:

SET MY_NUMBER_COL = TO_NUMBER( :b1 )
  , MY_DATE_COL   = TO_DATE( :b2 , 'YYYY-MM-DD HH24:MI:SS')

a zadejte řetězce znaků jako proměnné vazby.

Tento přístup má několik výhod.

Jedním z nich je, že řeší problémy a chyby, na které narazíte při vázání jiných datových typů.

Další výhodou je, že hodnoty vazeb lze snadněji dešifrovat na trasování události Oracle 10046.

Také EXPLAIN PLAN (domnívám se) očekává, že všechny proměnné vazby budou VARCHAR2, takže to znamená, že vysvětlovaný příkaz se mírně liší od skutečného prováděného příkazu (kvůli implicitním převodům dat, když datové typy argumentů vazby ve skutečném prohlášení nejsou VARCHAR2.)

A (méně důležité) když testuji příkaz v TOAD, je snazší, abych mohl zadávat řetězce do vstupních polí a nemusel se lámat se změnou datového typu v rozevíracím seznamu.

Také jsem nechal funkcemi TO_NUMBER a TO_DATE ověřit data. (Přinejmenším v dřívějších verzích Oracle jsem narazil na problémy s přímou vazbou hodnoty DATE, která obcházela (alespoň část) kontroly platnosti a umožňovala ukládání neplatných hodnot data do databáze.

Jedná se pouze o osobní preference, založené na minulých zkušenostech. Stejný přístup používám s Perl DBD.

Zajímalo by mě, co na toto téma říká Tom Kyte (asktom.oracle.com)?




  1. Aktualizujte ListView na základě ContentProvider podporovaného SQLite

  2. Jak získám počet přidružených řádků v levém spojení v MySQL?

  3. formulář je vybrán na další stránku

  4. Základy tabulkových výrazů, Část 7 – CTE, úvahy o optimalizaci