Me gustaría acceder a los campos / propiedades de un objeto mediante un nombre que se pasa a través de la variable de texto en un FNTION PL / SQL. Por ejemplo, en lugar de:

obj.fieldA

Me gustaría hacer algo como:

obj['fieldA']

¿Hay alguna manera de lograr esto en PL / SQL? Estoy usando Postgres, así que quizás debería decir PL / PGSQL, pero espero que exista la sintaxis común.

0
Peter Porter 27 jun. 2019 a las 18:33

1 respuesta

La mejor respuesta

Lo que sé, el idioma compilado PL / SQL no lo permite. Por lo general, esta es una característica de los idiomas dinámicos. PLPGSQL tampoco admite esta función, pero hay pocas soluciones:

  • SQL dinámico

    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;
    $$;
    
  • Transformación a JSON y valor de lectura de JSON valor

    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;
    $$;
    

Hoy usando JSON es la forma más cómoda.

1
Pavel Stehule 27 jun. 2019 a las 15:54