2017-06-26 3 views
0
in Funktion Variable plpgsql Zeichenfolge verwenden

Hallo ich Probleme Abfrage habe, wenn ich Apostroph habe in meiner where-Klausel in postgresql pgpsql Funktion verwenden, weiß ich, dass manuell ich so etwas wie tun könnte:Wie mit Apostroph

select 'author''s' 

aber mein Wort in einer variablen gespeichert ist, hier ist meine Funktion:

CREATE OR REPLACE FUNCTION public.fn_inserir_doc(caminho_arqv text, conteudo text) 
RETURNS void 
LANGUAGE plpgsql 
AS $function$ 
    declare 
     conteudo_array text array; 
     palavra text; 
    begin 
     execute 'insert into documento(caminho) 
        select ''' || caminho_arqv || ''' 
        where not exists(select id 
            from documento 
            where caminho='''||caminho_arqv||''')'; 
     conteudo_array := regexp_split_to_array(conteudo, E'\\s+'); 
     FOREACH palavra in array conteudo_array 
     loop 
       if length(palavra) >=3 then 
       raise notice 'palavra: %', palavra; 
       execute 'insert into termo(descricao) 
          select ''' || palavra || ''' 
          where not exists(
              select id from termo 
              where descricao='''||palavra||''')'; 
       execute 'insert into documento_termo(id_termo, id_documento, frequencia) 
          select t.id, d.id, 1 
          from termo t 
          cross join documento d 
          where t.descricao = '''|| palavra ||''' 
          and d.caminho = '''|| caminho_arqv ||''' 
          on conflict (id_termo, id_documento) do update set frequencia = documento_termo.frequencia + 1;'; 
       end if; 
     end loop; 
    end; 
$function$ 

das folgende Beispiel derjenige ist, der das Problem hat:

select id from termo 
where descricao='''||palavra||''' 

weil palavra enthält Apostroph

Antwort

1

Verwenden dollar quoting und die Funktion format(). Beispiel:

create or replace function test(str text) 
returns setof text language plpgsql as $$ 
begin 
-- instead of this: 
-- return query execute 'select '''||str||'''::text'; 
-- use: 
    return query execute format(
     $fmt$ 
      select %L::text 
     $fmt$, str); 
end $$; 

select * from test('O''Brian'); 

    test 
--------- 
O'Brian 
(1 row)