PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

O PL/pgSQL e o SQL no PostgreSQL estão no mesmo nível do padrão SQL/PSM, em vez de apenas como padrão SQL?


Para esclarecer a terminologia:

SQL é uma consulta linguagem que é usada para selecionar, atualizar, excluir ou criar dados em um banco de dados relacional. Não tem elementos de procedimento como loops (FOR , ENQUANTO ) ou declarações condicionais (IF , ELSE ) ou variáveis ​​ou cursores.

CRIAR FUNÇÃO é de fato uma "instrução SQL", mas é meramente um "wrapper" para especificar um bloco de código que é executado por algo diferente do "motor" de consulta SQL. O Postgres (ao contrário de outros DBMS) suporta vários "motores de tempo de execução" que podem executar o bloco de código que foi passado para a instrução "CREATE FUNCTION" - um artefato disso é que o código é na verdade uma string, então CREATE FUNCTION só vê uma string, nada mais.

Como o SQL não tem elementos procedurais, você não pode misturar código procedimental e código SQL. Se você deseja executar código procedural, você precisa informar ao servidor que está trocando de "motores" de alguma forma. Isso é feito através do (SQL) DO comando que novamente pega uma string com a qual não sabe o que fazer, envia para o servidor e diz "aqui está um pedaço de código onde o usuário afirmou que o mecanismo 'xyz' pode executar" - xyz é PL/pgSQL, Python, Perl ou algo totalmente diferente.

Isso é o mesmo que um bloco PL/SQL anônimo no Oracle que você inicia com DECLARE - tudo depois disso é executado por um mecanismo de tempo de execução diferente no servidor. O MySQL não tem esse recurso. A única maneira de executar código procedural é criar um procedimento (ou função) e executá-lo. É por isso que não existe DO em MySQL.

O único produto DBMS que não distingue claramente entre código procedural e "SQL simples" é o SQL Server:T-SQL é uma extensão da linguagem SQL que permite misturar "SQL regular" e SQL procedural sem informar ao backend que o código precisa de um mecanismo diferente para funcionar (o que é uma fonte de grande confusão para as pessoas que migram do SQL Server para o Postgres ou Oracle).

SQL/PSM é um padrão que define elementos procedurais que podem ser incorporados em um mecanismo de banco de dados que usa SQL como sua linguagem de consulta. Não conheço nenhum produto DBMS que realmente implemente SQL/PSM. O PL/pgSQL do Postgres, o PL/SQL da Oracle, o dialeto procedural do MySQL são um pouco semelhantes a isso, mas longe de serem compatíveis com o padrão SQL/PSM. Acho que o mais próximo do padrão SQL/PSM é o DB2 e talvez o HSQLDB

Isso é verdade. Mas então, não O DBMS implementa totalmente o padrão SQL - mas a implementação do Postgres é provavelmente a mais próxima do padrão.