As regras a seguir regem a visibilidade das alterações dos dados em funções que usam a SPI (ou qualquer outra função C):
Durante a execução de um comando SQL, quaisquer alterações nos dados feitas pelo comando são invisíveis para o próprio comando. Por exemplo, em:
INSERT INTO a SELECT * FROM a;
as linhas inseridas não são visíveis para a parte
SELECT.
As alterações feitas por um comando C são visíveis para todos os comandos iniciados após C, independentemente de serem iniciados dentro de C (durante a execução de C), ou após a conclusão de C.
Os comandos executados via SPI em uma função chamada por um comando SQL (seja uma função comum ou um gatilho), seguem uma ou outra das regras acima, dependendo do sinalizador de leitura/escrita passado para a SPI. Os comandos executados no modo de leitura-apenas seguem a primeira regra: não podem ver as alterações do comando de chamada. Os comandos executados no modo leitura-escrita seguem a segunda regra: podem ver todas as alterações feitas até o momento.
Todas as linguagens procedurais padrão definem o modo de leitura
e escrita da SPI dependendo do atributo de
volatilidade da função.
Os comandos das funções STABLE e
IMMUTABLE são executados no modo de
leitura-apenas, enquanto os comandos das funções
VOLATILE são executados no modo de
leitura-escrita.
Embora os autores de funções C possam violar
esta convenção, é improvável ser uma boa ideia fazê-lo.
A próxima seção contém um exemplo que ilustra a aplicação dessas regras.