Category: Base de données

Oracle : index basé sur une fonction

By , 05/06/2013

Il est possible de définir des index basés sur des fonctions (based-function index). Par exemple lorsqu’il est nécessaire de faire un index sur ce genre de requête SQL :

SELECT * FROM
    MA_TABLE
WHERE
    SUBSTR(MA_COLONNE, 1, 3) = 'ABC';

Il est possible de définir un index spécialement sur la fonction recherchée de la façon suivante :

CREATE INDEX IDX ON MA_TABLE (SUBSTR(MA_COLONNE, 1, 3));

Oracle : Noms des objets sensibles à la casse

By , 11/01/2013

Par défaut Oracle enregistre tous les noms des objets en majuscule sauf s’ils ont été créés avec des guillemets. Dans ce cas le nom de l’objet est sensible à la casse. Par exemple :

SQL> create table "bob" (a number);

Table created.

SQL> select * from bob;
select * from bob
              *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> select * from "bob";

no rows selected

Attention ! Certains logiciels SQL (SQLDevlopper par exemple) créent toutes leurs requêtes avec des guillemets lorsque l’on demande des actions (insertions, modifications, créations, etc.) sur les bases de données via les menus contextuels.

Sources :

Oracle : Supprimer toutes les tables d’un schéma

By , 14/12/2012

Voici un petit script PLSQL pour supprimer toutes les tables d’un schéma d’une base de données Oracle. Il s’agit de créer un curseur implicite sur la liste des tables de l’utilisateur sans prendre en compte les tables de la corbeille. Puis de boucler sur cette liste afin d’exécuter la commande de suppression de chaque table sans oublier toutes ses contraintes :

BEGIN
    FOR c IN (SELECT object_name,
                     object_type
              FROM user_objects
              WHERE object_type IN ('TABLE') AND object_name NOT LIKE '%$%') LOOP
        EXECUTE IMMEDIATE 'DROP '
                             || c.object_type || ' "'
                             || c.object_name || '" CASCADE CONSTRAINTS';
    END LOOP;
END;

Ce script peut être adapté pour supprimer d’autres types d’objet comme des vues. Pour cela, modifier TABLE en VIEW.

JBoss 7 : Datasources dans un WAR

By , 28/09/2012

Avec JBoss 7, il est possible de déclarer une datasource JNDI dans une archive WAR. Pour cela, il faut déposer un fichier ma-datasource-ds.xml dans le répertoire WEB-INF avec la déclaration de la source de données. Par exemple :

<?xml version="1.0" encoding="UTF-8"?>

<datasources xmlns="http://www.jboss.org/ironjacamar/schema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.jboss.org/ironjacamar/schema http://docs.jboss.org/ironjacamar/schema/datasources_1_0.xsd">
   <!-- The datasource is bound into JNDI at this location. We reference
      this in META-INF/persistence.xml -->
   <datasource jndi-name="java:jboss/datasources/maDS"
          pool-name="mysqlds"
          enabled="true"
          use-java-context="true">
      <connection-url>jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=UTF-8</connection-url>
      <driver>mysql</driver>
      <security>
         <user-name>root</user-name>
         <password>123456</password>
      </security>
   </datasource>
</datasources>

La valeur de l’élément driver, est le nom du driver installé sur le serveur. Pour l’installer, il est possible de copier le jar dans le répertoire de déploiement du serveur (cp mysql.jar <as7>/standalone/deployments).

Sources : https://community.jboss.org/thread/204245, https://community.jboss.org/wiki/DataSourceConfigurationInAS7, https://github.com/abstractj/as-quickstarts/blob/40f8cae2ce9388151e1a07f743df74e59c7848bc/kitchensink-html5-mobile/src/test/resources/arquillian-ds.xml

Oracle : Connaitre la taille d’une table en Mo

By , 07/09/2012

Pour connaître la taille utile d’une table d’une base de données oracle il faut se baser sur le nombre de blocs de la table et le multiplier par la taille d’un bloc. La taille utile est la taille exacte de la table. Cela ne prendre pas en compte les blocs vides occupés par la table qui proviendraient d’une fragmentation de la base de données.

    select
        user_tables.table_name,
        user_tablespaces.tablespace_name,
        user_tablespaces.block_size,
        user_tables.blocks,
        user_tablespaces.block_size * user_tables.blocks / 1024 / 1024
            as "Taille Mb"
    from user_tables, user_tablespaces
    where
        user_tables.tablespace_name = user_tablespaces.tablespace_name
    order by "Taille Mb" desc

Oracle : Générer une série de date

By , 15/02/2011

Comment est-il possible de générer une séquence de date à partir d’une simple requête SQL sur un base de données Oracle ?

Pour comprendre le principe, il faut savoir que ce type de résultat est obtenu en deux étapes. La première est la génération d’un nombre défini de données à partir d’une requête SQL. La seconde est la transformation des données générées pour obtenir des dates.

Génération d’une série de données

Il existe plusieurs façons de générer un nombre défini de données qui peuvent être exploitées par la suite. Voici un exemple simple :

SELECT 1
FROM DUAL
CONNECT BY LEVEL <= < n >

Avec n le nombre de données que vous souhaitez obtenir. Voici le résultat pour n = 3 :

1
———————-
1
1
1

Transformation de la série en séquence de dates

A partir des données générées précédemment, il est possible de créer une séquence de date avec ce type de requête SQL :

SELECT TRUNC(TO_DATE('20080415','yyyymmdd'),'MM')+ROWNUM -1 DATES FROM (
   SELECT 1
   FROM DUAL
   CONNECT BY LEVEL <= <n>
)

Voici le résultat pour n = 3 :

DATES
————————-
01/04/08
02/04/08
03/04/08

Sources : Pour plus d’explications, vous pouvez vous référer au site internet qui m’a servi de référence : http://www.dba-oracle.com/t_test_data_date_generation_sql.htm. Vous y retrouverez entre autre deux façons différentes de générer une série de données.

Normalisation des bases de données

By , 02/04/2010

Depuis que je travaille dans l’informatique de gestion, je vois tout et son contraire en terme de normalisation des bases de données. J’ai découvert aujourd’hui un document très intéressant sur le sujet qui pourrait servir à l’ensemble des informaticiens qui travaillent avec une base : http://sqlpro.developpez.com/cours/standards/.

On y apprend comment nommer ses tables relationnelles, leurs colonnes, index, etc. Je ne vais pas réécrire l’article, cela n’aurait pas d’intérêt, mais je vais vous montrer quelques exemples. Voici la proposition pour les tables et les vues :

Préfixe de table fonction préfixe de vue
T_ lorsqu’il s’agit d’une table fonctionnelle V_
TR_ lorsqu’il s’agit d’une table de référence VR_
TS_ lorsqu’il s’agit d’une table “système” VS_
TJ_ lorsqu’il s’agit d’une table de jointure VJ_
TG_ lorsqu’il s’agit d’une table générique (héritage) VG_


On y apprend aussi comment écrire du code SQL (indentation, nom des colonnes résultats, etc.). Par exemple voici un mauvais code :

SELECT CLI_ID, CLI_NOM, CLI_ENSEIGNE,
CLI_PRENOM  FROM T_CLIENT WHERE CLI_ADR_PAYS = 'F'
AND CLI_ENSEIGNE IS NULL OR CLI_ENSEIGNE =''
ORDER BY CLI_NOM

Voici le même code bon cette fois-ci :

SELECT CLI_ID, CLI_NOM, CLI_ENSEIGNE,
       CLI_PRENOM
FROM   T_CLIENT
WHERE  CLI_ADR_PAYS = 'F'
       AND CLI_ENSEIGNE IS NULL OR CLI_ENSEIGNE =''
ORDER  BY CLI_NOM

Au final, je pense que si tout le monde utilisait les mêmes conventions pour les schémas de base de données et les requêtes SQL, les développeurs (Java par exemple) seraient plus à l’aise pour leurs développements et pour changer de projet.

SQLDeveloper : problème sur les touches (suppression, retour arrière, etc.)

By , 10/02/2010

Il est possible de paramétrer le clavier du logiciel SQL Développeur lorsque celu-ci ne répond plus à certaines touches sur l’éditeur SQL (suppression, retour arrière, selection, etc.) :

  1. Aller dans le menu “Tools -> préférences -> Accelerators”
  2. Cliquer sur le bouton “Load Preset…”
  3. Choisir la configuration par défaut

 

Ma source : http://decoding.wordpress.com/2008/01/09/oracle-sql-developer-problem-backspace-delete-button-not-working-quick-fix/

OfficeFolders theme by Themocracy