Как напечатать несколько значений строк в postgres, когда запрос выполняется с помощью EXECUTE?

У меня есть программа ниже, Мой 2-й запрос выбора возвращает несколько записей, Как я должен распечатать все значения. В настоящее время его печать только 1-е значение. Можете ли вы предложить?

Ex. Фактический выход:

123

890

4599

Токовый выход: 123

DO $$
<<script>>
DECLARE
  student_rec RECORD;
  sqlquery text;
  v_nk RECORD;

BEGIN
FOR student_rec IN 
select nk from course_table;
-- open loop for cursor above
LOOP
sqlquery := 'SELECT col FROM section where rec_nk = ' || '''' ||student_rec.nk ||'''' ;
EXECUTE sqlquery into v_nk; 
raise notice 'Value: %', v_nk;  
END LOOP; 

EXCEPTION when others then    
    raise notice 'Script execution failed.'
                 'Transaction was rolled back.';
    raise notice '% %', SQLERRM, SQLSTATE;

END script $$;

2 ответа

Решение

Даже если вы объявили v_nk как RECORD, select into действительно выбирает значение в скалярное значение, когда используется в контексте PL/pgSQL. См.: https://www.postgresql.org/docs/9.6/static/sql-selectinto.html

Если вы хотите распечатать все записи с уведомлением о повышении, вы можете выполнить цикл следующим образом:

sqlquery := 'SELECT col FROM section where rec_nk = ' || '''' ||student_rec.nk ||'''' ;

for v_nk in EXECUTE sqlquery 
loop
  raise notice 'Value: %', v_nk;  
end loop;

Вы уже просматриваете результат запроса:

[ <<label>> ]
FOR target IN query LOOP
    statements
END LOOP [ label ];

Существует также FOR-IN-EXECUTE:

[ <<label>> ]
FOR target IN EXECUTE text_expression [ USING expression [, ... ] ] LOOP
    statements
END LOOP [ label ];

См. Документацию по просмотру результатов запроса.

В вашем случае это будет:

FOR v_nk IN EXECUTE sqlquery LOOP
    raise notice 'Value: %', v_nk;
END LOOP;
Другие вопросы по тегам