All posts tagged ORACLE

Oracle te un component força interessant per a la gestió de comptadors. És l’objecte SEQUENCE.

Per obtenir el següent valor de la seqüència executarem
SELECT nom_sequencia.nextval FROM DUAL;

A MySQL podem muntar un workarround per a emular aquesta característica d’Oracle creant una taula i dues funcions pròpies.

Creem una taula anomenada ubqSequencia on el nom de la seqüencia és clau primaria:
CREATE TABLE `ubqSequencia` (
`sqId` varchar(64) NOT NULL COMMENT 'Nom de la seqüència',
`sqCnt` bigint(20) UNSIGNED NOT NULL COMMENT 'Comptador de la seqüència',
`sqInc` int(11) NOT NULL default '1' COMMENT 'Increment per omissió de la seqüència',
`sqObs` longtext COMMENT 'Observacions',
PRIMARY KEY (`sqId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Comptadors emulem create sequence a Oracle'

Creem una funció anomenada ubqSequenciaNextVal que li passem el nom de la seqüència i ens retorna el comptador un cop incrementat. És l’equivalent a la pseudo columna NEXTVAL d’Oracle per a objectes SEQUENCE.
DELIMITER $$

DROP FUNCTION IF EXISTS `ubqSequenciaNextVal`$$
CREATE FUNCTION `ubqSequenciaNextVal`(psqId CHAR(64)) RETURNS bigint(20)
BEGIN

insert into ubqSequencia (sqId, sqCnt, sqInc) values(psqId,1,1)
on duplicate key update sqCnt = sqCnt + sqInc;

RETURN (select sqCnt from ubqSequencia where sqId = psqId);

END$$

DELIMITER ;

Aquesta funció inicialitza sempre la seqüència que em passat com a paràmetre. En cas de que salti la clau duplicada, augmenta el comptador amb l’increment establert a la mateixa taula pel mateix comptador, per omissió +1.

I la funció ubqSequenciaCurrVal que retorna el valor actual del comptador. L’equivalent a la pseudo columna CURRVAL d’Oracle pels objectes SEQUENCE.
DELIMITER $$

DROP FUNCTION IF EXISTS `ubqSequenciaCurrVal`$$
CREATE FUNCTION `ubqSequenciaCurrVal`(psqId CHAR(64)) RETURNS bigint(20)
BEGIN

RETURN (select sqCnt from ubqSequencia where sqId = psqId);

END$$

DELIMITER ;

Un dels aspectes positius de tenir els comptadors a nivell de base de dades i no per lògica de programes, és que podem actualitzar els comptadors en MySQL des d’instruccions massives. Per exemple:


update PROVA set nouComptador = ubqSequenciaNextVal('XXYYZZ');

Actualitzant el camp nouComptador de tots els registres de la taula PROVA amb la seqüència XXYYZZ. Les proves realitzades han consumit 0.0946 segons en fer la seqüència de 414 registres en un update massiu.

Certifiquem que el comptador ha quedat actualitzat

mysql> select ubqSequenciaCurrVal('XXYYZZ');
+-------------------------------+
| ubqSequenciaCurrVal('XXYYZZ') |
+-------------------------------+
| 414 |
+-------------------------------+
1 row in set (0.00 sec)

I mostrem com afegim un

mysql> select ubqSequenciaNextVal('XXYYZZ');
+-------------------------------+
| ubqSequenciaNextVal('XXYYZZ') |
+-------------------------------+
| 415 |
+-------------------------------+

oracle-compra-sun

En Toni Hermoso informa d’una notícia Bomba: Oracle comprarà SUN per 7.400 milions de dollars, uns 5.700 milions d’Euros (els USA empren el que s’anomena Short Scale per a quantificiar un bil·lió).

Pagaran 9,5 USD per acció, preu de cotització de SUN a l’agost del 2008, molt per sobre dels 6,5 actuals i el doble dels 4,75 que cotitzaven abans del 17 de març, data en que es van fer públics els rumors de que IBM volia comprar SUN per 7.000 milions d’USD. SUN va trobar insuficient l’oferta d’IBM i van trencar unes converses molt avançades el 6 d’abril.L’aposta d’IBM era força interessant per al món Open Source: Assegurava la seva aposta per Java com a llenguatge inter-plataforma de propòsit general i mantenia desenvolupament de MySQL, com demostra la creació de l’IBMSB2i Storage Engine per a MySQL de l’AS/400.

L’aposta d’Oracle potser va més enrutada en assegurar-se poder servir als seus clients sol·lucions integrades amb maquinari, de fet històricament Oracle i SUN havien anat del braçet.

Possiblement també controlar els gestors de bases de dades que suporten SAP i potser incorporar a Oracle algunes de les funcionalitats de MySQL i viceversa. Seria fantàstic la creació d’un Oci Storage Engine per a MySQL ;-)

El Zend framework ens ho posa certament fàcil per a connectar amb una base de dades ORACLE.

La classe necessària i que hem d’incloure és la de les connexions OCI

require_once ('Zend/Db/Adapter/Pdo/Oci.php');

Creem un array on posarem totes les dades habituals de connnexió amb una base de dades

$arrayConnexio = array(
'host' => 'xx.xx.xx.xx',
'port' => 'xxxx',
'dbname' => 'SID_DE_LA_BBDD',
'username' =>'usuari',
'password' => 'password'
);

El host pot ser la seva adreça IP o bé el seu nom.
El port és el port de comunicació amb la BBDD (habitualment el 1521)

Ara només ens quedarà crear la instància de la classe i …

$laConnexioBBDD = new Zend_Db_Adapter_Pdo_Oci($arrayConnexio);

ja ho tindrem !

A partir d’aquí la manera de treballar és l’habitual amb les connexions a base de dades:

$rowset = $laConnexioBBDD->fetchAll($laQuery);

Pot ser d’interès especificar amb quina codificació de caràcters volem treballar. Així no depenem de la instal·lada per defecte al servidor.

$arrayConnexio = array(
...
'charset' => 'utf8'
);