2008-09-18 7 views
3

J'ai une base de données Progress dans laquelle j'effectue un ETL. Une des tables que je suis en train de lire n'a pas de clé unique, donc j'ai besoin d'accéder au ROWID pour pouvoir identifier la ligne de façon unique. Quelle est la syntaxe pour accéder au ROWID en cours?Comment obtenir le ROWID à partir d'une base de données Progress

Je comprends qu'il y a des problèmes avec l'utilisation de ROWID pour l'identification des lignes, mais c'est tout ce que j'ai en ce moment.

Répondre

8

Une mise en garde rapide pour ma réponse - c'est près de 10 ans depuis que j'ai travaillé avec Progress donc ma connaissance est probablement plus qu'un peu démodé.

La vérification du Progress Language Reference [PDF] semble montrer que les deux fonctions dont je me souviens sont toujours là: ROWID et RECID. La fonction ROWID est plus récente et est préférée.

In Progress 4GL utiliser cette fonctionnalité? Quelque chose comme ceci:

FIND customer WHERE cust-num = 123. 
crowid = ROWID(customer). 

ou:

FIND customer WHERE ROWID(customer) = crowid EXCLUSIVE-LOCK. 

Vérification des Progress SQL Reference [PDF] montre ROWID est également disponible dans SQL comme une extension Progress. Vous souhaitez l'utiliser comme ceci:

SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123 

Edit: Modifié suivant les commentaires de Stefan.

+0

Vous devez mettre un NO-ERROR sur les deux premiers exemples, et sur le premier ajouter un client IF AVAIL puis ALORS avant d'assigner le ROWID. Comme alternative, vous pouvez mettre la déclaration d'assignation à l'intérieur d'un FOR NO FIRST NO-LOCK OERE ...Juste des moyens d'éviter les messages d'erreur s'il n'y a pas de client correspondant. –

-1

Une recherche rapide Google se transforme en ceci: http://bytes.com/forum/thread174440.html

Lire le message vers le bas par [email protected] (soit vous voulez oid ou ctid en fonction de ce que vous voulez garanties que la persistance et le caractère unique re)

+0

J'ai une base de données Progress, pas une base de données PostgreSQL. –

+0

D'oh! Désolé, totalement mal lu. – SquareCog

+1

Erreur commune, peu de gens ont même entendu parler de Progress :-) –

2

Juste pour ajouter un peu aux réponses de Dave Webb. J'avais essayé ROWID dans l'instruction select mais j'ai reçu une erreur de syntaxe. ROWID ne fonctionne que si vous spécifiez le reste des colonnes à sélectionner, vous ne pouvez pas utiliser *.

Cela ne fonctionne pas:

SELECT ROWID, * FROM customer WHERE cust-num = 123 

Cela fonctionne:

SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123 
+2

C'est bon à savoir. Quand je travaillais avec Progress, tout était à propos de la prise en charge de 4GL et SQL était assez nouveau, donc je n'ai jamais interrogé une DB Progess avec SQL. Cela dit, d'après ce dont je me souviens, c'est une excellente base de données avec une belle architecture et c'est dommage qu'elle soit si rarement utilisée. –

+0

Une fois que vous spécifiez une colonne, vous devez préfixer * avec le nom de la table. Ainsi, dans l'exemple, 'SELECT RowID," cust-num ". * FROM ...' ** travaillerait ** –

5

En fonction de votre situation et le comportement de l'application ce qui peut ou ne peut pas d'importance, mais vous devez savoir que ROWIDs & Les RECID sont réutilisés et ils peuvent changer.

1) Si un enregistrement est supprimé, son ROWID sera éventuellement réutilisé.

2) Si la table est réorganisée via une sauvegarde & ou un tablemove vers une nouvelle zone de stockage, les ROWID changeront.

Questions connexes