Views Predefinidas
O Oracle Blockchain Platform Digital Assets Edition fornece as seguintes views predefinidas do banco de dados.
-
ACCOUNT_TRANSACTION_VIEW
- Essa exibição fornece um histórico de transações unificado por conta, capturando os lados de débito (
from_account_id
) e crédito (to_account_id
) de uma transação. É possível usar essa visualização para consultar todas as transações vinculadas a uma conta sem digitalizar dados brutos do estado do chaincode. - Consulta SQL Confidencial, Proprietário do 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
Origens de Dados:
<obpInstanceName>_<channelName>_state
, a tabela de estado principal que contém dados de chaincode no formato JSONLógica da Chave:- Inclui apenas linhas em que as seguintes instruções sejam verdadeiras.
CHAINCODEID = <chaincodeName>
assetType = 'otransaction'
KEY
não começa com_obp2pc_
transaction_type
não éEXECUTE_HOLD_RECEIVER
,EXECUTE_HOLD_SENDER
ouCREATE_ACCOUNT
- Extrai o envolvimento da conta de transações de saída (
from_account_id
) e de entrada (to_account_id
). - Usa
COALESCE
para garantir a ordenação consistente de colunas (ORDER_BLOCKNO
,ORDER_TXNNO
), mesmo que valores JSON estejam ausentes. - Combina transações de saída e de entrada com um
UNION ALL
.
Colunas de Saída:KEY
: ID da Conta associado à transação (remetente ou recebedor).TRANSACTION_ID
: Identificador exclusivo da transação.TRANSACTION_DETAILS
: Objeto JSON completo da transação.ORDER_BLOCKNO
: Número do bloco usado para ordenação (de JSON, se disponível; caso contrário, bloquear metadados).ORDER_TXNNO
: Número da transação no bloco (de JSON, se disponível, caso contrário, metadados do bloco).
- Inclui apenas linhas em que as seguintes instruções sejam verdadeiras.
- Consulta SQL de Dados SourcesConfidential, Banco do Participante:
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
Origens de Dados:
<obpInstanceName>_<channelName>_state
, a tabela de estado principal que contém dados de chaincode no formato JSONLógica da Chave:- Inclui apenas linhas em que as seguintes instruções sejam verdadeiras.
CHAINCODEID = <chaincodeName>
assetType = 'otransaction'
KEY
não começa com_obp2pc_
transaction_type
não éEXECUTE_HOLD_RECEIVER
,EXECUTE_HOLD_SENDER
ouCREATE_ACCOUNT
- Extrai o envolvimento da conta de transações de saída (
from_account_id
) e de entrada (to_account_id
). - Usa
COALESCE
para garantir a ordenação consistente de colunas (ORDER_BLOCKNO
,ORDER_TXNNO
), mesmo que valores JSON estejam ausentes. - Combina transações de saída e de entrada com um
UNION ALL
.
Colunas de Saída:KEY
: ID da Conta associado à transação (remetente ou recebedor).TRANSACTION_ID
: Identificador exclusivo da transação.TRANSACTION_DETAILS
: Objeto JSON completo da transação.ORDER_BLOCKNO
: Número do bloco usado para ordenação (de JSON, se disponível; caso contrário, bloquear metadados).ORDER_TXNNO
: Número da transação no bloco (de JSON, se disponível, caso contrário, metadados do bloco).
- Inclui apenas linhas em que as seguintes instruções sejam verdadeiras.
-
TRANSACTION_PDC_VIEW
- Esta exibição fornece detalhes de saldo e valor no nível da transação da coleta de dados privada. Ele garante que somente o registro mais recente por transação seja recuperado.
- Consulta SQL Confidencial, Proprietário do 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
Finalidade: Agrega dados em toda a organização por meio de vínculos de banco de dados.
Origens de Dados:<obpInstanceName>_<channelName>_hist
: a tabela de dados chaincode histórica que contém registros privados de coleta de dados$TRANSACTION_PDC_VIEW@${org1Name}_LINK
: View remota da organização 1 acessada por meio do link do banco de dados.$TRANSACTION_PDC_VIEW@${org2Name}_LINK
: View remota da organização 2 acessada por meio do link do banco de dados.
Lógica da Chave:- Filtra somente registros em que as seguintes afirmações são verdadeiras.
CHAINCODEID = ${implicitPDCName}
assetType = 'otransactionpdc'
KEY
não começa com_obp2pc_staged_.
- Usa a função de janela
ROW_NUMBER()
.- Partições por
transaction_id
. - Pedidos por
TXNTIMESTAMP DESC
. - Mantém apenas o registro mais recente
(rn = 1)
.
- Partições por
- Combina dados da tabela de histórico de coleta de dados privada local, da view de coleta de dados privada da organização 1 (via link de banco de dados) e da view de coleta de dados privada da organização 2 (via link de banco de dados).
Colunas de Saída:TRANSACTION_ID
: Identificador exclusivo da transação.CHAINCODEID
: Identificador do chaincode associado ao registro do PDC.QUANTITY
: Valor ou quantidade da transação transferida.FROM_ACCOUNT_BALANCE
: Saldo da conta do remetente após a transação.FROM_ACCOUNT_ONHOLD_BALANCE
: Saldo em retenção da conta do remetente após a transação.TO_ACCOUNT_BALANCE
: Saldo da conta do recebedor após a transação.TO_ACCOUNT_ONHOLD_BALANCE
: Saldo em retenção da conta do recebedor após a transação.
- Consulta SQL Confidencial, Banco do Participante:
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
Origens de Dados:<obpInstanceName>_<channelName>_hist
: a tabela de dados chaincode histórica que contém registros privados de coleta de dados
Lógica da Chave:- Filtra somente registros em que as seguintes afirmações são verdadeiras.
CHAINCODEID = ${implicitPDCName}
assetType = 'otransactionpdc'
KEY
não começa com_obp2pc_staged_.
- Usa a função de janela
ROW_NUMBER()
.- Partições por
transaction_id
. - Pedidos por
TXNTIMESTAMP DESC
. - Mantém apenas o registro mais recente
(rn = 1)
.
- Partições por
Colunas de Saída:TRANSACTION_ID
: Identificador exclusivo da transação.CHAINCODEID
: Identificador do chaincode associado ao registro do PDC.QUANTITY
: Valor ou quantidade da transação transferida.FROM_ACCOUNT_BALANCE
: Saldo da conta do remetente após a transação.FROM_ACCOUNT_ONHOLD_BALANCE
: Saldo em retenção da conta do remetente após a transação.TO_ACCOUNT_BALANCE
: Saldo da conta do recebedor após a transação.TO_ACCOUNT_ONHOLD_BALANCE
: Saldo em retenção da conta do recebedor após a transação.
-
ACCOUNTS_VIEW
- Esta exibição fornece uma exibição consolidada de contas entre organizações.
- Consulta SQL Confidencial, Proprietário do 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
Objetivo: Esta exibição fornece uma exibição consolidada de contas entre organizações, combinando as seguintes informações.- Estado da conta atual
- Dados privados relacionados à conta mais recentes (coleta de dados privados)
- Metadados de token, como precisão decimal
- Detalhes da conta entre organizações por meio de links de banco de dados
Origens de Dados:<obpInstanceName>_<channelName>_hist
: dados históricos de chaincode, usados para extrair a entrada de coleta de dados privada da conta mais recente (oaccountpdc
).<obpInstanceName>_<channelName>_state
: Dados de estado atuais para contas (oaccount
) e tokens (otoken
).ACCOUNTS_VIEW@<org1Name>_LINK
: Exibição remota da organização 1.ACCOUNTS_VIEW@<org2Name>_LINK
: Exibição remota da organização 2.
Lógica da Chave:hist_ranked
CTE: Obtém o registro de coleta de dados privados mais recente poraccount_id
usandoROW_NUMBER()
comORDER BY TXNTIMESTAMP DESC
.state_filtered
CTE: Seleciona contas (oaccount
) na tabela de estado.token_details
CTE: Recupera os detalhes do token (otoken
) com precisão decimal (o padrão é0
se estiver ausente).- Junções de seleção finais: Estado da conta (
state_filtered
) com detalhes da coleta de dados privada mais recentes (hist_ranked
) e metadados de token (token_details
). - Garante apenas contas com coleta de dados privada associada (
WHERE h.valuejson IS NOT NULL
). - Estende os dados da conta com uniões de vínculo de banco de dados de outras organizações.
Colunas de Saída:ACCOUNT_ID
: Identificador exclusivo do conta.ORG_ID
: ID da Organização associado à conta.USER_ID
: ID do Usuário vinculado à conta (da coleta de dados privada).CUSTOM_ACCOUNT_ID
: Identificador de conta personalizado definido pelo usuário.TOKEN_ID
: Identificador de token associado à conta.DECIMAL_VALUE
: Precisão decimal do token (o padrão será 0 se estiver ausente).
- Consulta SQL Confidencial, Banco do Participante:
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
Objetivo: Esta exibição fornece uma exibição consolidada de contas entre organizações, combinando as seguintes informações.- Estado da conta atual
- Dados privados relacionados à conta mais recentes (coleta de dados privados)
- Metadados de token, como precisão decimal
Origens de Dados:<obpInstanceName>_<channelName>_hist
: dados históricos de chaincode, usados para extrair a entrada de coleta de dados privada da conta mais recente (oaccountpdc
).<obpInstanceName>_<channelName>_state
: Dados de estado atuais para contas (oaccount
) e tokens (otoken
).
Lógica da Chave:hist_ranked
CTE: Obtém o registro de coleta de dados privados mais recente poraccount_id
usandoROW_NUMBER()
comORDER BY TXNTIMESTAMP DESC
.state_filtered
CTE: Seleciona contas (oaccount
) na tabela de estado.token_details
CTE: Recupera os detalhes do token (otoken
) com precisão decimal (o padrão é0
se estiver ausente).- Junções de seleção finais: Estado da conta (
state_filtered
) com detalhes da coleta de dados privada mais recentes (hist_ranked
) e metadados de token (token_details
). - Garante apenas contas com coleta de dados privada associada (
WHERE h.valuejson IS NOT NULL
).
Colunas de Saída:ACCOUNT_ID
: Identificador exclusivo do conta.ORG_ID
: ID da Organização associado à conta.USER_ID
: ID do Usuário vinculado à conta (da coleta de dados privada).CUSTOM_ACCOUNT_ID
: Identificador de conta personalizado definido pelo usuário.TOKEN_ID
: Identificador de token associado à conta.DECIMAL_VALUE
: Precisão decimal do token (o padrão será 0 se estiver ausente).
-
ACCOUNTS_MOD
- Esta exibição fornece uma representação estruturada de dados de registro de token fungível, mapeando organizações e usuários para suas contas e tokens de token fungíveis associados. Ele simplifica o acesso a relacionamentos de token de conta armazenados no estado do chaincode ao nivelar matrizes JSON aninhadas, facilitando o consumo de consultas de aplicativos e análises.
- Consulta SQL Genérica, 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`
Origens de Dados:<obpInstanceName>_<channelName>_state
: A tabela de estado principal que contém dados de chaincode no formato JSON.
Lógica da Chave:- Filtrar por chave de registro: Inclui somente registros em que a chave contém
oftregistry
. - Filtrar por chaincode: Restringe os resultados ao chaincode especificado (
<chaincodeName>
). - JSON aninhado nivelado: Usa
JSON_TABLE
para expandir o arrayassociated_ft_accounts
em linhas separadas para cada par de token de conta.account_id
: Identificador de conta de token fungível.token_id
: Token vinculado à conta.lng_number
: Ordinalidade (usada internamente para rastrear a ordem do array).
- Ordenação: Os resultados são classificados por número de bloco (
blockno
) e número de transação (txnno
) em ordem decrescente, garantindo que as associações mais recentes sejam exibidas primeiro.
Colunas de Saída:BLOCKNO
: Número do bloco em que a atualização do registro foi registrada.TXNNO
: Número da transação no bloco.KEY
: Chave de estado que representa a entrada de registro de token fungível.ASSETTYPE
: Tipo de ativo (esperado:oftregistry
).ORG_ID
: Identificador da organização do JSON.USER_ID
: Identificador do usuário associado ao registro do registro.ACCOUNT_ID
: ID da conta do token fungível extraído do array aninhado.TOKEN_ID
: ID do token extraído vinculado à conta do token fungível.
- Consulta SQL Genérica, Ir:
`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`
Essa view é igual à Consulta SQL Genérica, view TypeScript. A única diferença está na convenção de nomenclatura do campo JSON, que usa maiúsculas e minúsculas do Pascal em vez de minúsculas.AssetType
: anteriormenteassetType
OrgId
: anteriormenteorg_id
UserId
: anteriormenteuser_id
AssociatedFtAccounts
: anteriormenteassociated_ft_accounts
AccountId
: anteriormenteaccount_id
TokenId
: anteriormentetoken_id
OrgId AS org_id
) para manter os nomes das colunas de saída consistentes entre as views. - Consulta SQL Confidencial, Proprietário do 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;
Origens de Dados:<obpInstanceName>_<channelName>_hist
: Tabela de histórico que armazena as alterações cronológicas dos dados privados da conta (oaccountpdc
).<obpInstanceName>_<channelName>_state
: Tabela de estado que contém o estado do chaincode atual no formato JSON, usada para detalhes deoaccount
eotoken
.- Visualizações de organização remota: Dados adicionais das visualizações ACCOUNTS_MOD em outras organizações são incluídos usando links de banco de dados:
"ACCOUNTS_MOD"@<org1Name>_LINK
"ACCOUNTS_MOD"@<org2Name>_LINK
"ACCOUNTS_MOD"@<org3Name>_LINK
Lógica da Chave:- Classificar Registros Históricos: Usa
ROW_NUMBER()
para selecionar o registrooaccountpdc
mais recente para cada ID de conta na tabela de histórico. - Filtrar Contas Atuais: Recupera somente registros com
assetType = 'oaccount'
da tabela de estado. - Metadados de Token de Junção: Adiciona a precisão do token (
decimal_value
) unindo-se às entradasotoken
na tabela de estado. - Combinar Detalhes da Conta: junta registros de conta filtrados com sua entrada de histórico mais recente e detalhes de token. Garante que somente contas com dados históricos válidos (
h.valuejson IS NOT NULL
) sejam incluídas. - União Multiorg.: Usa
UNION ALL
para mesclar dados da conta da organização local com várias organizações remotas por meio de links de banco de dados. Isso permite que uma única consulta unificada recupere todas as contas na rede.
Colunas de Saída:ACCOUNT_ID
: Identificador exclusivo do conta.ORG_ID
: ID da Organização que possui a conta.USER_ID
: ID do Usuário vinculado à conta (do registro histórico mais recente).CUSTOM_ACCOUNT_ID
: Identificador de conta personalizado opcional definido pelo usuário.TOKEN_ID
: Identificador de token associado à conta.DECIMAL_VALUE
: Precisão decimal do token (o padrão será 0 se estiver ausente).
Geração Dinâmica: A parte de várias organizações não está codificada. No script, os sindicatos extras são gerados dinamicamente com base no arquivo
Participant_orgs_list.yml
. Isso garante que a visualização se adapte automaticamente, dependendo de quantas organizações estão configuradas na rede. O exemplo de consulta mostra três organizações para maior clareza, mas na prática o número de uniões depende do tamanho deorgsList
. Para obter detalhes adicionais, consulte as informações anteriores sobre o arquivoParticipant_orgs_list.yml
neste tópico. - Consulta SQL Confidencial, Banco do Participante:
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;
Essa visualização é igual à Consulta SQL Confidencial, Proprietário do Sistema, mas recupera dados apenas para a organização local. As principais diferenças são as seguintes:- Não é usado nenhum
UNION ALL
com links de banco de dados. - A saída inclui contas somente das tabelas de estado e histórico da organização atual.
- A view fornece um registro de conta de organização única, ao contrário da variante de várias organizações que consolida contas em várias organizações.
- Não é usado nenhum
-
TRANSACTION_MOD
- Essa exibição fornece um registro detalhado de todas as transações de blockchain, capturando metadados, participantes, valores e saldos resultantes. Ele simplifica o acesso ao histórico de transações extraindo campos estruturados diretamente da tabela de histórico, eliminando a necessidade de analisar manualmente o JSON bruto.
- Consulta SQL Genérica, 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`
Origens de Dados:
<obpInstanceName>_<channelName>_hist
, a tabela de histórico que contém todos os eventos de transação no formato JSON. Inclui os detalhes da transação e os metadados associados (bloco, número da transação, timestamp).Lógica da Chave:- Inclui apenas linhas em que as seguintes instruções sejam verdadeiras.
CHAINCODEID = <chaincodeName>
KEY
contémotransaction
(filtros para registros relacionados à transação)
- As prescrições resultam da seguinte maneira.
blockno DESC
(bloco mais recente primeiro)txnno DESC
(transação mais recente no bloco primeiro)
Colunas de Saída:BLOCKNO
: Número do bloco no qual a transação foi registrada.TXNNO
: Número da transação no bloco.KEY
: Identificador exclusivo da entrada da transação.TXNTIMESTAMP
: Data e hora em que a transação foi concluída.ASSETTYPE
: Tipo de ativo para a transação (por exemplo,otransaction
).TRANSACTION_ID
: Identificador exclusivo da transação.FROM_ACCOUNT_ID
: ID da Conta da qual o ativo/valor se originou.TO_ACCOUNT_ID
: ID da Conta para a qual o ativo/valor foi transferido.TRANSACTION_TYPE
: Tipo da transação (por exemplo, transferência, débito, crédito).AMOUNT
: Valor envolvido na transação.TRANSACTION_EARMARK
: Categoria ou marca para a transação.FROM_ACCOUNT_BALANCE
: Saldo da conta de origem após a transação.TO_ACCOUNT_BALANCE
: Saldo da conta de destino após a transação.
- Inclui apenas linhas em que as seguintes instruções sejam verdadeiras.
- Consulta SQL Genérica, Ir:
`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`
Essa view é igual à Consulta SQL Genérica, view TypeScript. A única diferença está na convenção de nomenclatura do campo JSON, que usa maiúsculas e minúsculas do Pascal em vez de minúsculas.AssetType
: anteriormenteassetType
TransactionId
: anteriormentetransaction_id
FromAccountId
: anteriormentefrom_account_id
ToAccountId
: anteriormenteto_account_id
TransactionType
: anteriormentetransaction_type
Amount
: anteriormenteamount
Category
: anteriormentecategory
FromAccountBalance
: anteriormentefrom_account_balance
ToAccountBalance
: anteriormenteto_account_balance
TransactionId AS transaction_id
) para manter os nomes das colunas de saída consistentes entre as views, independentemente da convenção de nomenclatura do campo JSON. - Consulta SQL Confidencial, Proprietário do 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`
Origens de Dados:<obpInstanceName>_<channelName>_hist
: Tabela de chaincode histórica que armazena todas as versões de transação.<transactionPDCViewName>
: Exibir contendo detalhes da transação de coleta de dados privados, unidos para enriquecer registros de transação.ACCOUNTS_MOD
: View de referência usada para extrair odecimal_value
correto para saldos de conta e valores de transação.
Lógica da Chave:- Filtra somente as linhas nas quais as instruções a seguir são verdadeiras.
CHAINCODEID = <chaincodeName>
assetType = 'otransaction'
KEY
não começa com_obp2pc_staged_
- Usa o
ROW_NUMBER()
particionado portransaction_id
(ordenado portxntimestamp DESC
) para garantir que apenas o registro mais recente por transação seja incluído. - Extrai dinamicamente
decimal_value
deACCOUNTS_MOD
, com base no fato de a transação envolver umfrom_account_id
outo_account_id
. - Quantias e saldos (
amount
,from_account_balance
,to_account_balance
) são dimensionados por precisão decimal usando:value / POWER(10, decimal_value)
- Usa
COALESCE
emblockNo
etxnNo
para garantir que as colunas de ordenação estejam sempre presentes, mesmo que não estejam no JSON.
Colunas de Saída:BLOCKNO
: Número do bloco para ordenação (de JSON, se disponível; caso contrário, de metadados).TXNNO
: Número da transação no bloco (do JSON, se disponível, caso contrário, dos metadados).KEY
: Identificador da chave da transação.TXNTIMESTAMP
: Carimbo de data e hora da transação.ASSETTYPE
: Tipo de ativo (otransaction
).TRANSACTION_ID
: Identificador exclusivo da transação.FROM_ACCOUNT_ID
: ID da Conta da qual os tokens foram enviados.TO_ACCOUNT_ID
: ID da Conta para a qual os tokens foram enviados.TRANSACTION_TYPE
: Tipo da transação (por exemplo, transferência, retenção, liberação).AMOUNT
: Valor da transação, dimensionado pela precisão decimal do token.TRANSACTION_EARMARK
: Categoria ou marca da transação.FROM_ACCOUNT_BALANCE
: Saldo da conta do remetente após a transação, dimensionado por precisão.TO_ACCOUNT_BALANCE
: Saldo da conta do recebedor após a transação, dimensionado por precisão.
- Consulta SQL Confidencial, Banco do Participante:
`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`
Origens de Dados:<obpInstanceName>_<channelName>_hist
: Tabela chaincode histórica contendo todas as versões de transação no formato JSON.<transactionPDCViewName>
: View de coleta de dados privada que contém dados privados no nível da transação. Ele é unido ao histórico para enriquecer o registro de transação.ACCOUNTS_MOD
: View usada para recuperar a precisão decimal do token correto (decimal_value
) para contas envolvidas em transações.
Lógica da Chave:- Filtra somente as linhas nas quais as instruções a seguir são verdadeiras.
CHAINCODEID = <chaincodeName>
assetType = 'otransaction'
- Exclui transações preparadas (
KEY NOT LIKE '_obp2pc_staged_%'
)
- Dimensionamento decimal: Extrai
decimal_value
dinamicamente deACCOUNTS_MOD
, com base emfrom_account_id
outo_account_id
. Aplica o dimensionamento aamount
,from_account_balance
eto_account_balance
usando:value / POWER(10, decimal_value)
- Seleção de registro: Usa
ROW_NUMBER()
particionado portransaction_id
(o mais recente porTXNTIMESTAMP
) para garantir que apenas a versão mais recente de cada transação seja retornada. - Normalização de dados:
COALESCE
é aplicado emblockNo
etxnNo
para garantir a consistência, mesmo que os valores estejam ausentes no payload JSON.
Colunas de Saída:BLOCKNO
: Número do bloco usado para ordenação (de JSON, se disponível; caso contrário, de metadados).TXNNO
: Número da transação no bloco (do JSON, se disponível, caso contrário, dos metadados).KEY
: Identificador da chave da transação.TXNTIMESTAMP
: Carimbo de data e hora da transação.ASSETTYPE
: Tipo de ativo (otransaction
).TRANSACTION_ID
: Identificador exclusivo da transação.FROM_ACCOUNT_ID
: ID da Conta que está enviando tokens.TO_ACCOUNT_ID
: ID da Conta que está recebendo tokens.TRANSACTION_TYPE
: Tipo da transação (por exemplo, transferência, retenção, liberação).AMOUNT
: Valor da transação, normalizado usando a precisão decimal do token.TRANSACTION_EARMARK
: Categoria ou marca para a transação.FROM_ACCOUNT_BALANCE
: Saldo da conta do remetente após a transação (ajustado à precisão).TO_ACCOUNT_BALANCE
: Saldo da conta do recebedor após a transação (ajustado à precisão).
-
ACCOUNTS_TRANSACTION_MOD
- Essa visualização estende o histórico de transações associando cada transação aos IDs de organização das contas participantes. Ele oferece suporte a aprovações de queima, aprovações de hortelã e transferências regulares, garantindo que as transações incluam contexto no nível da conta e da organização.
- Consulta SQL Genérica, TypeScript e Ir:
`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`
Origens de Dados:<transactionViewName> (A)
: Fornece detalhes da transação principal, como IDs, números de bloco, contas, valores e timestamps.<accountsViewName> (B, C)
: Mapeia contas (ACCOUNT_ID
) para organizações (ORG_ID
) para remetente e recebedor.
Lógica Chave: A view é criada usando umUNION
de três casos:APPROVE_BURN
- Participe do
FROM_ACCOUNT_ID = B.ACCOUNT_ID
. - Atribua
B.ORG_ID
aFROM_ORG_ID
eTO_ORG_ID
.
- Participe do
APPROVE_MINT
- Participe do
TO_ACCOUNT_ID = C.ACCOUNT_ID
. - Atribua
C.ORG_ID
aFROM_ORG_ID
eTO_ORG_ID
.
- Participe do
- Transferências Regulares
- Junte-se a
FROM_ACCOUNT_ID = B.ACCOUNT_ID
eTO_ACCOUNT_ID = C.ACCOUNT_ID
. - Atribua
B.ORG_ID
comoFROM_ORG_ID
eC.ORG_ID
comoTO_ORG_ID
.
- Junte-se a
BLOCKNO DESC
para priorizar as transações mais recentes.Colunas de Saída:TRANSACTION_ID
: Identificador exclusivo da transação.BLOCKNO
: Número do bloco no qual a transação foi registrada.FROM_ACCOUNT_ID
: ID da Conta do remetente.TO_ACCOUNT_ID
: ID da Conta do recebedor.EARMARK
: Categoria de marcação de operações (também conhecida porTRANSACTION_EARMARK
).FROM_ORG_ID
: ID da organização da conta do remetente (ou o mesmo queTO
para gravação).TO_ORG_ID
: ID da Organização da conta do recebedor (ou igual aFROM
para hortelã).TRANSACTION_TYPE
: Tipo da transação (APPROVE_BURN
,APPROVE_MINT
ou transferência).AMOUNT
: Valor da transação.CRDATE
: Data de criação da transação (deTXNTIMESTAMP
).
- Consulta SQL Confidencial, Proprietário do Sistema e Banco do Participante:
`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
Origens de Dados:<transactionViewName> (A)
: Fornece dados no nível da transação (IDs, números de bloco, referências de conta, valores, timestamps).<accountsViewName> (B, C)
: Fornece mapeamento entreACCOUNT_ID
eORG_ID
.
Key Logic: A view usaUNION
para mesclar resultados de três padrões de transação:- Transações somente do remetente (por exemplo, casos de saída ou de gravação)
- Condição:
A.FROM_ACCOUNT_ID = B.ACCOUNT_ID
eA.TO_ACCOUNT_ID IS NULL
. - Exclui o tipo de transação
CREATE_ACCOUNT
. FROM_ORG_ID
eTO_ORG_ID
são derivados da organização do remetente (B.ORG_ID
).
- Condição:
- Transações somente para receptor (por exemplo, casos de entrada ou semelhantes a hortelã)
- Condição:
A.TO_ACCOUNT_ID = C.ACCOUNT_ID
eA.FROM_ACCOUNT_ID IS NULL
. FROM_ORG_ID
eTO_ORG_ID
são derivados da organização do recebedor (C.ORG_ID
).
- Condição:
- Transferências Padrão (transações com remetente e destinatário)
- Condição:
A.FROM_ACCOUNT_ID = B.ACCOUNT_ID
eA.TO_ACCOUNT_ID = C.ACCOUNT_ID
. FROM_ORG_ID
vem da organização do remetente (B.ORG_ID
),TO_ORG_ID
da organização do recebedor (C.ORG_ID
).
- Condição:
BLOCKNO
para priorizar as transações mais recentes.Colunas de Saída:TRANSACTION_ID
: Identificador exclusivo da transação.BLOCKNO
: Número do bloco em que a transação é registrada.FROM_ACCOUNT_ID
: ID da Conta do remetente (pode serNULL
para hortelã).TO_ACCOUNT_ID
: ID da Conta do receptor (pode serNULL
para gravação).EARMARK
: Marca de transação (também conhecido porTRANSACTION_EARMARK
).FROM_ORG_ID
: ID da organização do remetente (ou o mesmo que o destinatário se o remetente forNULL
).TO_ORG_ID
: ID da Organização do recebedor (ou igual ao remetente se o recebedor forNULL
).TRANSACTION_TYPE
: Tipo de transação (por exemplo, transferência, hortelã, queima, etc.).AMOUNT
: Valor da transação.CRDATE
: Timestamp de criação da transação (TXNTIMESTAMP
).