Доступ к полям объекта по имени в объекте PL / pgSQL - PullRequest
0 голосов
/ 27 июня 2019

Я хотел бы получить доступ к полям / свойствам объекта по имени, переданному через текстовую переменную в функции PL / SQL. Например, вместо:

obj.fieldA

Я бы хотел сделать что-то вроде:

obj['fieldA']

Есть ли способ сделать это в PL / SQL? Я использую Postgres, поэтому, возможно, мне стоит сказать PL / pgSQL, но я надеюсь, что общий синтаксис существует.

1 Ответ

1 голос
/ 27 июня 2019

Что я знаю, скомпилированный язык PL / SQL не позволяет этого.Обычно это особенность динамических языков.PLpgSQL также не поддерживает эту функцию, но есть несколько обходных путей:

  • динамический SQL

    CREATE TABLE foo(a int, b varchar, c date);
    INSERT INTO foo VALUES(10, 'Hello', CURRENT_DATE);
    
    DO $$
    DECLARE 
      foo_rec foo%ROWTYPE;
      colname text DEFAULT 'b';
      value text;
    BEGIN
      SELECT * FROM foo INTO foo_rec;
      EXECUTE format('SELECT ($1).%I::text', colname) INTO value USING foo_rec;
      RAISE NOTICE '% = %', colname, value;
    END;
    $$;
    
  • Преобразование в JSON ичтение значения из JSON значение

    DO $$
    DECLARE 
      foo_rec foo%ROWTYPE;
      colname text DEFAULT 'b';
      j json;
    BEGIN
      SELECT * FROM foo INTO foo_rec;
      j := row_to_json(foo_rec);
      RAISE NOTICE '% = %', colname, j->>colname;
    END;
    $$;
    

Сегодня использование JSON является наиболее удобным способом.

...