2016-10-20 1 views
2

Я пытаюсь написать общую хранимую функцию, которая запрашивает Информационную_SCHEMA и использует эту информацию для доступа к фактическому значению поля таблицы, описанной в INFORMATION_SCHEMA. Вот фрагмент кода, который показывает, что я пытаюсь сделать:Как я могу использовать результат PostgreSQL INFORMATION_SCHEMA в PL/pgSQL?

select_sql := 'SELECT * FROM "' || tableName || '" WHERE "' || tablePKey || '" = ''' || key_id || ''';'; 
FOR existing_rec IN EXECUTE select_sql LOOP 
    describe_sql := 'SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE table_name = ''' || tableName || ''';'; 
    FOR describe_rec IN EXECUTE describe_sql LOOP 
     RAISE NOTICE 'table: % field: % value: %', 
         tableName, 
         describe_rec.column_name, 
This is my issue -> existing_rec."describe_rec.column_name"; <- This is my issue. 
    END LOOP; 
END LOOP; 

Как я могу получить фактическое значение полей в existing_rec от внешнего контура, используя имена полей, извлекаемые из INFORMATION_SCHEMA?

+1

Как в стороне, [ 'format' функции] (https://www.postgresql.org/ docs/current/static/functions-string.html # FUNCTIONS-STRING-FORMAT) может быть лучше, чем конкатенация строк для построения 'select_sql'. –

ответ

1

Если я правильно понимаю, вам необходимо содержимое таблиц. Это не хранится в любой переменной, но вы можете запросить таблицу и сохранить результат в новой переменной:

-- Add this line: 
DECLARE _content RECORD; 
.... 
FOR existing_rec IN EXECUTE select_sql LOOP 
    describe_sql := 'SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE table_name = ''' || tableName || ''';'; 
    FOR describe_rec IN EXECUTE describe_sql LOOP 

     -- Add following statement: 
     EXECUTE format('SELECT %I FROM %I', 
         describe_rec.column_name, 
         _table) INTO _content; 

     RAISE NOTICE 'table: % field: % value: %', 
         tableName, 
         describe_rec.column_name, 
         _content; 
    END LOOP; 
END LOOP; 
+0

Это именно то, что я пытаюсь сделать. Отлично! :) –

Смежные вопросы