Question

J'ai une base de données Progress à partir de laquelle j'effectue un ETL. L'une des tables que je lis n'a pas de clé unique, je dois donc accéder au ROWID pour pouvoir identifier la ligne de manière unique. Quelle est la syntaxe pour accéder au ROWID en cours?

Je comprends que l’utilisation de ROWID pour l’identification des lignes pose des problèmes, mais c’est tout ce que j’ai pour le moment.

Était-ce utile?

La solution

Une mise en garde rapide pour ma réponse: cela fait presque 10 ans que je travaille avec Progrès , mes connaissances sont donc probablement plus qu'un peu démodé.

Vérification de la Référence du langage de progression [PDF] semble indiquer que les deux fonctions dont je me souviens sont toujours présentes: ROWID et RECID . La fonction ROWID est plus récente et recommandée.

En cours 4GL, vous utiliseriez quelque chose comme ceci:

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

ou:

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

Vérification de la Référence de Progress SQL [PDF] indique que ROWID est également disponible en SQL en tant qu’extension Progress. Vous l'utiliseriez comme ceci:

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

Modifier: modifié à la suite des commentaires de Stefan.

Autres conseils

En fonction de votre situation et du comportement de l'application, cela peut être important ou non, mais vous devez savoir que ROWIDs & amp; Les RECID sont réutilisés et qu’ils peuvent changer.

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

2) Si la table est réorganisée via un fichier de vidage & amp; charge ou un tablemove dans une nouvelle zone de stockage, les ROWID changeront.

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

Cela ne marche PAS:

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

Cela fonctionne:

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

Une recherche rapide sur Google révèle ceci: http://bytes.com/forum/thread174440.html

Lisez le message vers le bas par greg@turnstep.com (vous voulez soit un identifiant, soit un ctid, en fonction de la garantie que vous souhaitez obtenir de la persistance et de l'unicité)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top