Viste predefinite

Oracle Blockchain Platform Digital Assets Edition fornisce le viste di database predefinite riportate di seguito.

ACCOUNT_TRANSACTION_VIEW
Questa vista fornisce una cronologia delle transazioni unificata per conto, acquisendo entrambi i lati dare (from_account_id) e avere (to_account_id) di una transazione. È possibile utilizzare questa vista per eseguire query su tutte le transazioni collegate a un conto senza eseguire la scansione dei dati raw dello stato del codice concatenato.
Query SQL riservata, proprietario del sistema:
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

Origini dati: <obpInstanceName>_<channelName>_state, la tabella di stato principale contenente i dati del codice concatenato in formato JSON

Logica chiave:
  • Include solo le righe in cui le seguenti istruzioni sono vere.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY non inizia con _obp2pc_
    • transaction_type non è EXECUTE_HOLD_RECEIVER, EXECUTE_HOLD_SENDER o CREATE_ACCOUNT
  • Estrae il coinvolgimento dei conti sia dalle transazioni in uscita (from_account_id) che dalle transazioni in entrata (to_account_id).
  • Utilizza COALESCE per garantire l'ordinamento coerente delle colonne (ORDER_BLOCKNO, ORDER_TXNNO) anche se mancano valori JSON.
  • Combina le transazioni in uscita e in entrata con un UNION ALL.
Colonne di output:
  • KEY: ID conto associato alla transazione (mittente o ricevente).
  • TRANSACTION_ID: identificativo univoco della transazione.
  • TRANSACTION_DETAILS: oggetto JSON completo della transazione.
  • ORDER_BLOCKNO: numero di blocco utilizzato per l'ordinazione (da JSON, se disponibile, altrimenti blocca i metadati).
  • ORDER_TXNNO: numero di transazione nel blocco (da JSON, se disponibile, altrimenti blocca i metadati).
Query SQL dati SourcesConfidential, banca partecipante:
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

Origini dati: <obpInstanceName>_<channelName>_state, la tabella di stato principale contenente i dati del codice concatenato in formato JSON

Logica chiave:
  • Include solo le righe in cui le seguenti istruzioni sono vere.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY non inizia con _obp2pc_
    • transaction_type non è EXECUTE_HOLD_RECEIVER, EXECUTE_HOLD_SENDER o CREATE_ACCOUNT
  • Estrae il coinvolgimento dei conti sia dalle transazioni in uscita (from_account_id) che dalle transazioni in entrata (to_account_id).
  • Utilizza COALESCE per garantire l'ordinamento coerente delle colonne (ORDER_BLOCKNO, ORDER_TXNNO) anche se mancano valori JSON.
  • Combina le transazioni in uscita e in entrata con un UNION ALL.
Colonne di output:
  • KEY: ID conto associato alla transazione (mittente o ricevente).
  • TRANSACTION_ID: identificativo univoco della transazione.
  • TRANSACTION_DETAILS: oggetto JSON completo della transazione.
  • ORDER_BLOCKNO: numero di blocco utilizzato per l'ordinazione (da JSON, se disponibile, altrimenti blocca i metadati).
  • ORDER_TXNNO: numero di transazione nel blocco (da JSON, se disponibile, altrimenti blocca i metadati).
TRANSACTION_PDC_VIEW
Questa vista fornisce dettagli sul saldo e sull'importo a livello di transazione dalla raccolta dati privata. Garantisce che venga recuperato solo il record più recente per transazione.
Query SQL riservata, proprietario del sistema:
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

Scopo: aggrega i dati all'interno dell'organizzazione tramite i database link.

Origini dati:
  • <obpInstanceName>_<channelName>_hist: la tabella dati cronologica del codice concatenato contenente i record di raccolta dati privati
  • $TRANSACTION_PDC_VIEW@${org1Name}_LINK: vista remota dall'organizzazione 1 a cui si accede tramite database link.
  • $TRANSACTION_PDC_VIEW@${org2Name}_LINK: vista remota dall'organizzazione 2 accessibile tramite database link.
Logica chiave:
  • Filtra solo i record in cui le istruzioni seguenti sono vere.
    • CHAINCODEID = ${implicitPDCName}
    • assetType = 'otransactionpdc'
    • KEY non inizia con _obp2pc_staged_.
  • Utilizza la funzione finestra ROW_NUMBER().
    • Partizioni di transaction_id.
    • Ordini per TXNTIMESTAMP DESC.
    • Conserva solo il record più recente (rn = 1).
  • Combina i dati della tabella di raccolta dati privati locali, della vista di raccolta dati privati dell'organizzazione 1 (tramite database link) e della vista di raccolta dati privati dell'organizzazione 2 (tramite database link).
Colonne di output:
  • TRANSACTION_ID: identificativo univoco della transazione.
  • CHAINCODEID: identificativo del codice concatenato associato al record PDC.
  • QUANTITY: importo della transazione o quantità trasferita.
  • FROM_ACCOUNT_BALANCE: saldo del conto del mittente dopo la transazione.
  • FROM_ACCOUNT_ONHOLD_BALANCE: saldo in sospeso del conto mittente dopo la transazione.
  • TO_ACCOUNT_BALANCE: saldo del conto ricevente dopo la transazione.
  • TO_ACCOUNT_ONHOLD_BALANCE: saldo in sospeso del conto ricevente dopo la transazione.
Query SQL riservata, banca partecipante:
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
Origini dati:
  • <obpInstanceName>_<channelName>_hist: la tabella dati cronologica del codice concatenato contenente i record di raccolta dati privati
Logica chiave:
  • Filtra solo i record in cui le istruzioni seguenti sono vere.
    • CHAINCODEID = ${implicitPDCName}
    • assetType = 'otransactionpdc'
    • KEY non inizia con _obp2pc_staged_.
  • Utilizza la funzione finestra ROW_NUMBER().
    • Partizioni di transaction_id.
    • Ordini per TXNTIMESTAMP DESC.
    • Conserva solo il record più recente (rn = 1).
Colonne di output:
  • TRANSACTION_ID: identificativo univoco della transazione.
  • CHAINCODEID: identificativo del codice concatenato associato al record PDC.
  • QUANTITY: importo della transazione o quantità trasferita.
  • FROM_ACCOUNT_BALANCE: saldo del conto del mittente dopo la transazione.
  • FROM_ACCOUNT_ONHOLD_BALANCE: saldo in sospeso del conto mittente dopo la transazione.
  • TO_ACCOUNT_BALANCE: saldo del conto ricevente dopo la transazione.
  • TO_ACCOUNT_ONHOLD_BALANCE: saldo in sospeso del conto ricevente dopo la transazione.
ACCOUNTS_VIEW
Questa vista fornisce una vista consolidata dei conti tra le organizzazioni.
Query SQL riservata, proprietario del sistema:
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
Scopo: questa vista fornisce una vista consolidata dei conti tra le organizzazioni, combinando le seguenti informazioni.
  • Stato conto corrente
  • Ultimi dati personali relativi all'account (raccolta di dati privati)
  • Metadati del token, ad esempio precisione decimale
  • Dettagli account tra organizzazioni tramite database link
Queste informazioni consentono di eseguire query sui metadati a livello di conto (organizzazione, utente, token, decimali) in un'unica vista.
Origini dati:
  • <obpInstanceName>_<channelName>_hist: dati cronologici del codice concatenato, utilizzati per recuperare la voce di raccolta dati privata dell'account più recente (oaccountpdc).
  • <obpInstanceName>_<channelName>_state: dati di stato correnti per gli account (oaccount) e i token (otoken).
  • ACCOUNTS_VIEW@<org1Name>_LINK: vista remota dall'organizzazione 1.
  • ACCOUNTS_VIEW@<org2Name>_LINK: vista remota dall'organizzazione 2.
Logica chiave:
  • hist_ranked CTE: recupera il record di raccolta dati privato più recente per account_id utilizzando ROW_NUMBER() con ORDER BY TXNTIMESTAMP DESC.
  • state_filtered CTE: seleziona gli account (oaccount) dalla tabella di stato.
  • token_details CTE: recupera i dettagli del token (otoken) con precisione decimale (impostazione predefinita: 0, se mancante).
  • La selezione finale si unisce: Stato dell'account (state_filtered) con i dettagli di raccolta dati privati più recenti (hist_ranked) e metadati del token (token_details).
  • Garantisce solo gli account con la raccolta dati privata associata (WHERE h.valuejson IS NOT NULL).
  • Estende i dati degli account con le unioni di database link di altre organizzazioni.
Colonne di output:
  • ACCOUNT_ID: identificativo univoco del conto.
  • ORG_ID: ID organizzazione associato all'account.
  • USER_ID: ID utente collegato all'account (dalla raccolta di dati privati).
  • CUSTOM_ACCOUNT_ID: identificativo account personalizzato definito dall'utente.
  • TOKEN_ID: identificativo token associato all'account.
  • DECIMAL_VALUE: precisione decimale token (impostazione predefinita: 0 se mancante).
Query SQL riservata, banca partecipante:
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
Scopo: questa vista fornisce una vista consolidata dei conti tra le organizzazioni, combinando le seguenti informazioni.
  • Stato conto corrente
  • Ultimi dati personali relativi all'account (raccolta di dati privati)
  • Metadati del token, ad esempio precisione decimale
Queste informazioni consentono di eseguire query sui metadati a livello di conto (organizzazione, utente, token, decimali) in un'unica vista.
Origini dati:
  • <obpInstanceName>_<channelName>_hist: dati cronologici del codice concatenato, utilizzati per recuperare la voce di raccolta dati privata dell'account più recente (oaccountpdc).
  • <obpInstanceName>_<channelName>_state: dati di stato correnti per gli account (oaccount) e i token (otoken).
Logica chiave:
  • hist_ranked CTE: recupera il record di raccolta dati privato più recente per account_id utilizzando ROW_NUMBER() con ORDER BY TXNTIMESTAMP DESC.
  • state_filtered CTE: seleziona gli account (oaccount) dalla tabella di stato.
  • token_details CTE: recupera i dettagli del token (otoken) con precisione decimale (impostazione predefinita: 0, se mancante).
  • La selezione finale si unisce: Stato dell'account (state_filtered) con i dettagli di raccolta dati privati più recenti (hist_ranked) e metadati del token (token_details).
  • Garantisce solo gli account con la raccolta dati privata associata (WHERE h.valuejson IS NOT NULL).
Colonne di output:
  • ACCOUNT_ID: identificativo univoco del conto.
  • ORG_ID: ID organizzazione associato all'account.
  • USER_ID: ID utente collegato all'account (dalla raccolta di dati privati).
  • CUSTOM_ACCOUNT_ID: identificativo account personalizzato definito dall'utente.
  • TOKEN_ID: identificativo token associato all'account.
  • DECIMAL_VALUE: precisione decimale token (impostazione predefinita: 0 se mancante).
ACCOUNTS_MOD
Questa vista fornisce una rappresentazione strutturata dei dati del registro dei token fungibili, mappando le organizzazioni e gli utenti ai conti e ai token fungibili associati. Semplifica l'accesso alle relazioni account-token memorizzate nello stato del codice concatenato semplificando gli array JSON nidificati, rendendo più facile il consumo di applicazioni e query di analisi.
Query SQL generica, 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`
Origini dati:
  • <obpInstanceName>_<channelName>_state: la tabella di stato principale contenente i dati del codice concatenato in formato JSON.
Logica chiave:
  • Filtra per chiave di registro: include solo i record in cui la chiave contiene oftregistry.
  • Filtra per codice concatenato: limita i risultati al codice concatenato specificato (<chaincodeName>).
  • Appiattisci JSON nidificato: utilizza JSON_TABLE per espandere l'array associated_ft_accounts in righe separate per ogni coppia account-token.
    • account_id: identificativo dell'account token fungibile.
    • token_id: token collegato all'account.
    • lng_number: Ordinalità (utilizzata internamente per tenere traccia dell'ordine degli array).
  • Ordinamento: i risultati vengono ordinati in base al numero di blocco (blockno) e al numero di transazione (txnno) in ordine decrescente, assicurando che le associazioni più recenti vengano visualizzate per prime.
Colonne di output:
  • BLOCKNO: numero di blocco in cui è stato registrato l'aggiornamento del registro.
  • TXNNO: numero di transazione nel blocco.
  • KEY: chiave di stato che rappresenta la voce del registro dei token fungibili.
  • ASSETTYPE: tipo di asset (previsto: oftregistry).
  • ORG_ID: identificativo dell'organizzazione dal file JSON.
  • USER_ID: identificativo utente associato al record del registro.
  • ACCOUNT_ID: ID account token fungibile estratto dall'array nidificato.
  • TOKEN_ID: ID token estratto collegato all'account token fungibile.
Query SQL generica, Vai:
`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`
Questa vista è uguale alla query SQL generica, vista TypeScript. L'unica differenza è nella convenzione di denominazione del campo JSON, che utilizza la maiuscola Pascal anziché la minuscola.
  • AssetType: precedentemente assetType
  • OrgId: precedentemente org_id
  • UserId: precedentemente user_id
  • AssociatedFtAccounts: precedentemente associated_ft_accounts
  • AccountId: precedentemente account_id
  • TokenId: precedentemente token_id
L'alias viene applicato (ad esempio, OrgId AS org_id) per mantenere coerenti i nomi delle colonne di output tra le viste.
Query SQL riservata, proprietario del sistema:
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;
Origini dati:
  • <obpInstanceName>_<channelName>_hist: tabella di cronologia che memorizza le modifiche cronologiche dei dati privati dell'account (oaccountpdc).
  • <obpInstanceName>_<channelName>_state: tabella di stato contenente lo stato corrente del codice concatenato in formato JSON, utilizzata per i dettagli oaccount e otoken.
  • Viste dell'organizzazione remota: i dati aggiuntivi delle viste ACCOUNTS_MOD in altre organizzazioni vengono inclusi utilizzando i database link:
    • "ACCOUNTS_MOD"@<org1Name>_LINK
    • "ACCOUNTS_MOD"@<org2Name>_LINK
    • "ACCOUNTS_MOD"@<org3Name>_LINK
Logica chiave:
  • Classifica record cronologici: utilizza ROW_NUMBER() per selezionare il record oaccountpdc più recente per ogni ID cliente dalla tabella della cronologia.
  • Filtra conti correnti: recupera solo i record con assetType = 'oaccount' dalla tabella dello stato.
  • Metadati token join: aggiunge la precisione del token (decimal_value) unendo le voci otoken nella tabella di stato.
  • Combina dettagli account: unisce i record account filtrati con la voce cronologia e i dettagli token più recenti. Garantisce che vengano inclusi solo gli account con dati cronologici validi (h.valuejson IS NOT NULL).
  • Unione più organizzazioni: utilizza UNION ALL per unire i dati dell'account dell'organizzazione locale con più organizzazioni remote tramite i database link. Ciò consente a un'unica query unificata di recuperare tutti gli account nella rete.
Colonne di output:
  • ACCOUNT_ID: identificativo univoco del conto.
  • ORG_ID: ID dell'organizzazione proprietaria del conto.
  • USER_ID: ID utente collegato all'account (dall'ultimo record cronologico).
  • CUSTOM_ACCOUNT_ID: identificativo dell'account personalizzato facoltativo.
  • TOKEN_ID: identificativo token associato all'account.
  • DECIMAL_VALUE: precisione decimale token (impostazione predefinita: 0 se mancante).

Generazione dinamica: la parte multi-organizzazione non è codificata. Nello script, le unioni aggiuntive vengono generate in modo dinamico in base al file Participant_orgs_list.yml. Ciò garantisce che la vista si adatti automaticamente a seconda del numero di organizzazioni configurate nella rete. La query di esempio mostra tre organizzazioni per maggiore chiarezza, ma in pratica il numero di unioni dipende dalla dimensione di orgsList. Per ulteriori dettagli, vedere le informazioni precedenti sul file Participant_orgs_list.yml in questo argomento.

Query SQL riservata, banca partecipante:
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;
Questa vista è uguale alla query SQL riservata, proprietario del sistema, ma recupera i dati solo per l'organizzazione locale. Le principali differenze sono le seguenti:
  • Non viene utilizzato alcun UNION ALL con database link.
  • L'output include solo i conti delle tabelle dello stato e della cronologia dell'organizzazione corrente.
  • La vista fornisce un registro di conti a organizzazione singola, a differenza della variante a più organizzazioni che consolida i conti tra più organizzazioni.
TRANSACTION_MOD
Questa vista fornisce un record dettagliato di tutte le transazioni blockchain, acquisendo metadati, partecipanti, importi e saldi risultanti. Semplifica l'accesso alla cronologia delle transazioni estraendo i campi strutturati direttamente dalla tabella di cronologia, eliminando la necessità di analizzare manualmente JSON non elaborato.
Query SQL generica, 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`

Origini dati: <obpInstanceName>_<channelName>_hist, la tabella di cronologia contenente tutti gli eventi di transazione in formato JSON. Include sia i dettagli della transazione che i metadati associati (blocco, numero di transazione, indicatore orario).

Logica chiave:
  • Include solo le righe in cui le seguenti istruzioni sono vere.
    • CHAINCODEID = <chaincodeName>
    • KEY contiene otransaction (filtri per i record relativi alle transazioni)
  • Gli ordini vengono eseguiti nel modo seguente.
    • blockno DESC (prima il blocco più recente)
    • txnno DESC (prima la transazione più recente all'interno del blocco)
Colonne di output:
  • BLOCKNO: numero di blocco in cui è stata registrata la transazione.
  • TXNNO: numero di transazione nel blocco.
  • KEY: identificativo univoco della voce di transazione.
  • TXNTIMESTAMP: indicatore orario al completamento della transazione.
  • ASSETTYPE: tipo di cespite per la transazione (ad esempio, otransaction).
  • TRANSACTION_ID: identificativo univoco della transazione.
  • FROM_ACCOUNT_ID: ID conto da cui ha avuto origine il cespite o il valore.
  • TO_ACCOUNT_ID: ID conto a cui è stato trasferito il cespite o il valore.
  • TRANSACTION_TYPE: tipo di transazione (ad esempio trasferimento, addebito, accredito).
  • AMOUNT: importo coinvolto nella transazione.
  • TRANSACTION_EARMARK: categoria o indirizzo per la transazione.
  • FROM_ACCOUNT_BALANCE: saldo del conto di origine dopo la transazione.
  • TO_ACCOUNT_BALANCE: saldo del conto di destinazione dopo la transazione.
Query SQL generica, Vai:
`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`
Questa vista è uguale alla query SQL generica, vista TypeScript. L'unica differenza è nella convenzione di denominazione del campo JSON, che utilizza la maiuscola Pascal anziché la minuscola.
  • AssetType: precedentemente assetType
  • TransactionId: precedentemente transaction_id
  • FromAccountId: precedentemente from_account_id
  • ToAccountId: precedentemente to_account_id
  • TransactionType: precedentemente transaction_type
  • Amount: precedentemente amount
  • Category: precedentemente category
  • FromAccountBalance: precedentemente from_account_balance
  • ToAccountBalance: precedentemente to_account_balance
L'alias viene applicato (ad esempio, TransactionId AS transaction_id) per mantenere coerenti i nomi delle colonne di output tra le viste, indipendentemente dalla convenzione di denominazione dei campi JSON.
Query SQL riservata, proprietario del sistema:
`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`
Origini dati:
  • <obpInstanceName>_<channelName>_hist: tabella cronologica dei codici concatenati che memorizza tutte le versioni delle transazioni.
  • <transactionPDCViewName>: vista contenente i dettagli delle transazioni di raccolta dati privati uniti per arricchire i record delle transazioni.
  • ACCOUNTS_MOD: vista di riferimento utilizzata per recuperare il valore decimal_value corretto per i saldi conto e gli importi transazione.
Logica chiave:
  • Filtra solo le righe in cui le seguenti istruzioni sono vere.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY non inizia con _obp2pc_staged_
  • Utilizza ROW_NUMBER() partizionato da transaction_id (ordinato da txntimestamp DESC) per garantire che sia incluso solo il record più recente per transazione.
  • Recupera dinamicamente decimal_value da ACCOUNTS_MOD in base al fatto che la transazione coinvolga un valore from_account_id o to_account_id.
  • Gli importi e i saldi (amount, from_account_balance, to_account_balance) vengono scalati con precisione decimale utilizzando: value / POWER(10, decimal_value)
  • Utilizza COALESCE in blockNo e txnNo per garantire che le colonne di ordinamento siano sempre presenti, anche se mancanti in JSON.
Colonne di output:
  • BLOCKNO: numero di blocco per l'ordinazione (da JSON, se disponibile, altrimenti dai metadati).
  • TXNNO: numero di transazione nel blocco (da JSON, se disponibile, altrimenti dai metadati).
  • KEY: identificativo chiave transazione.
  • TXNTIMESTAMP: indicatore orario della transazione.
  • ASSETTYPE: tipo di asset (otransaction).
  • TRANSACTION_ID: identificativo univoco della transazione.
  • FROM_ACCOUNT_ID: ID account da cui sono stati inviati i token.
  • TO_ACCOUNT_ID: ID account a cui sono stati inviati i token.
  • TRANSACTION_TYPE: tipo di transazione, ad esempio trasferimento, blocco, rilascio.
  • AMOUNT: importo della transazione, scalato in base alla precisione decimale del token.
  • TRANSACTION_EARMARK: categoria o indirizzo della transazione.
  • FROM_ACCOUNT_BALANCE: Saldo del conto del mittente dopo la transazione, scalato con precisione.
  • TO_ACCOUNT_BALANCE: saldo del conto del ricevente dopo la transazione, ridimensionato in base alla precisione.
Query SQL riservata, banca partecipante:
`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`
Origini dati:
  • <obpInstanceName>_<channelName>_hist: tabella cronologica dei codici concatenati contenente tutte le versioni delle transazioni in formato JSON.
  • <transactionPDCViewName>: vista di raccolta dati privati che contiene dati privati a livello di transazione. È unito alla cronologia per arricchire il record transazione.
  • ACCOUNTS_MOD: vista utilizzata per recuperare la precisione decimale del token corretta (decimal_value) per i conti coinvolti nelle transazioni.
Logica chiave:
  • Filtra solo le righe in cui le seguenti istruzioni sono vere.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • Esclude le transazioni messe in attesa (KEY NOT LIKE '_obp2pc_staged_%')
  • Ridimensionamento decimale: recupera dinamicamente decimal_value da ACCOUNTS_MOD, in base a from_account_id o to_account_id. Applica la scala a amount, from_account_balance e to_account_balance utilizzando: value / POWER(10, decimal_value)
  • Selezione record: utilizza ROW_NUMBER() partizionato da transaction_id (più recente da TXNTIMESTAMP) per garantire che venga restituita solo la versione più recente di ogni transazione.
  • Normalizzazione dei dati: COALESCE viene applicato su blockNo e txnNo per garantire la coerenza anche se mancano i valori nel payload JSON.
Colonne di output:
  • BLOCKNO: numero di blocco utilizzato per l'ordinazione (da JSON, se disponibile, altrimenti dai metadati).
  • TXNNO: numero di transazione nel blocco (da JSON, se disponibile, altrimenti dai metadati).
  • KEY: identificativo chiave transazione.
  • TXNTIMESTAMP: indicatore orario della transazione.
  • ASSETTYPE: tipo di asset (otransaction).
  • TRANSACTION_ID: identificativo univoco della transazione.
  • FROM_ACCOUNT_ID: ID account che invia i token.
  • TO_ACCOUNT_ID: ID account che riceve i token.
  • TRANSACTION_TYPE: tipo di transazione, ad esempio trasferimento, blocco, rilascio.
  • AMOUNT: importo transazione, normalizzato utilizzando la precisione decimale del token.
  • TRANSACTION_EARMARK: categoria o indirizzo per la transazione.
  • FROM_ACCOUNT_BALANCE: saldo del conto del mittente dopo la transazione (adeguato alla precisione).
  • TO_ACCOUNT_BALANCE: saldo del conto ricevente dopo la transazione (adeguato alla precisione).
ACCOUNTS_TRANSACTION_MOD
Questa vista estende la cronologia delle transazioni associando ogni transazione agli ID organizzazione dei conti partecipanti. Supporta approvazioni di masterizzazione, approvazioni di zecca e trasferimenti regolari, assicurando che le transazioni includano sia il contesto a livello di conto che a livello di organizzazione.
Query SQL generica, TypeScript e Vai:
`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`
Origini dati:
  • <transactionViewName> (A): fornisce dettagli sulle transazioni di base quali ID, numeri di blocco, conti, importi e indicatori orari.
  • <accountsViewName> (B, C): mappa i conti (ACCOUNT_ID) alle organizzazioni (ORG_ID) sia per il mittente che per il destinatario.
Logica chiave: la vista viene creata utilizzando un UNION di tre casi:
  1. APPROVE_BURN
    • Iscriviti su FROM_ACCOUNT_ID = B.ACCOUNT_ID.
    • Assegnare B.ORG_ID sia a FROM_ORG_ID che a TO_ORG_ID.
  2. APPROVE_MINT
    • Iscriviti su TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • Assegnare C.ORG_ID sia a FROM_ORG_ID che a TO_ORG_ID.
  3. Trasferimenti regolari
    • Iscriviti su FROM_ACCOUNT_ID = B.ACCOUNT_ID e TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • Assegnare B.ORG_ID come FROM_ORG_ID e C.ORG_ID come TO_ORG_ID.
Infine, i risultati vengono ordinati da BLOCKNO DESC per dare priorità alle transazioni più recenti.
Colonne di output:
  • TRANSACTION_ID: identificativo univoco della transazione.
  • BLOCKNO: numero di blocco in cui è stata registrata la transazione.
  • FROM_ACCOUNT_ID: ID account del mittente.
  • TO_ACCOUNT_ID: ID conto del destinatario.
  • EARMARK: categoria di destinazione delle transazioni (alias TRANSACTION_EARMARK).
  • FROM_ORG_ID: ID organizzazione dell'account del mittente (o uguale a TO per la masterizzazione).
  • TO_ORG_ID: ID organizzazione del conto del destinatario (o uguale a FROM per mint).
  • TRANSACTION_TYPE: tipo di transazione (APPROVE_BURN, APPROVE_MINT o trasferimento).
  • AMOUNT: importo transazione.
  • CRDATE: data di creazione della transazione (da TXNTIMESTAMP).
Query SQL riservata, proprietario del sistema e banca partecipante:
`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
Origini dati:
  • <transactionViewName> (A): fornisce dati a livello di transazione (ID, numeri di blocco, riferimenti conto, importi, indicatori orari).
  • <accountsViewName> (B, C): fornisce il mapping tra ACCOUNT_ID e ORG_ID.
Logica chiave: la vista utilizza UNION per unire i risultati di tre pattern di transazione:
  1. Transazioni solo per mittenti (ad esempio, casi in uscita o simili a ustioni)
    • Condizione: A.FROM_ACCOUNT_ID = B.ACCOUNT_ID e A.TO_ACCOUNT_ID IS NULL.
    • Esclude il tipo di transazione CREATE_ACCOUNT.
    • Sia FROM_ORG_ID che TO_ORG_ID derivano dall'organizzazione del mittente (B.ORG_ID).
  2. Transazioni solo riceventi (ad esempio, casi in entrata o simili alla zecca)
    • Condizione: A.TO_ACCOUNT_ID = C.ACCOUNT_ID e A.FROM_ACCOUNT_ID IS NULL.
    • Sia FROM_ORG_ID che TO_ORG_ID derivano dall'organizzazione del destinatario (C.ORG_ID).
  3. Trasferimenti standard (transazioni con mittente e ricevente)
    • Condizione: A.FROM_ACCOUNT_ID = B.ACCOUNT_ID e A.TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • FROM_ORG_ID proviene dall'organizzazione del mittente (B.ORG_ID), TO_ORG_ID dall'organizzazione del destinatario (C.ORG_ID).
Infine, i risultati vengono ordinati in ordine decrescente BLOCKNO per assegnare la priorità alle transazioni più recenti.
Colonne di output:
  • TRANSACTION_ID: identificativo univoco della transazione.
  • BLOCKNO: numero di blocco in cui viene registrata la transazione.
  • FROM_ACCOUNT_ID: ID account del mittente (può essere NULL per mint).
  • TO_ACCOUNT_ID: ID del conto del destinatario (può essere NULL per la masterizzazione).
  • EARMARK: earmark di transazione (alias di TRANSACTION_EARMARK).
  • FROM_ORG_ID: ID organizzazione del mittente (o del destinatario se il mittente è NULL).
  • TO_ORG_ID: ID dell'organizzazione del destinatario (o lo stesso del mittente se il destinatario è NULL).
  • TRANSACTION_TYPE: tipo di transazione (ad esempio trasferimento, menta, masterizzazione e così via).
  • AMOUNT: importo transazione.
  • CRDATE: indicatore orario di creazione della transazione (TXNTIMESTAMP).