Vordefinierte Ansichten
Die Oracle Blockchain Platform Digital Assets Edition bietet die folgenden vordefinierten Datenbankansichten.
-
ACCOUNT_TRANSACTION_VIEW
- Diese Ansicht bietet eine einheitliche Transaktionshistorie pro Konto und erfasst sowohl Soll- (
from_account_id
) als auch Haben- (to_account_id
) Seiten einer Transaktion. Mit dieser Ansicht können Sie alle Transaktionen abfragen, die mit einem Konto verknüpft sind, ohne Raw Chaincode-Statusdaten zu scannen. - Vertrauliche SQL-Abfrage, Systemeigentümer:
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
Datenquellen:
<obpInstanceName>_<channelName>_state
, die primäre Statustabelle mit Chaincode-Daten im JSON-FormatSchlüssellogik:- Enthält nur Zeilen, bei denen die folgenden Anweisungen wahr sind.
CHAINCODEID = <chaincodeName>
assetType = 'otransaction'
KEY
beginnt nicht mit_obp2pc_
transaction_type
ist nichtEXECUTE_HOLD_RECEIVER
,EXECUTE_HOLD_SENDER
oderCREATE_ACCOUNT
- Extrahiert die Kontobeteiligung aus ausgehenden Transaktionen (
from_account_id
) und eingehenden Transaktionen (to_account_id
). - Verwendet
COALESCE
, um eine konsistente Sortierung von Spalten (ORDER_BLOCKNO
,ORDER_TXNNO
) sicherzustellen, auch wenn JSON-Werte fehlen. - Kombiniert ausgehende und eingehende Transaktionen mit einer
UNION ALL
.
Ausgabespalten:KEY
: Konto-ID, die der Transaktion zugeordnet ist (Absender oder Empfänger).TRANSACTION_ID
: Eindeutige Kennung der Transaktion.TRANSACTION_DETAILS
: Vollständiges JSON-Objekt der Transaktion.ORDER_BLOCKNO
: Für die Bestellung verwendete Blocknummer (falls verfügbar aus JSON, sonst Blockmetadaten).ORDER_TXNNO
: Transaktionsnummer im Block (falls verfügbar aus JSON, sonst Blockmetadaten).
- Enthält nur Zeilen, bei denen die folgenden Anweisungen wahr sind.
- Daten SourcesConfidential SQL-Abfrage, Teilnehmerbank:
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
Datenquellen:
<obpInstanceName>_<channelName>_state
, die primäre Statustabelle mit Chaincode-Daten im JSON-FormatSchlüssellogik:- Enthält nur Zeilen, bei denen die folgenden Anweisungen wahr sind.
CHAINCODEID = <chaincodeName>
assetType = 'otransaction'
KEY
beginnt nicht mit_obp2pc_
transaction_type
ist nichtEXECUTE_HOLD_RECEIVER
,EXECUTE_HOLD_SENDER
oderCREATE_ACCOUNT
- Extrahiert die Kontobeteiligung aus ausgehenden Transaktionen (
from_account_id
) und eingehenden Transaktionen (to_account_id
). - Verwendet
COALESCE
, um eine konsistente Sortierung von Spalten (ORDER_BLOCKNO
,ORDER_TXNNO
) sicherzustellen, auch wenn JSON-Werte fehlen. - Kombiniert ausgehende und eingehende Transaktionen mit einer
UNION ALL
.
Ausgabespalten:KEY
: Konto-ID, die der Transaktion zugeordnet ist (Absender oder Empfänger).TRANSACTION_ID
: Eindeutige Kennung der Transaktion.TRANSACTION_DETAILS
: Vollständiges JSON-Objekt der Transaktion.ORDER_BLOCKNO
: Für die Bestellung verwendete Blocknummer (falls verfügbar aus JSON, sonst Blockmetadaten).ORDER_TXNNO
: Transaktionsnummer im Block (falls verfügbar aus JSON, sonst Blockmetadaten).
- Enthält nur Zeilen, bei denen die folgenden Anweisungen wahr sind.
-
TRANSACTION_PDC_VIEW
- Diese Ansicht bietet Salden- und Betragsdetails auf Transaktionsebene aus der privaten Datenerfassung. Dadurch wird sichergestellt, dass nur der letzte Datensatz pro Transaktion abgerufen wird.
- Vertrauliche SQL-Abfrage, Systemeigentümer:
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
Zweck: Aggregiert Daten im gesamten Unternehmen über Datenbanklinks.
Datenquellen:<obpInstanceName>_<channelName>_hist
: die historische Chaincode-Datentabelle mit privaten Datenerfassungsdatensätzen$TRANSACTION_PDC_VIEW@${org1Name}_LINK
: Remoteansicht von Organisation 1, auf die über Datenbanklink zugegriffen wird.$TRANSACTION_PDC_VIEW@${org2Name}_LINK
: Remoteansicht von Organisation 2, auf die über Datenbanklink zugegriffen wird.
Schlüssellogik:- Filtert nur Datensätze, bei denen die folgenden Aussagen wahr sind.
CHAINCODEID = ${implicitPDCName}
assetType = 'otransactionpdc'
KEY
beginnt nicht mit_obp2pc_staged_.
- Verwendet die Fensterfunktion
ROW_NUMBER()
.- Partitionen nach
transaction_id
. - Bestellungen über
TXNTIMESTAMP DESC
. - Behält nur den letzten Datensatz
(rn = 1)
bei.
- Partitionen nach
- Kombiniert Daten aus der Historientabelle der lokalen privaten Datenerfassung, der privaten Datenerfassungsansicht der Organisation 1 (über Datenbanklink) und der privaten Datenerfassungsansicht der Organisation 2 (über Datenbanklink).
Ausgabespalten:TRANSACTION_ID
: Eindeutige Kennung der Transaktion.CHAINCODEID
: ID des Chaincodes, der dem PDC-Datensatz zugeordnet ist.QUANTITY
: Transaktionsbetrag oder übertragene Menge.FROM_ACCOUNT_BALANCE
: Saldo des Absenderkontos nach der Transaktion.FROM_ACCOUNT_ONHOLD_BALANCE
: Saldo des Absenderkontos nach der Transaktion gesperrt.TO_ACCOUNT_BALANCE
: Saldo des Empfängerkontos nach der Transaktion.TO_ACCOUNT_ONHOLD_BALANCE
: Der Saldo des Empfängerkontos nach der Transaktion.
- Vertrauliche SQL-Abfrage, Teilnehmerbank:
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
Datenquellen:<obpInstanceName>_<channelName>_hist
: die historische Chaincode-Datentabelle mit privaten Datenerfassungsdatensätzen
Schlüssellogik:- Filtert nur Datensätze, bei denen die folgenden Aussagen wahr sind.
CHAINCODEID = ${implicitPDCName}
assetType = 'otransactionpdc'
KEY
beginnt nicht mit_obp2pc_staged_.
- Verwendet die Fensterfunktion
ROW_NUMBER()
.- Partitionen nach
transaction_id
. - Bestellungen über
TXNTIMESTAMP DESC
. - Behält nur den letzten Datensatz
(rn = 1)
bei.
- Partitionen nach
Ausgabespalten:TRANSACTION_ID
: Eindeutige Kennung der Transaktion.CHAINCODEID
: ID des Chaincodes, der dem PDC-Datensatz zugeordnet ist.QUANTITY
: Transaktionsbetrag oder übertragene Menge.FROM_ACCOUNT_BALANCE
: Saldo des Absenderkontos nach der Transaktion.FROM_ACCOUNT_ONHOLD_BALANCE
: Saldo des Absenderkontos nach der Transaktion gesperrt.TO_ACCOUNT_BALANCE
: Saldo des Empfängerkontos nach der Transaktion.TO_ACCOUNT_ONHOLD_BALANCE
: Der Saldo des Empfängerkontos nach der Transaktion.
-
ACCOUNTS_VIEW
- Diese Ansicht bietet eine konsolidierte Ansicht der Konten über Organisationen hinweg.
- Vertrauliche SQL-Abfrage, Systemeigentümer:
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
Zweck: Diese Ansicht bietet eine konsolidierte Ansicht der Konten über Organisationen hinweg und kombiniert die folgenden Informationen.- Aktueller Kontostand
- Letzte kontoverwandte private Daten (private Datenerfassung)
- Tokenmetadaten wie Dezimalstellen
- Unternehmensübergreifende Kontodetails über Datenbanklinks
Datenquellen:<obpInstanceName>_<channelName>_hist
: historische Chaincode-Daten, die zum Abrufen des letzten privaten Datenerfassungseintrags des Accounts verwendet werden (oaccountpdc
).<obpInstanceName>_<channelName>_state
: Aktuelle Statusdaten für Accounts (oaccount
) und Token (otoken
).ACCOUNTS_VIEW@<org1Name>_LINK
: Remoteansicht aus Organisation 1.ACCOUNTS_VIEW@<org2Name>_LINK
: Remoteansicht aus Organisation 2.
Schlüssellogik:hist_ranked
CTE: Ruft den neuesten privaten Datenerfassungsdatensatz proaccount_id
mitROW_NUMBER()
undORDER BY TXNTIMESTAMP DESC
ab.state_filtered
CTE: Wählt Accounts (oaccount
) aus der Statustabelle aus.token_details
CTE: Ruft Tokendetails (otoken
) mit Dezimalstellen ab (Standardwert0
, falls fehlt).- Endgültige Auswahl verknüpft: Accountstatus (
state_filtered
) mit den neuesten Details zur privaten Datenerfassung (hist_ranked
) und Tokenmetadaten (token_details
). - Stellt nur Accounts mit zugehöriger privater Datenerfassung sicher (
WHERE h.valuejson IS NOT NULL
). - Erweitert Account-Daten um Datenbank-Link-Gewerkschaften anderer Organisationen.
Ausgabespalten:ACCOUNT_ID
: Eindeutige ID des Accounts.ORG_ID
: Organisations-ID, die dem Account zugeordnet ist.USER_ID
: Mit dem Konto verknüpfte Benutzer-ID (aus privater Datenerfassung).CUSTOM_ACCOUNT_ID
: Benutzerdefinierte Account-ID.TOKEN_ID
: Token-ID, die mit dem Account verknüpft ist.DECIMAL_VALUE
: Dezimalstellen für Token (standardmäßig 0, wenn fehlt).
- Vertrauliche SQL-Abfrage, Teilnehmerbank:
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
Zweck: Diese Ansicht bietet eine konsolidierte Ansicht der Konten über Organisationen hinweg und kombiniert die folgenden Informationen.- Aktueller Kontostand
- Letzte kontoverwandte private Daten (private Datenerfassung)
- Tokenmetadaten wie Dezimalstellen
Datenquellen:<obpInstanceName>_<channelName>_hist
: historische Chaincode-Daten, die zum Abrufen des letzten privaten Datenerfassungseintrags des Accounts verwendet werden (oaccountpdc
).<obpInstanceName>_<channelName>_state
: Aktuelle Statusdaten für Accounts (oaccount
) und Token (otoken
).
Schlüssellogik:hist_ranked
CTE: Ruft den neuesten privaten Datenerfassungsdatensatz proaccount_id
mitROW_NUMBER()
undORDER BY TXNTIMESTAMP DESC
ab.state_filtered
CTE: Wählt Accounts (oaccount
) aus der Statustabelle aus.token_details
CTE: Ruft Tokendetails (otoken
) mit Dezimalstellen ab (Standardwert0
, falls fehlt).- Endgültige Auswahl verknüpft: Accountstatus (
state_filtered
) mit den neuesten Details zur privaten Datenerfassung (hist_ranked
) und Tokenmetadaten (token_details
). - Stellt nur Accounts mit zugehöriger privater Datenerfassung sicher (
WHERE h.valuejson IS NOT NULL
).
Ausgabespalten:ACCOUNT_ID
: Eindeutige ID des Kontos.ORG_ID
: Organisations-ID, die dem Account zugeordnet ist.USER_ID
: Mit dem Konto verknüpfte Benutzer-ID (aus privater Datenerfassung).CUSTOM_ACCOUNT_ID
: Benutzerdefinierte Account-ID.TOKEN_ID
: Token-ID, die mit dem Account verknüpft ist.DECIMAL_VALUE
: Dezimalstellen für Token (standardmäßig 0, wenn fehlt).
-
ACCOUNTS_MOD
- Diese Ansicht bietet eine strukturierte Darstellung von fungiblen Token-Registry-Daten, die Organisationen und Benutzer den zugehörigen fungiblen Tokenaccounts und Token zuordnen. Es vereinfacht den Zugriff auf Account-Token-Beziehungen, die im Chaincode-Status gespeichert sind, indem verschachtelte JSON-Arrays vereinfacht werden, sodass Anwendungen und Analyseabfragen einfacher konsumiert werden können.
- Allgemeine SQL-Abfrage, 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`
Datenquellen:<obpInstanceName>_<channelName>_state
: Die primäre Statustabelle mit Chaincode-Daten im JSON-Format.
Schlüssellogik:- Nach Registry-Schlüssel filtern: Enthält nur Datensätze, in denen der Schlüssel
oftregistry
enthält. - Filtern nach Chaincode: Schränkt die Ergebnisse auf den angegebenen Chaincode ein (
<chaincodeName>
). - Verschachteltes JSON vereinfachen: Verwendet
JSON_TABLE
, um das Arrayassociated_ft_accounts
in separate Zeilen für jedes Account-Tokenpaar einzublenden.account_id
: Fungible Token-Account-ID.token_id
: Mit dem Account verknüpftes Token.lng_number
: Ordinalität (wird intern zum Verfolgen der Arrayreihenfolge verwendet).
- Reihenfolge: Die Ergebnisse werden nach Blocknummer (
blockno
) und Transaktionsnummer (txnno
) in absteigender Reihenfolge sortiert, um sicherzustellen, dass die neuesten Zuordnungen zuerst angezeigt werden.
Ausgabespalten:BLOCKNO
: Blocknummer, in der die Registry-Aktualisierung aufgezeichnet wurde.TXNNO
: Transaktionsnummer im Block.KEY
: Statusschlüssel, der den Eintrag der fungiblen Token-Registry darstellt.ASSETTYPE
: Typ des Assets (erwartet:oftregistry
).ORG_ID
: Organisations-ID aus der JSON.USER_ID
: Mit dem Registrierungsdatensatz verknüpfte Benutzer-ID.ACCOUNT_ID
: Fungible Token-Account-ID aus dem verschachtelten Array extrahiert.TOKEN_ID
: Extrahierte Token-ID, die mit dem fungiblen Tokenaccount verknüpft ist.
- Allgemeine SQL-Abfrage, Los:
`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`
Diese View entspricht der allgemeinen SQL-Abfrage TypeScript-View. Der einzige Unterschied besteht in der JSON-Feldbenennungskonvention, die Pascal-Kleinschreibung anstelle von Kleinbuchstaben verwendet.AssetType
: vorherassetType
OrgId
: vorherorg_id
UserId
: vorheruser_id
AssociatedFtAccounts
: vorherassociated_ft_accounts
AccountId
: vorheraccount_id
TokenId
: vorhertoken_id
OrgId AS org_id
), um die Konsistenz der Ausgabespaltennamen über Ansichten hinweg zu gewährleisten. - Vertrauliche SQL-Abfrage, Systemeigentümer:
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;
Datenquellen:<obpInstanceName>_<channelName>_hist
: Historientabelle, in der die chronologischen Änderungen der privaten Accountdaten gespeichert werden (oaccountpdc
).<obpInstanceName>_<channelName>_state
: Statustabelle mit dem aktuellen Chaincode-Status im JSON-Format, die füroaccount
- undotoken
-Details verwendet wird.- Remote-Organisationsansichten: Zusätzliche Daten aus ACCOUNTS_MOD-Ansichten in anderen Organisationen werden über Datenbanklinks eingeschlossen:
"ACCOUNTS_MOD"@<org1Name>_LINK
"ACCOUNTS_MOD"@<org2Name>_LINK
"ACCOUNTS_MOD"@<org3Name>_LINK
Schlüssellogik:- Historische Datensätze einstufen: Verwendet
ROW_NUMBER()
, um den letztenoaccountpdc
-Datensatz für jede Konto-ID aus der Historientabelle auszuwählen. - Aktuelle Konten filtern: Ruft nur Datensätze mit
assetType = 'oaccount'
aus der Statustabelle ab. - Join-Tokenmetadaten: Fügt die Tokengenauigkeit (
decimal_value
) hinzu, indem sie mitotoken
-Einträgen in der Statustabelle verknüpft wird. - Kontodetails kombinieren: Verknüpft gefilterte Kontodatensätze mit dem letzten Historieneintrag und den Tokendetails. Stellt sicher, dass nur Konten mit gültigen historischen Daten (
h.valuejson IS NOT NULL
) eingeschlossen werden. - MultiOrg-Gewerkschaft: Verwendet
UNION ALL
, um Kontodaten aus der lokalen Organisation mit mehreren Remote-Organisationen über Datenbanklinks zusammenzuführen. Dadurch kann eine einzige einheitliche Abfrage alle Konten im gesamten Netzwerk abrufen.
Ausgabespalten:ACCOUNT_ID
: Eindeutige ID des Kontos.ORG_ID
: Organisations-ID, die Eigentümer des Accounts ist.USER_ID
: Mit dem Konto verknüpfte Benutzer-ID (aus dem letzten historischen Datensatz).CUSTOM_ACCOUNT_ID
: Optionale benutzerdefinierte Account-ID.TOKEN_ID
: Token-ID, die mit dem Account verknüpft ist.DECIMAL_VALUE
: Dezimalstellen für Token (standardmäßig 0, wenn fehlt).
Dynamische Generierung: Das Multiorganisationsteil ist nicht fest codiert. Im Skript werden die zusätzlichen Gewerkschaften basierend auf der Datei
Participant_orgs_list.yml
dynamisch generiert. Dadurch wird sichergestellt, dass sich die Ansicht automatisch anpasst, je nachdem, wie viele Organisationen im Netzwerk konfiguriert sind. Die Beispielabfrage zeigt aus Gründen der Übersichtlichkeit drei Organisationen, in der Praxis hängt die Anzahl der Gewerkschaften jedoch von der Größe vonorgsList
ab. Weitere Details finden Sie in den vorherigen Informationen zur DateiParticipant_orgs_list.yml
in diesem Thema. - Vertrauliche SQL-Abfrage, Teilnehmerbank:
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;
Diese View entspricht der vertraulichen SQL-Abfrage und dem Systemeigentümer, ruft jedoch nur Daten für die lokale Organisation ab. Die Hauptunterschiede sind:- Es wird kein
UNION ALL
mit Datenbanklinks verwendet. - Die Ausgabe enthält nur Konten aus den Status- und Historientabellen der aktuellen Organisation.
- Die Ansicht bietet eine Kontenregistrierung mit einer Organisation, im Gegensatz zu der Variante mit mehreren Organisationen, bei der Konten über mehrere Organisationen hinweg konsolidiert werden.
- Es wird kein
-
TRANSACTION_MOD
- Diese Ansicht enthält einen detaillierten Datensatz aller Blockchain-Transaktionen, in dem Metadaten, Teilnehmer, Beträge und daraus resultierende Salden erfasst werden. Es vereinfacht den Zugriff auf die Transaktionshistorie, indem strukturierte Felder direkt aus der Historientabelle extrahiert werden, sodass Raw-JSON nicht mehr manuell geparst werden muss.
- Allgemeine SQL-Abfrage, 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`
Datenquellen:
<obpInstanceName>_<channelName>_hist
, die Historientabelle mit allen Transaktionsereignissen im JSON-Format. Umfasst sowohl die Transaktionsdetails als auch die zugehörigen Metadaten (Block, Transaktionsnummer, Zeitstempel).Schlüssellogik:- Enthält nur Zeilen, bei denen die folgenden Anweisungen wahr sind.
CHAINCODEID = <chaincodeName>
KEY
enthältotransaction
(Filter für transaktionsbezogene Datensätze)
- Anforderungen führen zu folgenden Ergebnissen:
blockno DESC
(letzter Block zuerst)txnno DESC
(letzte Transaktion innerhalb des Blocks zuerst)
Ausgabespalten:BLOCKNO
: Blocknummer, in der die Transaktion aufgezeichnet wurde.TXNNO
: Transaktionsnummer im Block.KEY
: Eindeutige Kennung der Transaktionseingabe.TXNTIMESTAMP
: Zeitstempel, als die Transaktion abgeschlossen wurde.ASSETTYPE
: Typ des Vermögensgegenstands für die Transaktion (Beispiel:otransaction
).TRANSACTION_ID
: Eindeutige Kennung der Transaktion.FROM_ACCOUNT_ID
: Konto-ID, von der der Vermögensgegenstand/Wert stammt.TO_ACCOUNT_ID
: Konto-ID, auf die der Vermögensgegenstand/Wert transferiert wurde.TRANSACTION_TYPE
: Typ der Transaktion (z.B. Überweisung, Lastschrift, Gutschrift).AMOUNT
: Der an der Transaktion beteiligte Betrag.TRANSACTION_EARMARK
: Kategorie oder Zweckmarke für die Transaktion.FROM_ACCOUNT_BALANCE
: Saldo des Quellkontos nach der Transaktion.TO_ACCOUNT_BALANCE
: Saldo des Zielkontos nach der Transaktion.
- Enthält nur Zeilen, bei denen die folgenden Anweisungen wahr sind.
- Allgemeine SQL-Abfrage, Los:
`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`
Diese View entspricht der allgemeinen SQL-Abfrage TypeScript-View. Der einzige Unterschied besteht in der JSON-Feldbenennungskonvention, die Pascal-Kleinschreibung anstelle von Kleinbuchstaben verwendet.AssetType
: vorherassetType
TransactionId
: vorhertransaction_id
FromAccountId
: vorherfrom_account_id
ToAccountId
: vorherto_account_id
TransactionType
: vorhertransaction_type
Amount
: vorheramount
Category
: vorhercategory
FromAccountBalance
: vorherfrom_account_balance
ToAccountBalance
: vorherto_account_balance
TransactionId AS transaction_id
), um Ausgabenspaltennamen unabhängig von der Benennungskonvention für das JSON-Feld in allen Ansichten konsistent zu halten. - Vertrauliche SQL-Abfrage, Systemeigentümer:
`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`
Datenquellen:<obpInstanceName>_<channelName>_hist
: Historische Chaincode-Tabelle, in der alle Transaktionsversionen gespeichert sind.<transactionPDCViewName>
: Ansicht mit Transaktionsdetails für die private Datenerfassung, die zur Anreicherung von Transaktionsdatensätzen verknüpft sind.ACCOUNTS_MOD
: Referenzansicht zum Abrufen der korrektendecimal_value
für Kontensalden und Transaktionsbeträge.
Schlüssellogik:- Filtert nur Zeilen, bei denen die folgenden Anweisungen wahr sind.
CHAINCODEID = <chaincodeName>
assetType = 'otransaction'
KEY
beginnt nicht mit_obp2pc_staged_
- Verwendet
ROW_NUMBER()
, partitioniert durchtransaction_id
(angeordnet durchtxntimestamp DESC
), um sicherzustellen, dass nur der letzte Datensatz pro Transaktion enthalten ist. - Ruft
decimal_value
dynamisch ausACCOUNTS_MOD
ab, je nachdem, ob die Transaktion einefrom_account_id
oderto_account_id
umfasst. - Beträge und Salden (
amount
,from_account_balance
,to_account_balance
) werden mit folgenden Dezimalstellen skaliert:value / POWER(10, decimal_value)
- Verwendet
COALESCE
aufblockNo
undtxnNo
, um sicherzustellen, dass Sortierspalten immer vorhanden sind, auch wenn sie in JSON fehlen.
Ausgabespalten:BLOCKNO
: Blocknummer für die Bestellung (falls verfügbar aus JSON, sonst aus Metadaten).TXNNO
: Transaktionsnummer im Block (falls verfügbar aus JSON, sonst aus Metadaten).KEY
: Transaktionsschlüssel-ID.TXNTIMESTAMP
: Zeitstempel der Transaktion.ASSETTYPE
: Assettyp (otransaction
).TRANSACTION_ID
: Eindeutige Kennung der Transaktion.FROM_ACCOUNT_ID
: Konto-ID, von der Token gesendet wurden.TO_ACCOUNT_ID
: Account-ID, an die Token gesendet wurden.TRANSACTION_TYPE
: Typ der Transaktion (z.B. Transfer, Sperre, Freigabe).AMOUNT
: Transaktionsbetrag, skaliert nach Dezimalstellen für Token.TRANSACTION_EARMARK
: Kategorie oder Zweck der Transaktion.FROM_ACCOUNT_BALANCE
: Saldo des Absenderkontos nach Transaktion, skaliert nach Nachkommastellen.TO_ACCOUNT_BALANCE
: Saldo des Kontos des Empfängers nach Transaktion, skaliert nach Nachkommastellen.
- Vertrauliche SQL-Abfrage, Teilnehmerbank:
`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`
Datenquellen:<obpInstanceName>_<channelName>_hist
: Historische Chaincode-Tabelle mit allen Transaktionsversionen im JSON-Format.<transactionPDCViewName>
: Private Datenerfassungsansicht, die private Daten auf Transaktionsebene enthält. Es wird mit der Historie verknüpft, um den Transaktionsdatensatz anzureichern.ACCOUNTS_MOD
: Ansicht zum Abrufen der korrekten Dezimalstellen für Token (decimal_value
) für Konten, die an Transaktionen beteiligt sind.
Schlüssellogik:- Filtert nur Zeilen, bei denen die folgenden Anweisungen wahr sind.
CHAINCODEID = <chaincodeName>
assetType = 'otransaction'
- Schließt zwischengespeicherte Transaktionen aus (
KEY NOT LIKE '_obp2pc_staged_%'
)
- Dezimalskalierung: Ruft
decimal_value
dynamisch ausACCOUNTS_MOD
ab, basierend auffrom_account_id
oderto_account_id
. Wendet die Skalierung mitvalue / POWER(10, decimal_value)
aufamount
,from_account_balance
undto_account_balance
an - Datensatzauswahl: Verwendet
ROW_NUMBER()
, partitioniert durchtransaction_id
(letzte durchTXNTIMESTAMP
), um sicherzustellen, dass nur die neueste Version jeder Transaktion zurückgegeben wird. - Datennormalisierung:
COALESCE
wird aufblockNo
undtxnNo
angewendet, um Konsistenz sicherzustellen, auch wenn die Werte in der JSON-Payload fehlen.
Ausgabespalten:BLOCKNO
: Für die Bestellung verwendete Blocknummer (falls verfügbar aus JSON, sonst aus Metadaten).TXNNO
: Transaktionsnummer im Block (falls verfügbar aus JSON, sonst aus Metadaten).KEY
: Transaktionsschlüssel-ID.TXNTIMESTAMP
: Zeitstempel der Transaktion.ASSETTYPE
: Assettyp (otransaction
).TRANSACTION_ID
: Eindeutige Kennung der Transaktion.FROM_ACCOUNT_ID
: Account-ID, die Token sendet.TO_ACCOUNT_ID
: Konto-ID, die Token empfängt.TRANSACTION_TYPE
: Typ der Transaktion (z.B. Transfer, Sperre, Freigabe).AMOUNT
: Transaktionsbetrag, normalisiert mit Dezimalstellen für Token.TRANSACTION_EARMARK
: Kategorie oder Zweckmarke für die Transaktion.FROM_ACCOUNT_BALANCE
: Saldo des Absenderkontos nach der Transaktion (genau angepasst).TO_ACCOUNT_BALANCE
: Saldo des Empfängerkontos nach der Transaktion (genau angepasst).
-
ACCOUNTS_TRANSACTION_MOD
- Diese Ansicht erweitert die Transaktionshistorie, indem jede Transaktion mit den Organisationskennungen der teilnehmenden Konten verknüpft wird. Es unterstützt Burn-Genehmigungen, Mint-Genehmigungen und regelmäßige Transfers und stellt sicher, dass Transaktionen sowohl Kontext auf Kontoebene als auch auf Organisationsebene enthalten.
- Allgemeine SQL-Abfrage, TypeScript und Los:
`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`
Datenquellen:<transactionViewName> (A)
: Stellt wichtige Transaktionsdetails wie IDs, Blocknummern, Konten, Beträge und Zeitstempel bereit.<accountsViewName> (B, C)
: Ordnet Konten (ACCOUNT_ID
) Organisationen (ORG_ID
) für Absender und Empfänger zu.
Schlüssellogik: Die Ansicht wird mit einerUNION
von drei Fällen erstellt:APPROVE_BURN
- Join auf
FROM_ACCOUNT_ID = B.ACCOUNT_ID
. - Weisen Sie
B.ORG_ID
sowohlFROM_ORG_ID
als auchTO_ORG_ID
zu.
- Join auf
APPROVE_MINT
- Join auf
TO_ACCOUNT_ID = C.ACCOUNT_ID
. - Weisen Sie
C.ORG_ID
sowohlFROM_ORG_ID
als auchTO_ORG_ID
zu.
- Join auf
- Reguläre Transfers
- Join auf
FROM_ACCOUNT_ID = B.ACCOUNT_ID
undTO_ACCOUNT_ID = C.ACCOUNT_ID
. - Weisen Sie
B.ORG_ID
alsFROM_ORG_ID
undC.ORG_ID
alsTO_ORG_ID
zu.
- Join auf
BLOCKNO DESC
sortiert, um die neuesten Transaktionen zu priorisieren.Ausgabespalten:TRANSACTION_ID
: Eindeutige Kennung der Transaktion.BLOCKNO
: Blocknummer, in der die Transaktion aufgezeichnet wurde.FROM_ACCOUNT_ID
: Konto-ID des Absenders.TO_ACCOUNT_ID
: Konto-ID des Empfängers.EARMARK
: Kategorie des Transaktionsziels (AliasTRANSACTION_EARMARK
).FROM_ORG_ID
: Organisations-ID des Absenderkontos (oder gleichTO
für Burn).TO_ORG_ID
: Organisations-ID des Kontos des Empfängers (oder identisch mitFROM
für Mint).TRANSACTION_TYPE
: Typ der Transaktion (APPROVE_BURN
,APPROVE_MINT
oder Übertragung).AMOUNT
: Transaktionsbetrag.CRDATE
: Erstellungsdatum der Transaktion (abTXNTIMESTAMP
).
- Vertrauliche SQL-Abfrage, Systemeigentümer und Teilnehmerbank:
`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
Datenquellen:<transactionViewName> (A)
: Stellt Daten auf Transaktionsebene bereit (IDs, Blocknummern, Kontoreferenzen, Beträge, Zeitstempel).<accountsViewName> (B, C)
: Stellt die Zuordnung zwischenACCOUNT_ID
undORG_ID
bereit.
Schlüssellogik: Die Ansicht verwendetUNION
, um Ergebnisse aus drei Transaktionsmustern zusammenzuführen:- Nur-Absender-Transaktionen (z. B. ausgehende oder brennende Fälle)
- Bedingung:
A.FROM_ACCOUNT_ID = B.ACCOUNT_ID
undA.TO_ACCOUNT_ID IS NULL
. - Schließt den Transaktionstyp
CREATE_ACCOUNT
aus. - Sowohl
FROM_ORG_ID
als auchTO_ORG_ID
werden von der Organisation des Absenders abgeleitet (B.ORG_ID
).
- Bedingung:
- Nur-Empfänger-Transaktionen (z.B. eingehende oder mintähnliche Fälle)
- Bedingung:
A.TO_ACCOUNT_ID = C.ACCOUNT_ID
undA.FROM_ACCOUNT_ID IS NULL
. - Sowohl
FROM_ORG_ID
als auchTO_ORG_ID
werden von der Organisation des Empfängers (C.ORG_ID
) abgeleitet.
- Bedingung:
- Standardtransfers (Transaktionen mit Absender und Empfänger)
- Bedingung:
A.FROM_ACCOUNT_ID = B.ACCOUNT_ID
undA.TO_ACCOUNT_ID = C.ACCOUNT_ID
. FROM_ORG_ID
stammt aus der Organisation des Absenders (B.ORG_ID
),TO_ORG_ID
aus der Organisation des Empfängers (C.ORG_ID
).
- Bedingung:
BLOCKNO
sortiert, um die letzten Transaktionen zu priorisieren.Ausgabespalten:TRANSACTION_ID
: Eindeutige Kennung der Transaktion.BLOCKNO
: Blocknummer, in der die Transaktion aufgezeichnet wird.FROM_ACCOUNT_ID
: Konto-ID des Absenders (kannNULL
für mint sein).TO_ACCOUNT_ID
: Konto-ID des Empfängers (kannNULL
für Burn sein).EARMARK
: Transaktionsziel (AliasTRANSACTION_EARMARK
).FROM_ORG_ID
: Organisations-ID des Absenders (oder identisch mit Empfänger, wenn AbsenderNULL
ist).TO_ORG_ID
: Organisations-ID des Empfängers (oder mit Absender identisch, wenn EmpfängerNULL
ist).TRANSACTION_TYPE
: Typ der Transaktion (z.B. Transfer, Mint, Burn usw.).AMOUNT
: Transaktionsbetrag.CRDATE
: Zeitstempel der Transaktionserstellung (TXNTIMESTAMP
).