Esta deve ser uma das perguntas mais idiotas que já fiz aqui, mas deve haver algo realmente doente escondido no meu script SQL que está bloqueando sua execução.
Estou invocando o arquivo cobertura.sql usando a seguinte sintaxe de amostra da CLI:
psql -h localhost -U myUser -f cobertura.sql myDB
Mas reclama com o seguinte erro:
psql:cobertura.sql:29: ERROR: "sql " is not a known variable LINE 14: sql := format('insert into cobertura_tmp select count(*) as ... cobertura.sql file:
DO language plpgsql $$
declare
eq record;
sql varchar;
BEGIN
create table if not exists cobertura_tmp (num integer, realtime char(1), lat numeric, lng numeric);
truncate table cobertura_tmp;
for eq in select imei_equipo as imei from cliente_avl_equipo where id_cliente in (select id from cliente where nombre ilike '%enangab%') limit 3
loop
sql := format('insert into cobertura_tmp select count(*) as num, tipo as realtime, round(CAST(latitud as numeric), 4) as lat ,round(CAST(longitud as numeric), 4) as lng from reports.avl_historico_%s where latitud between -38.67405472 and -36.75131149 and longitud between -73.08429161 and -69.65333954 group by tipo, round(CAST(latitud as numeric), 4),round(CAST(longitud as numeric), 4)', eq.imei);
execute sql;
end loop;
update cobertura_tmp set num= -1* num where realtime='S';
create table if not exists cobertura_tmp_resumen (num integer, lat numeric, lng numeric);
truncate cobertura_tmp_resumen;
-- select sum(num) as num , lat, lng into cobertura_tmp_resumen from cobertura_tmp group by lat,lng;
-- drop table if exists cobertura_tmp;
END;
$$;
O mesmo script é executado remotamente e sem problemas no Mac OSX usando o Postico Versão 1.3.2 (2318).
PERGUNTA: Por que não está encontrando a sql
variável que está na declare
seção?
Sua mensagem de erro diz:
Olhe atentamente:
"sql "
, não"sql"
Isso significa que você tem um caractere furtivo e invisível logo após "sql" em vez de um caractere de espaço inocente. Não está na sua pergunta, provavelmente se perdeu na tradução quando você copiou e colou na sua pergunta aqui. Seu código original contém algo como:
Você vê? Não? Porque não se pode ver . (Você pode notar que o espaço é um pouco maior neste caso particular - se seu navegador, fonte e conjunto de caracteres produzirem o mesmo resultado que o meu.) É um "espaço ideográfico" , Unicode
U+3000
, HTML 
. Apenas um exemplo aleatório. Existem vários caracteres como esse em Unicode. Substitua-o por um espaço simples para corrigir seu problema.dbfiddle aqui
Eu odeio isso sobre Unicode, muitos caracteres que principalmente confundem as pessoas ...
Para um teste rápido:
Um teste rápido se há caracteres não ASCII em uma string:
Assumindo a codificação UTF8, os caracteres não ASCII ocupam 2-4 bytes, enquanto os caracteres ASCII simples ocupam um único byte.
octet_length()
retorna oenquanto
char_length()
(igual alength()
) retorna o número de caracteres . Para all-ASCII, ambos retornam o mesmo. Seoctet_length()
retornar um número maior, você tem caracteres suspeitos. Não precisa significar nada. Qualquer caractere acentuado em uma string é bom para isso.Ou use um editor que possa destacar suspeitos.
Além disso, enquanto estiver nisso, seu código plpgsql seria consideravelmente mais eficiente assim:
Muitos pequenos detalhes, mas esse não é o tema da pergunta . Duvido que você precise de uma tabela temporária ...
Experimente se quiser melhorar o código. Relacionado: