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.
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
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
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.
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.