Oracle SQL Developer Keep Alive plugin

On some environment, on some customers, Oracle connections are drop after some idle time (i.e. 2 minutes).

I have found a small plugin for Sql Developer to solve this issue: it is very handy and logs its usage. Code is also very clean

 

ORA-01461: can bind a LONG value only for insert into a LONG column

Disapprove with me!
Disapprove with me!

Okey, you know Oracle. A very good database, a very old database, a very solid rock. Not famous for its error messages. I have already stumbled upon a misleading error on the old rock.

This error anyway is incredible. If you try to push a very long text in a varchar2, you can end up with a

ORA-01461: can bind a LONG value only for insert into a LONG column

error.

Stack overflow promptly reported this years ago, so you can check it with your eyes.

 

 

Oracle Invalid number ORA-01722

I stumbled upon a very brain-f**k error on Oracle 10g on these days.

Context: the following query

SELECT
  * 
 FROM
  (    
    SELECT
      TO_NUMBER(CUSTOMER_ID) AS SNDG
    FROM
      BAD_CODES_TABLE    WHERE    
    AND I_LIKE=UPPER('STATIC_CONDITION')
    AND CUSTOMER_ID NOT LIKE '%P%'
  )
  S
WHERE
  TO_NUMBER(S.SNDG) >2000

could trigger a Invalid number if CUSTOMER_ID column contains invalid numbers.

Why?

Well…if you ask to “explain plan”, you will get something like

  • a table full scan
    • Filter Predicates AND
      • I_LIKE=UPPER(‘STATIC_CONDITION’)
      • TO_NUMBER(S.SNDG) >2000
      • CUSTOMER_ID NOT LIKE ‘%P%’

Continue reading “Oracle Invalid number ORA-01722”

Come evitare iniezioni SQL lato DB in SQLServer, Oracle, MySQL

 Come evitare iniezione SQL: lato SQL Server (SP_EXECUTESQL)

In generale va evitato nel modo più assoluto la scrittura di query sql diamiche.

Va evitato cioè  l’uso lato SQL Server di sp_executesql e EXEC

Di seguito mostriamo come trasformare una query “dinamica” in una “statica”

 

CREATE PROCEDURE search_orders @custid   nchar(5)     = NULL,

@shipname nvarchar(40) = NULL AS

DECLARE @sql nvarchar(4000)

SELECT @sql = ' SELECT OrderID, OrderDate, CustomerID, ShipName ' +

' FROM dbo.Orders WHERE 1 = 1 '

IF @custid IS NOT NULL

SELECT @sql = @sql + ' AND CustomerID LIKE ''' + @custid + ''''

IF @shipname IS NOT NULL

SELECT @sql = @sql + ' AND ShipName LIKE ''' + @shipname + ''''

EXEC(@sql)

….

In tale esempio, a fronte di un form con parametri opzionali come custid e shipname, viene erroneamente utilizzata una query dinamica. Il modo corretto di procedere è invece il seguente.

1 Definire la stored procedure come:

 

CREATE PROCEDURE search_orders @custid   nchar(5)     = NULL,

@shipname nvarchar(40) = NULL AS

DECLARE @sql nvarchar(4000)

SELECT OrderID, OrderDate, CustomerID, ShipName
FROM dbo.Orders
WHERE ((@custid  IS NULL) OR (CustomerID like @custid))
AND   ((@shipname IS NULL) OR (ShipName LIKE @shipname))

….

 

2 Far sì che la stored procedure  va chiamata attraverso l’uso dei Parameters descritti nel paragrafo precedente.

 

La query così definita ha i seguenti vantaggi:

  1. E’ molto sicura
  2. E’ facile da mantenere (per esempio per aggiungere/togliere condizioni)
  3. E’ compilata come stored procedure, e quindi il suo piano di esecuzione viene ottimizzato dopo ogni esecuzione (una query passata ad EXEC è interpretata, compilata, ecc ogni volta e molte versioni di SQL Server di norma  non mantengono il piano di esecuzione di una query on the fly)
  4. Poiché le condizioni in OR sono facili da verificare, il database ottimizza automaticamente la query a fronte degli input, evitando le verifiche inutili. Per esempio se sono nulli entrambi gli input, il database effettua una semplice query
    SELECT OrderID, OrderDate, CustomerID, ShipName FROM dbo.Orders
  5. Non dipende da estensioni proprietarie e quindi è più facile da migrare a differenti versioni di SQL Server o di Oracle.
  6. E’ facile da leggere, capire e trascrivere.

 

Per maggiori informazioni

dapper-dot-net – Simple SQL object mapper for SQL Server – Google Project Hosting

 

 Dapper is a single file you can drop in to your project that will extend your IDbConnection interface.
[…]

A key feature of Dapper is performance. The following metrics show how long it takes to execute 500 SELECT statements against a DB and map the data returned to objects.

The performance tests are broken in to 3 lists:

  1. POCO serialization for frameworks that support pulling static typed objects from the DB. Using raw SQL.
  2. Dynamic serialization for frameworks that support returning dynamic lists of objects.
  3. Typical framework usage. Often typical framework usage differs from the optimal usage performance wise. Often it will not involve writing SQL.

via dapper-dot-net – Simple SQL object mapper for SQL Server – Google Project Hosting.