2016-02-24 1 views
0

J'ai une fonction plpgsql comme:curseur plpgsql sur la fonction unnest

DO 
$$ 
DECLARE 
    c_id c.id%TYPE; 
    j_text c.j_options%TYPE; 
    j_option varchar; 
    c1 c%ROWTYPE; 

begin 
    CREATE TYPE my_row_type AS (c2 TEXT); 
    for 
    --c1 in select c.j_options, c.id from c c 
    c1 in select * from c 
    loop 
     c_id = c1.id; 
     for 
     c2 in select * from unnest(string_to_array(c1.j_options,', ')) 
     loop 
     raise notice 'Value: %, %', c_id, c2.j_options; 
     end loop; 

    end loop; 
END 
$$ language plpgsql; 

Ma question est cette ligne:

c2 in select * from unnest(string_to_array(c1.j_options,', ')) 

La requête d'exemple que je lance pour exemple:

select unnest(string_to_array('1.0, 1.2',', ')); 

renvoie 2 lignes:

1. 1.0 
2. 1.2 

J'ai besoin de faire une boucle sur ces deux lignes, mais je ne suis pas sûr de ce que devrait être le type de retour de cette instruction unnest ou comment il devrait être déclaré dans la section declare.

L'erreur que je reçois lors de l'exécution du script:

ERROR: loop variable of loop over rows must be a record or row variable or 

list of scalar variables 
LINE 18:   c2 in select * from unnest(string_to_array(c1.j_... 

De la réponse ci-dessous je reçois l'erreur suivante

ERROR: function string_to_array(bytea, unknown) does not exist 
LINE 1: select from unnest(string_to_array(c1.j_options,', ')) 
          ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 
QUERY: select from unnest(string_to_array(c1.j_options,', ')) 

Je ne comprends pas pourquoi cela ne fonctionnerait pas dans le script. Il reconnaît que c1.j_options est bytea.

Mon peu de script modifié était:

for c2 in 
    select from unnest(string_to_array(c1.j_options,', ')) 
loop 
    raise notice '%', c2; 
end loop; 
+0

Essayez 'string_to_array (convert_from (c1.j_options, 'utf8'), '')' – Abelisto

+0

même avec UTF8 je reçois toujours le même message d'erreur :( – user1107753

+0

Honnêtement, il est sujet à une autre question et d'enquête. Créer ce et aussi fournir DDL pour la table 'c'. – Abelisto

Répondre

1

Selon string_to_array signature de la fonction, il retourne un tableau de texte (text[]) si c2 doit d'être text ou varchar:

do language plpgsql $$ 
declare 
    c varchar; 
begin 
    for c in select unnest(string_to_array('1.0, 1.2', ', ')) loop 
    raise notice '%', c; 
    end loop; 
end; $$; 

Il est aussi spécial type de boucle pour itérer directement les éléments du tableau:

do language plpgsql $$ 
declare 
    c varchar; 
begin 
    foreach c in array string_to_array('1.0, 1.2', ', ') loop 
    raise notice '%', c; 
    end loop; 
end; $$; 
+0

essayé le ci-dessus, mais a eu une erreur qu'il ne reconnaît pas la fonction.Veuillez consulter ma mise à jour ci-dessus – user1107753

1

Le message d'erreur est "ERREUR: la fonction string_to_array (bytea, unknown) n'existe pas". Le type bytea n'est pas un texte, c'est une valeur binaire, et pour ce type, la fonction string_to_array n'est pas définie. Il n'y a pas de conversion par défaut de bytea en texte. Difficile de dire quelle est la solution, car bytea peut contenir n'importe quoi. S'il y a du texte, alors le type "texte" devrait être utilisé, pas bytea.