Vues prédéfinies
Oracle Blockchain Platform Digital Assets Edition fournit les vues de base de données prédéfinies suivantes.
-
ACCOUNT_TRANSACTION_VIEW
- Cette vue fournit un historique des transactions unifié par compte, capturant à la fois les côtés débit (
from_account_id
) et crédit (to_account_id
) d'une transaction. Vous pouvez utiliser cette vue pour interroger toutes les transactions liées à un compte sans analyser les données d'état de code chaîne brutes. - Requête SQL confidentielle, propriétaire système :
CREATE VIEW ACCOUNT_TRANSACTION_VIEW as SELECT tx."VALUEJSON".from_account_id AS "KEY", tx."VALUEJSON".transaction_id AS "TRANSACTION_ID", tx."VALUEJSON" AS "TRANSACTION_DETAILS", COALESCE(CAST(tx."VALUEJSON".blockNo AS NUMBER), tx."BLOCKNO") AS ORDER_BLOCKNO, COALESCE(CAST(tx."VALUEJSON".txnNo AS NUMBER), tx."TXNNO") AS ORDER_TXNNO FROM "<obpInstanceName>_<channelName>_state" tx WHERE tx."CHAINCODEID" = '<chaincodeName>' AND tx."VALUEJSON".assetType = 'otransaction' AND tx.KEY NOT LIKE '_obp2pc_' AND tx."VALUEJSON".transaction_type NOT IN ('EXECUTE_HOLD_RECEIVER', 'CREATE_ACCOUNT') AND tx."VALUEJSON".from_account_id IS NOT NULL UNION ALL SELECT tx."VALUEJSON".to_account_id AS "KEY", tx."VALUEJSON".transaction_id AS "TRANSACTION_ID", tx."VALUEJSON" AS "TRANSACTION_DETAILS", COALESCE(CAST(tx."VALUEJSON".blockNo AS NUMBER), tx."BLOCKNO") AS ORDER_BLOCKNO, COALESCE(CAST(tx."VALUEJSON".txnNo AS NUMBER), tx."TXNNO") AS ORDER_TXNNO FROM "<obpInstanceName>_<channelName>_state" tx WHERE tx."CHAINCODEID" = '<chaincodeName>' AND tx."VALUEJSON".assetType = 'otransaction' AND tx.KEY NOT LIKE '_obp2pc_' AND tx."VALUEJSON".transaction_type NOT IN ('EXECUTE_HOLD_SENDER', 'CREATE_ACCOUNT') AND tx."VALUEJSON".to_account_id IS NOT NULL
Sources de données :
<obpInstanceName>_<channelName>_state
, table d'état principale contenant les données de code chaîne au format JSONLogique de la clé :- Inclut uniquement les lignes pour lesquelles les instructions suivantes sont vraies.
CHAINCODEID = <chaincodeName>
assetType = 'otransaction'
KEY
ne commence pas par_obp2pc_
transaction_type
n'est pasEXECUTE_HOLD_RECEIVER
,EXECUTE_HOLD_SENDER
ouCREATE_ACCOUNT
- Extrait la participation des comptes des transactions sortantes (
from_account_id
) et entrantes (to_account_id
). - Utilise
COALESCE
pour garantir un ordre cohérent des colonnes (ORDER_BLOCKNO
,ORDER_TXNNO
), même si des valeurs JSON sont manquantes. - Combine les transactions sortantes et entrantes avec une valeur
UNION ALL
.
Colonnes de sortie:KEY
: ID de compte associé à la transaction (expéditeur ou destinataire).TRANSACTION_ID
: identificateur unique du mouvement.TRANSACTION_DETAILS
: objet JSON complet de la transaction.ORDER_BLOCKNO
: numéro de bloc utilisé pour le tri (à partir de JSON si disponible, sinon métadonnées de bloc).ORDER_TXNNO
: numéro de transaction dans le bloc (à partir du format JSON si disponible, sinon métadonnées de bloc).
- Inclut uniquement les lignes pour lesquelles les instructions suivantes sont vraies.
- Requête SQL SourcesConfidential de données, banque du participant :
CREATE VIEW ACCOUNT_TRANSACTION_VIEW AS SELECT tx."VALUEJSON".from_account_id AS "KEY", tx."VALUEJSON".transaction_id AS "TRANSACTION_ID", tx."VALUEJSON" AS "TRANSACTION_DETAILS", COALESCE(CAST(tx."VALUEJSON".blockNo AS NUMBER), tx."BLOCKNO") AS ORDER_BLOCKNO, COALESCE(CAST(tx."VALUEJSON".txnNo AS NUMBER), tx."TXNNO") AS ORDER_TXNNO FROM "<obpInstanceName>_<channelName>_state" tx WHERE tx."CHAINCODEID" = '<chaincodeName>' AND tx."VALUEJSON".assetType = 'otransaction' AND tx.KEY NOT LIKE '_obp2pc_' AND tx."VALUEJSON".transaction_type NOT IN ('EXECUTE_HOLD_RECEIVER', 'CREATE_ACCOUNT') AND tx."VALUEJSON".from_account_id IS NOT NULL UNION ALL SELECT tx."VALUEJSON".to_account_id AS "KEY", tx."VALUEJSON".transaction_id AS "TRANSACTION_ID", tx."VALUEJSON" AS "TRANSACTION_DETAILS", COALESCE(CAST(tx."VALUEJSON".blockNo AS NUMBER), tx."BLOCKNO") AS ORDER_BLOCKNO, COALESCE(CAST(tx."VALUEJSON".txnNo AS NUMBER), tx."TXNNO") AS ORDER_TXNNO FROM "<obpInstanceName>_<channelName>_state" tx WHERE tx."CHAINCODEID" = '<chaincodeName>' AND tx."VALUEJSON".assetType = 'otransaction' AND tx.KEY NOT LIKE '_obp2pc_' AND tx."VALUEJSON".transaction_type NOT IN ('EXECUTE_HOLD_SENDER', 'CREATE_ACCOUNT') AND tx."VALUEJSON".to_account_id IS NOT NULL
Sources de données :
<obpInstanceName>_<channelName>_state
, table d'état principale contenant les données de code chaîne au format JSONLogique de la clé :- Inclut uniquement les lignes pour lesquelles les instructions suivantes sont vraies.
CHAINCODEID = <chaincodeName>
assetType = 'otransaction'
KEY
ne commence pas par_obp2pc_
transaction_type
n'est pasEXECUTE_HOLD_RECEIVER
,EXECUTE_HOLD_SENDER
ouCREATE_ACCOUNT
- Extrait la participation des comptes des transactions sortantes (
from_account_id
) et entrantes (to_account_id
). - Utilise
COALESCE
pour garantir un ordre cohérent des colonnes (ORDER_BLOCKNO
,ORDER_TXNNO
), même si des valeurs JSON sont manquantes. - Combine les transactions sortantes et entrantes avec une valeur
UNION ALL
.
Colonnes de sortie:KEY
: ID de compte associé à la transaction (expéditeur ou destinataire).TRANSACTION_ID
: identificateur unique du mouvement.TRANSACTION_DETAILS
: objet JSON complet de la transaction.ORDER_BLOCKNO
: numéro de bloc utilisé pour le tri (à partir de JSON si disponible, sinon métadonnées de bloc).ORDER_TXNNO
: numéro de transaction dans le bloc (à partir du format JSON si disponible, sinon métadonnées de bloc).
- Inclut uniquement les lignes pour lesquelles les instructions suivantes sont vraies.
-
TRANSACTION_PDC_VIEW
- Cette vue fournit des détails sur le solde et le montant au niveau de la transaction à partir de la collecte de données privée. Il garantit que seul le dernier enregistrement par transaction est extrait.
- Requête SQL confidentielle, propriétaire système :
CREATE VIEW TRANSACTION_PDC_VIEW as SELECT sub."VALUEJSON".transaction_id AS transaction_id, sub."CHAINCODEID", sub."VALUEJSON".amount AS quantity, sub."VALUEJSON".from_account_balance AS from_account_balance, sub."VALUEJSON".from_account_onhold_balance AS from_account_onhold_balance, sub."VALUEJSON".to_account_balance AS to_account_balance, sub."VALUEJSON".to_account_onhold_balance AS to_account_onhold_balance FROM ( SELECT hist."VALUEJSON", hist."CHAINCODEID", ROW_NUMBER() OVER ( PARTITION BY hist."VALUEJSON".transaction_id ORDER BY hist.TXNTIMESTAMP DESC ) AS rn FROM "<obpInstanceName>_<channelName>_hist" hist WHERE hist."CHAINCODEID" = '${implicitPDCName}' AND hist."VALUEJSON".assetType = 'otransactionpdc' AND hist."KEY" NOT LIKE '_obp2pc_staged_%' ) sub where rn = 1 UNION ALL SELECT "TRANSACTION_ID","CHAINCODEID","QUANTITY","FROM_ACCOUNT_BALANCE","FROM_ACCOUNT_ONHOLD_BALANCE","TO_ACCOUNT_BALANCE","TO_ACCOUNT_ONHOLD_BALANCE" FROM "$TRANSACTION_PDC_VIEW"@${org1Name}_LINK UNION ALL SELECT "TRANSACTION_ID","CHAINCODEID","QUANTITY","FROM_ACCOUNT_BALANCE","FROM_ACCOUNT_ONHOLD_BALANCE","TO_ACCOUNT_BALANCE","TO_ACCOUNT_ONHOLD_BALANCE" FROM "$TRANSACTION_PDC_VIEW"@${org2Name}_LINK
Objectif : Agréger les données au sein de l'organisation via des liens de base de données.
Sources de données:<obpInstanceName>_<channelName>_hist
: table de données de code chaîne historique contenant des enregistrements de collecte de données privés$TRANSACTION_PDC_VIEW@${org1Name}_LINK
: vue distante de l'organisation 1 accessible via le lien de base de données.$TRANSACTION_PDC_VIEW@${org2Name}_LINK
: vue distante de l'organisation 2 accessible via le lien de base de données.
Logique de la clé :- Filtre uniquement les enregistrements pour lesquels les affirmations suivantes sont vraies.
CHAINCODEID = ${implicitPDCName}
assetType = 'otransactionpdc'
KEY
ne commence pas par_obp2pc_staged_.
- Utilise la fonction de fenêtre
ROW_NUMBER()
.- Partitions par
transaction_id
. - Commandes par
TXNTIMESTAMP DESC
. - Conserve uniquement le dernier enregistrement
(rn = 1)
.
- Partitions par
- Combine les données de la table d'historique de collecte de données privée locale, de la vue de collecte de données privée de l'organisation 1 (via le lien de base de données) et de la vue de collecte de données privée de l'organisation 2 (via le lien de base de données).
Colonnes de sortie:TRANSACTION_ID
: identificateur unique du mouvement.CHAINCODEID
: identificateur du code chaîne associé à l'enregistrement PDC.QUANTITY
: montant ou quantité de la transaction transférée.FROM_ACCOUNT_BALANCE
: solde du compte expéditeur après la transaction.FROM_ACCOUNT_ONHOLD_BALANCE
: solde retenu du compte de l'expéditeur après la transaction.TO_ACCOUNT_BALANCE
: solde du compte bénéficiaire après la transaction.TO_ACCOUNT_ONHOLD_BALANCE
: solde retenu du compte bénéficiaire après la transaction.
- Requête SQL confidentielle, Banque des participants :
CREATE VIEW TRANSACTION_PDC_VIEW as SELECT sub."VALUEJSON".transaction_id AS transaction_id, sub."CHAINCODEID", sub."VALUEJSON".amount AS quantity, sub."VALUEJSON".from_account_balance AS from_account_balance, sub."VALUEJSON".from_account_onhold_balance AS from_account_onhold_balance, sub."VALUEJSON".to_account_balance AS to_account_balance, sub."VALUEJSON".to_account_onhold_balance AS to_account_onhold_balance FROM ( SELECT hist."VALUEJSON", hist."CHAINCODEID", ROW_NUMBER() OVER ( PARTITION BY hist."VALUEJSON".transaction_id ORDER BY hist.TXNTIMESTAMP DESC ) AS rn FROM "<obpInstanceName>_<channelName>_hist" hist WHERE hist."CHAINCODEID" = '<implicitPDCName>' AND hist."VALUEJSON".assetType = 'otransactionpdc' AND hist."KEY" NOT LIKE '_obp2pc_staged_%' ) sub where rn = 1
Sources de données:<obpInstanceName>_<channelName>_hist
: table de données de code chaîne historique contenant des enregistrements de collecte de données privés
Logique de la clé :- Filtre uniquement les enregistrements pour lesquels les affirmations suivantes sont vraies.
CHAINCODEID = ${implicitPDCName}
assetType = 'otransactionpdc'
KEY
ne commence pas par_obp2pc_staged_.
- Utilise la fonction de fenêtre
ROW_NUMBER()
.- Partitions par
transaction_id
. - Commandes par
TXNTIMESTAMP DESC
. - Conserve uniquement le dernier enregistrement
(rn = 1)
.
- Partitions par
Colonnes de sortie:TRANSACTION_ID
: identificateur unique du mouvement.CHAINCODEID
: identificateur du code chaîne associé à l'enregistrement PDC.QUANTITY
: montant ou quantité de la transaction transférée.FROM_ACCOUNT_BALANCE
: solde du compte expéditeur après la transaction.FROM_ACCOUNT_ONHOLD_BALANCE
: solde retenu du compte de l'expéditeur après la transaction.TO_ACCOUNT_BALANCE
: solde du compte bénéficiaire après la transaction.TO_ACCOUNT_ONHOLD_BALANCE
: solde retenu du compte bénéficiaire après la transaction.
-
ACCOUNTS_VIEW
- Cette vue fournit une vue consolidée des comptes de toutes les organisations.
- Requête SQL confidentielle, propriétaire système :
CREATE VIEW ACCOUNTS_VIEW as WITH hist_ranked AS ( SELECT hist.valuejson, hist."VALUEJSON".account_id AS account_id, ROW_NUMBER() OVER ( PARTITION BY hist."VALUEJSON".account_id ORDER BY hist.TXNTIMESTAMP DESC ) AS rn FROM "<obpInstanceName>_<channelName>_hist" hist WHERE hist."CHAINCODEID" = '<implicitPDCName>' AND hist."VALUEJSON".assetType = 'oaccountpdc' ), state_filtered AS ( SELECT state.key, state.valueJSON FROM "<obpInstanceName>_<channelName>_state" state WHERE state."CHAINCODEID" = '${chaincodeName}' AND state."VALUEJSON".assetType = 'oaccount' ), token_details AS ( SELECT state.key, state.valueJson, COALESCE ( TO_NUMBER(JSON_VALUE(valuejson, '$.divisible.decimal' RETURNING VARCHAR2)), 0) AS decimal_value FROM "<obpInstanceName>_<channelName>_state" state WHERE state."CHAINCODEID" = '<chaincodeName>' AND state."VALUEJSON".assetType = 'otoken' ) SELECT s.key as account_id, s.valueJSON.org_id AS org_id, h.valuejson.user_id AS user_id, h.valuejson.custom_account_id AS custom_account_id, s.valueJSON.token_id AS token_id, t.decimal_value FROM state_filtered s LEFT JOIN hist_ranked h ON h.account_id = s.key AND h.rn = 1 LEFT JOIN token_details t ON s.valueJSON.token_id = t.key WHERE h.valuejson is not null UNION ALL SELECT "ACCOUNT_ID","ORG_ID","USER_ID","CUSTOM_ACCOUNT_ID", "TOKEN_ID", "DECIMAL_VALUE" FROM "ACCOUNTS_VIEW"@<org1Name>_LINK WHERE "USER_ID" IS NOT NULL UNION ALL SELECT "ACCOUNT_ID","ORG_ID","USER_ID","CUSTOM_ACCOUNT_ID", "TOKEN_ID", "DECIMAL_VALUE" FROM "ACCOUNTS_VIEW"@$<org2Name>_LINK WHERE "USER_ID" IS NOT NULL
Objectif : Cette vue fournit une vue consolidée des comptes de toutes les organisations, en combinant les informations suivantes.- Etat du compte actuel
- Dernières données privées liées au compte (collecte de données privées)
- Métadonnées de jeton telles que la précision décimale
- Détails des comptes interorganisations via des liens de base de données
Sources de données:<obpInstanceName>_<channelName>_hist
: données de code chaîne historiques, utilisées pour extraire l'entrée de collecte de données privée de compte la plus récente (oaccountpdc
).<obpInstanceName>_<channelName>_state
: données d'état en cours pour les comptes (oaccount
) et les jetons (otoken
).ACCOUNTS_VIEW@<org1Name>_LINK
: vue distante de l'organisation 1.ACCOUNTS_VIEW@<org2Name>_LINK
: vue distante de l'organisation 2.
Logique de la clé :hist_ranked
CTE : obtient le dernier enregistrement de collecte de données privée paraccount_id
à l'aide deROW_NUMBER()
avecORDER BY TXNTIMESTAMP DESC
.state_filtered
CTE : sélectionne les comptes (oaccount
) dans la table d'état.token_details
CTE : extrait les détails de jeton (otoken
) avec une précision décimale (0
par défaut s'il est manquant).- Jointures de sélection finale : état du compte (
state_filtered
) avec les derniers détails de collecte de données privées (hist_ranked
) et métadonnées de jeton (token_details
). - Garantit uniquement les comptes associés à une collecte de données privée (
WHERE h.valuejson IS NOT NULL
). - Etend les données de compte avec les syndicats de liens de base de données d'autres organisations.
Colonnes de sortie:ACCOUNT_ID
: identificateur unique du compte.ORG_ID
: ID d'organisation associé au compte.USER_ID
: ID utilisateur lié au compte (à partir de la collecte de données privée).CUSTOM_ACCOUNT_ID
: identificateur de compte personnalisé défini par l'utilisateur.TOKEN_ID
: identificateur de jeton associé au compte.DECIMAL_VALUE
: précision décimale du jeton (valeur par défaut : 0 s'il est manquant).
- Requête SQL confidentielle, Banque des participants :
CREATE VIEW ACCOUNTS_VIEW AS WITH hist_ranked AS ( SELECT hist.valuejson, hist."VALUEJSON".account_id AS account_id, ROW_NUMBER() OVER ( PARTITION BY hist."VALUEJSON".account_id ORDER BY hist.TXNTIMESTAMP DESC ) AS rn FROM "<obpInstanceName>_<channelName>_hist" hist WHERE hist."CHAINCODEID" = '<implicitPDCName>' AND hist."VALUEJSON".assetType = 'oaccountpdc' ), state_filtered AS ( SELECT state.key, state.valueJSON FROM "<obpInstanceName>_<channelName>_state" state WHERE state."CHAINCODEID" = '<chaincodeName>' AND state."VALUEJSON".assetType = 'oaccount' ), token_details AS ( SELECT state.key, COALESCE (TO_NUMBER(JSON_VALUE(valuejson, '$.divisible.decimal' RETURNING VARCHAR2)), 0) AS decimal_value FROM "<obpInstanceName>_<channelName>_state" state WHERE state."CHAINCODEID" = '<chaincodeName>' AND state."VALUEJSON".assetType = 'otoken' ) SELECT s.key AS account_id, s.valueJSON.org_id AS org_id, h.valuejson.user_id AS user_id, h.valuejson.custom_account_id AS custom_account_id, s.valueJSON.token_id AS token_id, t.decimal_value FROM state_filtered s LEFT JOIN hist_ranked h ON h.account_id = s.key AND h.rn = 1 LEFT JOIN token_details t ON s.valueJSON.token_id = t.key
Objectif : Cette vue fournit une vue consolidée des comptes de toutes les organisations, en combinant les informations suivantes.- Etat du compte actuel
- Dernières données privées liées au compte (collecte de données privées)
- Métadonnées de jeton telles que la précision décimale
Sources de données:<obpInstanceName>_<channelName>_hist
: données de code chaîne historiques, utilisées pour extraire l'entrée de collecte de données privée de compte la plus récente (oaccountpdc
).<obpInstanceName>_<channelName>_state
: données d'état en cours pour les comptes (oaccount
) et les jetons (otoken
).
Logique de la clé :hist_ranked
CTE : obtient le dernier enregistrement de collecte de données privée paraccount_id
à l'aide deROW_NUMBER()
avecORDER BY TXNTIMESTAMP DESC
.state_filtered
CTE : sélectionne les comptes (oaccount
) dans la table d'état.token_details
CTE : extrait les détails de jeton (otoken
) avec une précision décimale (0
par défaut s'il est manquant).- Jointures de sélection finale : état du compte (
state_filtered
) avec les derniers détails de collecte de données privées (hist_ranked
) et métadonnées de jeton (token_details
). - Garantit uniquement les comptes associés à une collecte de données privée (
WHERE h.valuejson IS NOT NULL
).
Colonnes de sortie:ACCOUNT_ID
: identificateur unique du compte.ORG_ID
: ID d'organisation associé au compte.USER_ID
: ID utilisateur lié au compte (à partir de la collecte de données privée).CUSTOM_ACCOUNT_ID
: identificateur de compte personnalisé défini par l'utilisateur.TOKEN_ID
: identificateur de jeton associé au compte.DECIMAL_VALUE
: précision décimale du jeton (valeur par défaut : 0 s'il est manquant).
-
ACCOUNTS_MOD
- Cette vue fournit une représentation structurée des données de registre de jetons fongibles, mettant en correspondance les organisations et les utilisateurs avec leurs comptes et jetons de jetons fongibles associés. Elle simplifie l'accès aux relations compte-jeton stockées à l'état de code chaîne en mettant à plat les tableaux JSON imbriqués, ce qui facilite l'utilisation des applications et des requêtes d'analyse.
- Requête SQL générique, TypeScript :
`create view ACCOUNTS_MOD as SELECT s.blockno, s.txnno, s.key, s.valuejson.assetType, s.valueJson.org_id, s.valueJson.user_id, ft.account_id, ft.token_id FROM "<obpInstanceName>_<channelName>_state" s, json_table(s.valuejson, '$.associated_ft_accounts[*]' Columns(lng_number FOR ORDINALITY, account_id varchar2 (1000) Path '$.account_id' null on empty, token_id varchar2 (16) Path '$.token_id' null on empty)) ft where s.key like '%oftregistry%' AND s.chaincodeid = '<chaincodeName>' order by s.blockno DESC, s.txnno DESC`
Sources de données:<obpInstanceName>_<channelName>_state
: table d'état principale contenant les données de code chaîne au format JSON.
Logique de la clé :- Filtrer par clé de registre : inclut uniquement les enregistrements où la clé contient
oftregistry
. - Filtrer par code chaîne : limite les résultats au code chaîne indiqué (
<chaincodeName>
). - Aplatir le fichier JSON imbriqué : utilise
JSON_TABLE
pour développer le tableauassociated_ft_accounts
en lignes distinctes pour chaque paire compte-jeton.account_id
: identificateur de compte de jeton fongible.token_id
: jeton lié au compte.lng_number
: ordinalité (utilisée en interne pour suivre l'ordre des tableaux).
- Tri : les résultats sont triés par numéro de bloc (
blockno
) et par numéro de transaction (txnno
) par ordre décroissant, ce qui garantit que les associations les plus récentes sont affichées en premier.
Colonnes de sortie:BLOCKNO
: numéro de bloc dans lequel la mise à jour du registre a été enregistrée.TXNNO
: numéro de transaction dans le bloc.KEY
: clé d'état représentant l'entrée de registre de jetons fongibles.ASSETTYPE
: type de ressource (attendu :oftregistry
).ORG_ID
: identificateur d'organisation à partir du fichier JSON.USER_ID
: identificateur utilisateur associé à l'enregistrement de registre.ACCOUNT_ID
: ID de compte de jeton fongible extrait du tableau imbriqué.TOKEN_ID
: ID de jeton extrait lié au compte de jeton fongible.
- Requête SQL générique, aller :
`create view ACCOUNTS_MOD as SELECT s.blockno, s.txnno, s.key, s.valuejson.AssetType, s.valueJson.OrgId as org_id, s.valueJson.UserId as user_id, ft.account_id, ft.token_id FROM "<obpInstanceName>_<channelName>_state" s, json_table(s.valuejson, '$.AssociatedFtAccounts[*]' Columns(lng_number FOR ORDINALITY, account_id varchar2 (1000) Path '$.AccountId' null on empty, token_id varchar2 (16) Path '$.TokenId' null on empty)) ft where s.key like '%oftregistry%' AND s.chaincodeid = '<chaincodeName>' order by s.blockno DESC, s.txnno DESC`
Cette vue est identique à la vue TypeScript de la requête SQL générique. La seule différence réside dans la convention de dénomination des champs JSON, qui utilise la casse Pascal au lieu de la minuscule.AssetType
: précédemmentassetType
OrgId
: précédemmentorg_id
UserId
: précédemmentuser_id
AssociatedFtAccounts
: précédemmentassociated_ft_accounts
AccountId
: précédemmentaccount_id
TokenId
: précédemmenttoken_id
OrgId AS org_id
) pour maintenir la cohérence des noms de colonne de sortie entre les vues. - Requête SQL confidentielle, propriétaire système :
CREATE VIEW ACCOUNTS_MOD AS SELECT "ACCOUNT_ID","ORG_ID","USER_ID","CUSTOM_ACCOUNT_ID","TOKEN_ID","DECIMAL_VALUE" FROM ( WITH hist_ranked AS ( SELECT hist.valuejson, hist."VALUEJSON".account_id AS account_id, ROW_NUMBER() OVER ( PARTITION BY hist."VALUEJSON".account_id ORDER BY hist.TXNTIMESTAMP DESC ) AS rn FROM "<obpInstanceName>_<channelName>_hist" hist WHERE hist."CHAINCODEID" = '<implicitPDCName>' AND hist."VALUEJSON".assetType = 'oaccountpdc' ), state_filtered AS ( SELECT state.key, state.valueJSON FROM "<obpInstanceName>_<channelName>_state" state WHERE state."CHAINCODEID" = '<chaincodeName>' AND state."VALUEJSON".assetType = 'oaccount' ), token_details AS ( SELECT state.key, state.valueJson, COALESCE( TO_NUMBER(JSON_VALUE(valuejson, '$.divisible.decimal' RETURNING VARCHAR2)), 0 ) AS decimal_value FROM "<obpInstanceName>_<channelName>_state" state WHERE state."CHAINCODEID" = '<chaincodeName>' AND state."VALUEJSON".assetType = 'otoken' ) SELECT s.key AS account_id, s.valueJSON.org_id AS org_id, h.valuejson.user_id AS user_id, h.valuejson.custom_account_id AS custom_account_id, s.valueJSON.token_id AS token_id, t.decimal_value FROM state_filtered s LEFT JOIN hist_ranked h ON h.account_id = s.key AND h.rn = 1 LEFT JOIN token_details t ON s.valueJSON.token_id = t.key WHERE h.valuejson IS NOT NULL ) UNION ALL SELECT "ACCOUNT_ID","ORG_ID","USER_ID","CUSTOM_ACCOUNT_ID","TOKEN_ID","DECIMAL_VALUE" FROM "ACCOUNTS_MOD"@<org1Name>_LINK UNION ALL SELECT "ACCOUNT_ID","ORG_ID","USER_ID","CUSTOM_ACCOUNT_ID","TOKEN_ID","DECIMAL_VALUE" FROM "ACCOUNTS_MOD"@<org2Name>_LINK UNION ALL SELECT "ACCOUNT_ID","ORG_ID","USER_ID","CUSTOM_ACCOUNT_ID","TOKEN_ID","DECIMAL_VALUE" FROM "ACCOUNTS_MOD"@<org3Name>_LINK;
Sources de données:<obpInstanceName>_<channelName>_hist
: table d'historique stockant les modifications chronologiques des données privées de compte (oaccountpdc
).<obpInstanceName>_<channelName>_state
: table d'état contenant l'état de code chaîne en cours au format JSON, utilisée pour les détailsoaccount
etotoken
.- Vues d'organisation distantes : des données supplémentaires provenant des vues ACCOUNTS_MOD d'autres organisations sont incluses à l'aide de liens de base de données :
"ACCOUNTS_MOD"@<org1Name>_LINK
"ACCOUNTS_MOD"@<org2Name>_LINK
"ACCOUNTS_MOD"@<org3Name>_LINK
Logique de la clé :- Classer les enregistrements historiques : utilise
ROW_NUMBER()
pour sélectionner le dernier enregistrementoaccountpdc
pour chaque ID de compte dans la table d'historique. - Filtrer les comptes en cours : extrait uniquement les enregistrements avec
assetType = 'oaccount'
de la table des états. - Rejoindre les métadonnées de jeton : ajoute la précision de jeton (
decimal_value
) en effectuant une jointure par rapport aux entréesotoken
de la table d'état. - Combiner les détails de compte : joint les enregistrements de compte filtrés à l'entrée d'historique et aux détails de jeton les plus récents. Garantit que seuls les comptes avec des données historiques valides (
h.valuejson IS NOT NULL
) sont inclus. - Union multiorganisation : utilise
UNION ALL
pour fusionner les données de compte de l'organisation locale avec plusieurs organisations distantes via des liens de base de données. Cela permet à une seule requête unifiée d'extraire tous les comptes sur le réseau.
Colonnes de sortie:ACCOUNT_ID
: identificateur unique du compte.ORG_ID
: ID organisation propriétaire du compte.USER_ID
: ID utilisateur lié au compte (à partir du dernier enregistrement historique).CUSTOM_ACCOUNT_ID
: identificateur de compte personnalisé facultatif défini par l'utilisateur.TOKEN_ID
: identificateur de jeton associé au compte.DECIMAL_VALUE
: précision décimale du jeton (valeur par défaut : 0 s'il est manquant).
Génération dynamique : la partie multiorganisation n'est pas codée en dur. Dans le script, les unions supplémentaires sont générées dynamiquement en fonction du fichier
Participant_orgs_list.yml
. Cela garantit que la vue s'adapte automatiquement en fonction du nombre d'organisations configurées dans le réseau. L'exemple de requête montre trois organisations pour plus de clarté, mais dans la pratique, le nombre d'organisations dépend de la taille deorgsList
. Pour plus d'informations, reportez-vous aux informations précédentes sur le fichierParticipant_orgs_list.yml
dans cette rubrique. - Requête SQL confidentielle, Banque des participants :
CREATE VIEW ACCOUNTS_MOD AS WITH hist_ranked AS ( SELECT hist.valuejson, hist."VALUEJSON".account_id AS account_id, ROW_NUMBER() OVER ( PARTITION BY hist."VALUEJSON".account_id ORDER BY hist.TXNTIMESTAMP DESC ) AS rn FROM "<obpInstanceName>_<channelName>_hist" hist WHERE hist."CHAINCODEID" = '<implicitPDCName>' AND hist."VALUEJSON".assetType = 'oaccountpdc' ), state_filtered AS ( SELECT state.key, state.valueJSON FROM "$<obpInstanceName>_<channelName>_state" state WHERE state."CHAINCODEID" = '<chaincodeName>' AND state."VALUEJSON".assetType = 'oaccount' ), token_details AS ( SELECT state.key, COALESCE( TO_NUMBER(JSON_VALUE(valuejson, '$.divisible.decimal' RETURNING VARCHAR2)), 0 ) AS decimal_value FROM "${stateTableName}" state WHERE state."CHAINCODEID" = '${chaincodeName}' AND state."VALUEJSON".assetType = 'otoken' ) SELECT s.key AS account_id, s.valueJSON.org_id AS org_id, h.valuejson.user_id AS user_id, h.valuejson.custom_account_id AS custom_account_id, s.valueJSON.token_id AS token_id, t.decimal_value FROM state_filtered s LEFT JOIN hist_ranked h ON h.account_id = s.key AND h.rn = 1 LEFT JOIN token_details t ON s.valueJSON.token_id = t.key WHERE h.valuejson IS NOT NULL;
Cette vue est identique à la requête SQL confidentielle, propriétaire système, mais elle extrait uniquement les données de l'organisation locale. Les principales différences sont les suivantes :- Aucune valeur
UNION ALL
avec des liens de base de données n'est utilisée. - La sortie inclut uniquement les comptes des tables d'état et d'historique de l'organisation actuelle.
- La vue fournit un registre de comptes à organisation unique, contrairement à la variante multiorganisation qui consolide les comptes dans plusieurs organisations.
- Aucune valeur
-
TRANSACTION_MOD
- Cette vue fournit un enregistrement détaillé de toutes les transactions de chaîne de blocs, capturant les métadonnées, les participants, les montants et les soldes résultants. Elle simplifie l'accès à l'historique des transactions en extrayant les champs structurés directement de la table d'historique, ce qui évite d'avoir à analyser manuellement le JSON brut.
- Requête SQL générique, TypeScript :
`create view TRANSACTION_MOD as SELECT h.blockno, h.txnno, h.key, h.txntimestamp, h.valuejson.assetType, h.valuejson.transaction_id, h.valuejson.from_account_id, h.valuejson.to_account_id, h.valuejson.transaction_type, h.valuejson.amount, h.valuejson.category as transaction_earmark, h.valuejson.from_account_balance, h.valuejson.to_account_balance FROM "<obpInstanceName>_<channelName>_hist" h where h.key like '%otransaction%' AND h.chaincodeid = '<chaincodeName>' order by h.blockno DESC, h.txnno DESC`
Sources de données :
<obpInstanceName>_<channelName>_hist
, table d'historique contenant tous les événements de transaction au format JSON. Inclut les détails de la transaction et les métadonnées associées (bloc, numéro de transaction, horodatage).Logique de la clé :- Inclut uniquement les lignes pour lesquelles les instructions suivantes sont vraies.
CHAINCODEID = <chaincodeName>
KEY
contientotransaction
(filtres pour les enregistrements liés aux transactions)
- Les résultats des prescriptions sont les suivants.
blockno DESC
(dernier bloc en premier)txnno DESC
(dernière transaction du bloc en premier)
Colonnes de sortie:BLOCKNO
: numéro de bloc dans lequel la transaction a été enregistrée.TXNNO
: numéro de transaction dans le bloc.KEY
: identifiant unique d'une entrée de transaction.TXNTIMESTAMP
: horodatage de la fin de la transaction.ASSETTYPE
: type de ressource pour la transaction (par exemple,otransaction
).TRANSACTION_ID
: identificateur unique du mouvement.FROM_ACCOUNT_ID
: ID de compte d'où provient la ressource/valeur.TO_ACCOUNT_ID
: ID de compte vers lequel la ressource/valeur a été transférée.TRANSACTION_TYPE
: type de la transaction (par exemple, transfert, débit, crédit).AMOUNT
: montant impliqué dans la transaction.TRANSACTION_EARMARK
: catégorie ou affectation de la transaction.FROM_ACCOUNT_BALANCE
: solde du compte source après la transaction.TO_ACCOUNT_BALANCE
: solde du compte de destination après la transaction.
- Inclut uniquement les lignes pour lesquelles les instructions suivantes sont vraies.
- Requête SQL générique, aller :
`create view TRANSACTION_MOD as SELECT h.blockno, h.txnno, h.key, h.txntimestamp, h.valuejson.AssetType, h.valuejson.TransactionId as transaction_id, h.valuejson.FromAccountId as from_account_id, h.valuejson.ToAccountId as to_account_id, h.valuejson.TransactionType as transaction_type, h.valuejson.Amount, h.valuejson.Category as transaction_earmark, h.valuejson.FromAccountBalance as from_account_balance, h.valuejson.ToAccountBalance as to_account_balance FROM "<obpInstanceName>_<channelName>_hist" h where h.key like '%otransaction%' AND h.chaincodeid = '<chaincodeName>' order by h.blockno DESC, h.txnno DESC`
Cette vue est identique à la vue TypeScript de la requête SQL générique. La seule différence réside dans la convention de dénomination des champs JSON, qui utilise la casse Pascal au lieu de la minuscule.AssetType
: précédemmentassetType
TransactionId
: précédemmenttransaction_id
FromAccountId
: précédemmentfrom_account_id
ToAccountId
: précédemmentto_account_id
TransactionType
: précédemmenttransaction_type
Amount
: précédemmentamount
Category
: précédemmentcategory
FromAccountBalance
: précédemmentfrom_account_balance
ToAccountBalance
: précédemmentto_account_balance
TransactionId AS transaction_id
) pour maintenir la cohérence des noms de colonne de sortie entre les vues, quelle que soit la convention de dénomination des champs JSON. - Requête SQL confidentielle, propriétaire système :
`CREATE VIEW TRANSACTION_MOD AS SELECT COALESCE(CAST(sub."VALUEJSON".blockNo AS NUMBER), sub."BLOCKNO") AS BLOCKNO, COALESCE(CAST(sub."VALUEJSON".txnNo AS NUMBER), sub."TXNNO") AS TXNNO, sub.key, sub.txntimestamp, sub.valuejson.assetType, sub.valuejson.transaction_id, sub.valuejson.from_account_id, sub.valuejson.to_account_id, sub.valuejson.transaction_type, (TO_NUMBER(sub.quantity) / POWER(10, sub.decimal_value)) as amount, sub.valuejson.category as transaction_earmark, (TO_NUMBER(sub.from_account_balance) / POWER(10, sub.decimal_value)) as from_account_balance, (TO_NUMBER(sub.to_account_balance) / POWER(10, sub.decimal_value)) as to_account_balance from ( SELECT hist.*, pdc.*, CASE WHEN hist."VALUEJSON".from_account_id IS NOT NULL THEN (SELECT DECIMAL_VALUE FROM "ACCOUNTS_MOD" WHERE ACCOUNT_ID = hist."VALUEJSON".from_account_id FETCH FIRST 1 ROW ONLY) WHEN hist."VALUEJSON".to_account_id IS NOT NULL THEN (SELECT DECIMAL_VALUE FROM "ACCOUNTS_MOD" WHERE ACCOUNT_ID = hist."VALUEJSON".to_account_id FETCH FIRST 1 ROW ONLY) ELSE 0 END AS decimal_value, ROW_NUMBER() OVER ( PARTITION BY hist."VALUEJSON".transaction_id ORDER BY hist.TXNTIMESTAMP DESC ) AS rn FROM "<obpInstanceName>_<channelName>_hist" hist LEFT JOIN "<transactionPDCViewName>" pdc ON hist.key = pdc.TRANSACTION_ID WHERE hist."CHAINCODEID" = '<chaincodeName>' AND hist."VALUEJSON".assetType = 'otransaction' AND hist."KEY" NOT LIKE '_obp2pc_staged_%' ) sub where rn = 1`
Sources de données:<obpInstanceName>_<channelName>_hist
: table historique de codes chaîne stockant toutes les versions de transaction.<transactionPDCViewName>
: vue contenant les détails de transaction de collecte de données privée, jointe pour enrichir les enregistrements de transaction.ACCOUNTS_MOD
: vue de référence utilisée pour extraire le fichierdecimal_value
correct pour les soldes de compte et les montants de transaction.
Logique de la clé :- Filtre uniquement les lignes pour lesquelles les instructions suivantes sont vraies.
CHAINCODEID = <chaincodeName>
assetType = 'otransaction'
KEY
ne commence pas par_obp2pc_staged_
- Utilise
ROW_NUMBER()
partitionné partransaction_id
(ordonné partxntimestamp DESC
) pour garantir que seul le dernier enregistrement par transaction est inclus. - Extrait dynamiquement
decimal_value
à partir deACCOUNTS_MOD
, selon que la transaction implique une valeurfrom_account_id
outo_account_id
. - Les montants et les soldes (
amount
,from_account_balance
,to_account_balance
) sont mis à l'échelle par précision décimale à l'aide de :value / POWER(10, decimal_value)
- Utilise
COALESCE
surblockNo
ettxnNo
pour s'assurer que les colonnes de tri sont toujours présentes, même si elles sont manquantes dans JSON.
Colonnes de sortie:BLOCKNO
: numéro de bloc pour le tri (à partir de JSON si disponible, sinon à partir des métadonnées).TXNNO
: numéro de transaction dans le bloc (à partir du format JSON si disponible, sinon à partir des métadonnées).KEY
: identificateur de clé de transaction.TXNTIMESTAMP
: horodatage de la transaction.ASSETTYPE
: type de ressource (otransaction
).TRANSACTION_ID
: identificateur unique du mouvement.FROM_ACCOUNT_ID
: ID de compte à partir duquel les jetons ont été envoyés.TO_ACCOUNT_ID
: ID de compte auquel les jetons ont été envoyés.TRANSACTION_TYPE
: type de la transaction (par exemple, transfert, blocage, déblocage).AMOUNT
: montant de transaction, mis à l'échelle par précision décimale de jeton.TRANSACTION_EARMARK
: catégorie ou affectation de la transaction.FROM_ACCOUNT_BALANCE
: solde du compte de l'expéditeur après la transaction, mis à l'échelle par précision.TO_ACCOUNT_BALANCE
: solde du compte du destinataire après la transaction, mis à l'échelle par précision.
- Requête SQL confidentielle, Banque des participants :
`CREATE VIEW TRANSACTION_MOD AS SELECT COALESCE(CAST(sub."VALUEJSON".blockNo AS NUMBER), sub."BLOCKNO") AS BLOCKNO, COALESCE(CAST(sub."VALUEJSON".txnNo AS NUMBER), sub."TXNNO") AS TXNNO, sub.key, sub.txntimestamp, sub.valuejson.assetType, sub.valuejson.transaction_id, sub.valuejson.from_account_id, sub.valuejson.to_account_id, sub.valuejson.transaction_type, (TO_NUMBER(sub.quantity) / POWER(10, sub.decimal_value)) as amount, sub.valuejson.category as transaction_earmark, (TO_NUMBER(sub.from_account_balance) / POWER(10, sub.decimal_value)) as from_account_balance, (TO_NUMBER(sub.to_account_balance) / POWER(10, sub.decimal_value)) as to_account_balance from ( SELECT hist.*, pdc.*, CASE WHEN hist."VALUEJSON".from_account_id IS NOT NULL THEN (SELECT DECIMAL_VALUE FROM "ACCOUNTS_MOD" WHERE ACCOUNT_ID = hist."VALUEJSON".from_account_id FETCH FIRST 1 ROW ONLY) WHEN hist."VALUEJSON".to_account_id IS NOT NULL THEN (SELECT DECIMAL_VALUE FROM "ACCOUNTS_MOD" WHERE ACCOUNT_ID = hist."VALUEJSON".to_account_id FETCH FIRST 1 ROW ONLY) ELSE 0 END AS decimal_value, ROW_NUMBER() OVER ( PARTITION BY hist."VALUEJSON".transaction_id ORDER BY hist.TXNTIMESTAMP DESC ) AS rn FROM "<obpInstanceName>_<channelName>_hist" hist LEFT JOIN "<transactionPDCViewName>" pdc ON hist.key = pdc.TRANSACTION_ID WHERE hist."CHAINCODEID" = '<chaincodeName>' AND hist."VALUEJSON".assetType = 'otransaction' AND hist."KEY" NOT LIKE '_obp2pc_staged_%' ) sub where rn = 1`
Sources de données:<obpInstanceName>_<channelName>_hist
: table de codes chaîne historique contenant toutes les versions de transaction au format JSON.<transactionPDCViewName>
: vue de collecte de données privée qui contient les données privées de niveau transaction. Il est joint à l'historique pour enrichir l'enregistrement de transaction.ACCOUNTS_MOD
: vue utilisée pour extraire la précision décimale de jeton correcte (decimal_value
) pour les comptes impliqués dans des transactions.
Logique de la clé :- Filtre uniquement les lignes pour lesquelles les instructions suivantes sont vraies.
CHAINCODEID = <chaincodeName>
assetType = 'otransaction'
- Exclut les transactions intermédiaires (
KEY NOT LIKE '_obp2pc_staged_%'
)
- Redimensionnement décimal : extrait
decimal_value
de façon dynamique à partir deACCOUNTS_MOD
, en fonction defrom_account_id
outo_account_id
. Applique le redimensionnement àamount
,from_account_balance
etto_account_balance
à l'aide de :value / POWER(10, decimal_value)
- Sélection d'enregistrement : utilise
ROW_NUMBER()
partitionné partransaction_id
(dernière version parTXNTIMESTAMP
) pour garantir que seule la dernière version de chaque transaction est renvoyée. - Normalisation des données :
COALESCE
est appliqué surblockNo
ettxnNo
pour assurer la cohérence, même si les valeurs sont manquantes dans la charge utile JSON.
Colonnes de sortie:BLOCKNO
: numéro de bloc utilisé pour le tri (à partir de JSON si disponible, sinon à partir des métadonnées).TXNNO
: numéro de transaction dans le bloc (à partir du format JSON si disponible, sinon à partir des métadonnées).KEY
: identificateur de clé de transaction.TXNTIMESTAMP
: horodatage de la transaction.ASSETTYPE
: type de ressource (otransaction
).TRANSACTION_ID
: identificateur unique du mouvement.FROM_ACCOUNT_ID
: ID de compte envoyant des jetons.TO_ACCOUNT_ID
: ID de compte recevant des jetons.TRANSACTION_TYPE
: type de la transaction (par exemple, transfert, blocage, déblocage).AMOUNT
: montant de transaction normalisé à l'aide de la précision décimale du jeton.TRANSACTION_EARMARK
: catégorie ou affectation de la transaction.FROM_ACCOUNT_BALANCE
: solde du compte expéditeur après la transaction (ajusté à la précision).TO_ACCOUNT_BALANCE
: solde du compte bénéficiaire après la transaction (ajusté à la précision).
-
ACCOUNTS_TRANSACTION_MOD
- Cette vue étend l'historique des transactions en associant chaque transaction aux ID organisation des comptes participants. Il prend en charge les approbations d'utilisation, les approbations d'utilisation et les transferts réguliers, ce qui garantit que les transactions incluent à la fois le contexte au niveau du compte et au niveau de l'organisation.
- Requête SQL générique, TypeScript et Go :
`create view ACCOUNTS_TRANSACTION_MOD as SELECT DISTINCT TRANSACTION_ID, A.BLOCKNO, FROM_ACCOUNT_ID, TO_ACCOUNT_ID, A.TRANSACTION_EARMARK EARMARK, B.ORG_ID FROM_ORG_ID, B.ORG_ID TO_ORG_ID, TRANSACTION_TYPE, AMOUNT, A.TXNTIMESTAMP CRDATE FROM <transactionViewName> A, <accountsViewName> B WHERE A.FROM_ACCOUNT_ID=B.ACCOUNT_ID AND A.TRANSACTION_TYPE='APPROVE_BURN' UNION SELECT DISTINCT TRANSACTION_ID, A.BLOCKNO, FROM_ACCOUNT_ID, TO_ACCOUNT_ID, A.TRANSACTION_EARMARK EARMARK, C.ORG_ID FROM_ORG_ID, C.ORG_ID TO_ORG_ID, TRANSACTION_TYPE, AMOUNT, A.TXNTIMESTAMP CRDATE FROM <transactionViewName> A, <accountsViewName> C WHERE A.TO_ACCOUNT_ID=C.ACCOUNT_ID AND A.TRANSACTION_TYPE='APPROVE_MINT' UNION SELECT DISTINCT TRANSACTION_ID, A.BLOCKNO, FROM_ACCOUNT_ID, TO_ACCOUNT_ID, A.TRANSACTION_EARMARK EARMARK, B.ORG_ID FROM_ORG_ID, C.ORG_ID TO_ORG_ID, TRANSACTION_TYPE, AMOUNT, A.TXNTIMESTAMP CRDATE FROM <transactionViewName> A, <accountsViewName> B, <accountsViewName> C WHERE A.FROM_ACCOUNT_ID=B.ACCOUNT_ID AND A.TO_ACCOUNT_ID=C.ACCOUNT_ID ORDER BY BLOCKNO DESC`
Sources de données:<transactionViewName> (A)
: fournit des détails de transaction de base tels que les ID, les numéros de bloc, les comptes, les montants et les horodatages.<accountsViewName> (B, C)
: mappe les comptes (ACCOUNT_ID
) avec les organisations (ORG_ID
) pour l'expéditeur et le destinataire.
Logique de la clé : la vue est créée à l'aide d'unUNION
de trois cas :APPROVE_BURN
- Rejoignez
FROM_ACCOUNT_ID = B.ACCOUNT_ID
. - Affectez
B.ORG_ID
à la fois àFROM_ORG_ID
et àTO_ORG_ID
.
- Rejoignez
APPROVE_MINT
- Rejoignez
TO_ACCOUNT_ID = C.ACCOUNT_ID
. - Affectez
C.ORG_ID
à la fois àFROM_ORG_ID
et àTO_ORG_ID
.
- Rejoignez
- Transferts réguliers
- Rejoignez
FROM_ACCOUNT_ID = B.ACCOUNT_ID
etTO_ACCOUNT_ID = C.ACCOUNT_ID
. - Affectez
B.ORG_ID
en tant queFROM_ORG_ID
etC.ORG_ID
en tant queTO_ORG_ID
.
- Rejoignez
BLOCKNO DESC
pour hiérarchiser les dernières transactions.Colonnes de sortie:TRANSACTION_ID
: identificateur unique du mouvement.BLOCKNO
: numéro de bloc dans lequel la transaction a été enregistrée.FROM_ACCOUNT_ID
: ID de compte de l'expéditeur.TO_ACCOUNT_ID
: ID de compte du destinataire.EARMARK
: catégorie d'espace réservé aux transactions (alias deTRANSACTION_EARMARK
).FROM_ORG_ID
: ID d'organisation du compte de l'expéditeur (ou identique àTO
pour Burn).TO_ORG_ID
: ID d'organisation du compte du destinataire (ou identique àFROM
pour mint).TRANSACTION_TYPE
: type de la transaction (APPROVE_BURN
,APPROVE_MINT
ou transfert).AMOUNT
: montant des transactions.CRDATE
: date de création de la transaction (à partir deTXNTIMESTAMP
).
- Requête SQL confidentielle, propriétaire système et banque du participant :
`CREATE VIEW ACCOUNTS_TRANSACTION_MOD AS SELECT DISTINCT TRANSACTION_ID, A.BLOCKNO, FROM_ACCOUNT_ID, TO_ACCOUNT_ID, A.TRANSACTION_EARMARK EARMARK, B.ORG_ID FROM_ORG_ID, B.ORG_ID TO_ORG_ID, TRANSACTION_TYPE, AMOUNT, A.TXNTIMESTAMP CRDATE FROM "<transactionViewName>" A, "<accountsViewName>" B WHERE A.FROM_ACCOUNT_ID=B.ACCOUNT_ID AND A.TO_ACCOUNT_ID IS NULL AND A.TRANSACTION_TYPE != 'CREATE_ACCOUNT' UNION SELECT DISTINCT TRANSACTION_ID, A.BLOCKNO, FROM_ACCOUNT_ID, TO_ACCOUNT_ID, A.TRANSACTION_EARMARK EARMARK, C.ORG_ID FROM_ORG_ID, C.ORG_ID TO_ORG_ID, TRANSACTION_TYPE, AMOUNT, A.TXNTIMESTAMP CRDATE FROM "<transactionViewName>" A, "<accountsViewName>" C WHERE A.TO_ACCOUNT_ID=C.ACCOUNT_ID AND A.FROM_ACCOUNT_ID IS NULL UNION SELECT DISTINCT TRANSACTION_ID, A.BLOCKNO, FROM_ACCOUNT_ID, TO_ACCOUNT_ID, A.TRANSACTION_EARMARK EARMARK, B.ORG_ID FROM_ORG_ID, C.ORG_ID TO_ORG_ID, TRANSACTION_TYPE, AMOUNT, A.TXNTIMESTAMP CRDATE FROM "<transactionViewName>" A, "<accountsViewName>" B, "<accountsViewName>" C WHERE A.FROM_ACCOUNT_ID=B.ACCOUNT_ID AND A.TO_ACCOUNT_ID=C.ACCOUNT_ID ORDER BY BLOCKNO DESC
Sources de données:<transactionViewName> (A)
: fournit des données de niveau transaction (ID, numéros de bloc, références de compte, montants, horodatages).<accountsViewName> (B, C)
: fournit un mapping entreACCOUNT_ID
etORG_ID
.
Logique clé : la vue utiliseUNION
pour fusionner les résultats de trois modèles de transaction :- Transactions de l'expéditeur uniquement (par exemple, caisses sortantes ou de type brûlure)
- Condition :
A.FROM_ACCOUNT_ID = B.ACCOUNT_ID
etA.TO_ACCOUNT_ID IS NULL
. - Exclut le type de transaction
CREATE_ACCOUNT
. FROM_ORG_ID
etTO_ORG_ID
sont dérivés de l'organisation de l'expéditeur (B.ORG_ID
).
- Condition :
- Transactions destinées au destinataire uniquement (par exemple, cas entrants ou de type menthe)
- Condition :
A.TO_ACCOUNT_ID = C.ACCOUNT_ID
etA.FROM_ACCOUNT_ID IS NULL
. FROM_ORG_ID
etTO_ORG_ID
sont tous deux dérivés de l'organisation du destinataire (C.ORG_ID
).
- Condition :
- Transferts standard (transactions avec expéditeur et destinataire)
- Condition :
A.FROM_ACCOUNT_ID = B.ACCOUNT_ID
etA.TO_ACCOUNT_ID = C.ACCOUNT_ID
. FROM_ORG_ID
provient de l'organisation de l'expéditeur (B.ORG_ID
),TO_ORG_ID
de l'organisation du destinataire (C.ORG_ID
).
- Condition :
BLOCKNO
pour hiérarchiser les dernières transactions.Colonnes de sortie:TRANSACTION_ID
: identificateur unique du mouvement.BLOCKNO
: numéro de bloc dans lequel la transaction est enregistrée.FROM_ACCOUNT_ID
: ID de compte de l'expéditeur (peut êtreNULL
pour mint).TO_ACCOUNT_ID
: ID de compte du destinataire (peut êtreNULL
pour burn).EARMARK
: affectation de transaction (alias deTRANSACTION_EARMARK
).FROM_ORG_ID
: ID organisation de l'expéditeur (ou identique au destinataire si l'expéditeur estNULL
).TO_ORG_ID
: ID d'organisation du destinataire (ou identique à l'expéditeur si le destinataire estNULL
).TRANSACTION_TYPE
: type de la transaction (par exemple, transfert, menthe, gravure, etc.).AMOUNT
: montant des transactions.CRDATE
: horodatage de création de transaction (TXNTIMESTAMP
).