복붙노트

[SQL] 포스트 그레스 컬럼에 데이터를 반환하지 않는 테이블을 반환하는 기능

SQL

포스트 그레스 컬럼에 데이터를 반환하지 않는 테이블을 반환하는 기능

나는 테이블을 반환하는 포스트 그레스 기능이 :

CREATE OR REPLACE FUNCTION testFunction() RETURNS TABLE(a int, b int) AS
$BODY$
DECLARE a int DEFAULT 0;
DECLARE b int DEFAULT 0;
BEGIN
CREATE TABLE tempTable AS SELECT a, b;
RETURN QUERY SELECT * FROM tempTable; 
DROP TABLE tempTable;
END;
$BODY$
LANGUAGE plpgsql;

이 함수는 행과 열 형식으로 데이터를 반환하지 않는다. 대신 데이터를로 반환

(0,0)

즉, 데이터를 추출의 ColdFusion cfquery를 블록에서 문제를 야기한다. 테이블이 함수에서 반환 될 때 어떻게 행과 열에서 데이터를받을 수 있나요? 즉 : 왜 PL / pgSQL의 기능은 열 등의 데이터를 반환하지 않습니다?

해결법

  1. ==============================

    1.대신 행 유형의 개별 열을 얻으려면, 기능과 전화 :

    대신 행 유형의 개별 열을 얻으려면, 기능과 전화 :

    SELECT * FROM testfunction();
    

    그냥 당신이 테이블에서 모든 열을 선택 것 같은. 또한 테스트 기능이 검토 양식을 고려 :

    CREATE OR REPLACE FUNCTION testfunction()
      RETURNS TABLE(a int, b int) AS
    $func$
    DECLARE
       _a int := 0;
       _b int := 0;
    BEGIN
       CREATE TEMP TABLE tbl AS SELECT _a, _b;
       RETURN QUERY SELECT * FROM tbl;
       DROP TABLE tempTable;
    END
    $func$  LANGUAGE plpgsql;
    

    특히:

    임시 테이블의 예에서 완전히 쓸모가 (아마도 지나치게 단순화). 당신은 할 감소시킬 수있다 :

    CREATE OR REPLACE FUNCTION testfunction(OUT a int, OUT b int) AS
    $func$
    BEGIN
       a := 0;
       b := 0;
    END
    $func$  LANGUAGE plpgsql;
    
  2. ==============================

    2.물론 당신은 에릭 Brandstetter이 정답처럼, FROM 절에있는 함수 호출을 넣어이 작업을 수행 할 수 있습니다. 그러나,이 때로는 이미 FROM 절에서 다른 일을 가지고 쿼리에서 복잡하게된다. 함수가 반환, 당신은이 구문을 사용할 수있는 개별 열을 얻으려면 :

    물론 당신은 에릭 Brandstetter이 정답처럼, FROM 절에있는 함수 호출을 넣어이 작업을 수행 할 수 있습니다. 그러나,이 때로는 이미 FROM 절에서 다른 일을 가지고 쿼리에서 복잡하게된다. 함수가 반환, 당신은이 구문을 사용할 수있는 개별 열을 얻으려면 :

    SELECT (testfunction()).*
    

    또는 전화에만 열을 얻기 위해 "A":

    SELECT (testfunction()).a
    

    도트 뒤에 괄호 입력 값 (S)을 원하는 열 이름 또는 별표를 포함하여 전체 기능을 놓는다.

    함수가 반환, 당신은 하나에해야하는 열 이름을 얻으려면 :

    입력 값은 여전히 ​​FROM 절에서 나올 수있다. 다만이 문제를 설명하기 위해이 기능을 테스트 데이터를 고려 :

    CREATE FUNCTION funky(a integer, b integer)
    RETURNS TABLE(x double precision, y double precision) AS $$
     SELECT a*random(), b*random();
    $$ LANGUAGE SQL;
    
    CREATE TABLE mytable(a integer, b integer);
    INSERT INTO mytable
        SELECT generate_series(1,100), generate_series(101,200);
    

    당신은 FROM 절에 넣을 필요없이, "(A, B) 펑키"함수를 호출 할 수 있습니다 :

    SELECT (funky(mytable.a, mytable.b)).*
    FROM mytable;
    

    2 열이 발생할 것이다 :

             x         |         y         
    -------------------+-------------------
     0.202419687062502 |   55.417385618668
      1.97231830470264 |  63.3628275180236
      1.89781916560605 |  1.98870931006968
    (...)
    
  3. from https://stackoverflow.com/questions/14628771/postgres-function-returning-table-not-returning-data-in-columns by cc-by-sa and MIT license