2010-02-12 5 views
0

J'ai un fichier plutôt énorme (50mb) où le premier champ est un timestamp unix. Cependant, je ne veux pas charger le fichier entier, je n'ai besoin que de la moitié de celui-ci où timestamp> some_parameterized_timestamp.Comment charger dans oracle quand timestamp> 12345678900

Il semble que sqlldr n'accepte que les conditions = et <> dans la clause when. Cela prend trop de temps pour charger le fichier et ensuite supprimer les enregistrements qui ne sont pas nécessaires.

Y a-t-il une alternative à l'utilisation de sqlldr qui a toujours des performances comparables? (J'utilise déjà direct = true.)

Je songe à utiliser awk pour créer une copie du fichier avec les données dont j'ai besoin, et awk est assez efficace, mais avant de me lancer dans cette voie, Je pensais que je demanderais ici de meilleures suggestions.

Répondre

0

Ce note on asktom (search for "magic") semble indiquer que l'utilisation INFILE « - » dans le fichier de contrôle permettrait une redirection, comme:

awk [various switches] sourcefile | sqlldr [sqlldr options] 

Mais je ne l'ai pas testé.

En supposant que vous avez accès à un système de fichiers sur le serveur de base de données, vous pouvez utiliser une spécification de table externe de votre fichier de données, puis utiliser SQL pour "charger" les données de la table externe. De même, vous pouvez charger vos données dans une table de transfert; puis exécutez un script SQL à

INSERT INTO TARGET_TABLE 
SELECT * FROM STAGING_TABLE 
WHERE TIMESTAMP > :PARAMETER; 
TRUNCATE TABLE STAGING_TABLE; 
Questions connexes