Function Postgres 9.0.4:调用从另一个函数中返回行类型的函数时出错

Function Postgres 9.0.4:调用从另一个函数中返回行类型的函数时出错,function,postgresql,syntax-error,rowtype,Function,Postgresql,Syntax Error,Rowtype,我在使用pl/pgsql的Postgres 9.0.4上遇到了意想不到的行为,这与从另一个函数中将ROWTYPE返回到ROWTYPE变量的函数中进行选择有关。 在下面的示例中,我: 创建一个表、TESTTABLE并插入一行 创建函数FN_TEST_GET_ROW,该函数基于从TESTTABLE中选择的一行返回ROWTYPE TESTTABLE的一行 以函数TESTX的形式创建一个测试线束,该函数调用ID为1的FN\u test\u GET\u行 调用测试线束 下面显示的错误意外返回 错误:整数的

我在使用pl/pgsql的Postgres 9.0.4上遇到了意想不到的行为,这与从另一个函数中将ROWTYPE返回到ROWTYPE变量的函数中进行选择有关。 在下面的示例中,我:

  • 创建一个表、TESTTABLE并插入一行
  • 创建函数FN_TEST_GET_ROW,该函数基于从TESTTABLE中选择的一行返回ROWTYPE TESTTABLE的一行
  • 以函数TESTX的形式创建一个测试线束,该函数调用ID为1的FN\u test\u GET\u行
  • 调用测试线束
  • 下面显示的错误意外返回 错误:整数的输入语法无效:“(1,Fred)”

    我只希望返回值(1,Fred),这就是我执行的结果

    SELECT fn_test_get_row(1);
    
    直接的

    创建表:

    CREATE TABLE testtable
    (
    id INTEGER,
    name VARCHAR(10)
    );
    
    添加数据:

    INSERT INTO testtable (id, name) VALUES (1, 'Fred');
    
    创建函数:

    CREATE OR REPLACE FUNCTION fn_test_get_row(a INTEGER)
    RETURNS testtable AS $$
    DECLARE
    i_row testtable;
    BEGIN
    
    SELECT *
    INTO   i_row
    FROM testtable
    WHERE id = a;
    
    -- Success
    RETURN i_row;
    
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE OR REPLACE FUNCTION testx()
    RETURNS testtable AS $$
    DECLARE
    i_row testtable;
    BEGIN
    
    SELECT fn_test_get_row(1)
    INTO   i_row;
    
    -- Success
    RETURN i_row;
    END;    
    $$ LANGUAGE plpgsql;
    
    select testx();
    
    创建测试功能:

    CREATE OR REPLACE FUNCTION fn_test_get_row(a INTEGER)
    RETURNS testtable AS $$
    DECLARE
    i_row testtable;
    BEGIN
    
    SELECT *
    INTO   i_row
    FROM testtable
    WHERE id = a;
    
    -- Success
    RETURN i_row;
    
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE OR REPLACE FUNCTION testx()
    RETURNS testtable AS $$
    DECLARE
    i_row testtable;
    BEGIN
    
    SELECT fn_test_get_row(1)
    INTO   i_row;
    
    -- Success
    RETURN i_row;
    END;    
    $$ LANGUAGE plpgsql;
    
    select testx();
    
    执行测试功能:

    CREATE OR REPLACE FUNCTION fn_test_get_row(a INTEGER)
    RETURNS testtable AS $$
    DECLARE
    i_row testtable;
    BEGIN
    
    SELECT *
    INTO   i_row
    FROM testtable
    WHERE id = a;
    
    -- Success
    RETURN i_row;
    
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE OR REPLACE FUNCTION testx()
    RETURNS testtable AS $$
    DECLARE
    i_row testtable;
    BEGIN
    
    SELECT fn_test_get_row(1)
    INTO   i_row;
    
    -- Success
    RETURN i_row;
    END;    
    $$ LANGUAGE plpgsql;
    
    select testx();
    
    返回的错误:

    ERROR:  invalid input syntax for integer: "(1,Fred)"
    CONTEXT:  PL/pgSQL function "testx" line 8 at SQL statement
    
    ********** Error **********
    
    ERROR: invalid input syntax for integer: "(1,Fred)"
    SQL state: 22P02
    Context: PL/pgSQL function "testx" line 8 at SQL statement
    

    我以前没有见过
    返回tablename
    语法。我个人会使用
    返回记录
    返回集合
    。以下是为您提供的固定函数。我所做的是更改
    testx
    函数,将
    fn\u test\u get\u row()
    视为一个表,并将
    fn\u test\u get\u row()
    的结果类型更改为一个集合

    CREATE OR REPLACE FUNCTION fn_test_get_row(a INTEGER)
    RETURNS SETOF testtable AS $$
    DECLARE
        i_row testtable%ROWTYPE;
    BEGIN
        SELECT INTO i_row * FROM testtable WHERE id = a;
        RETURN NEXT i_row;
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE OR REPLACE FUNCTION testx()
    RETURNS SETOF testtable AS $$
    DECLARE
        i_row testtable%ROWTYPE;
    BEGIN
        SELECT INTO i_row * FROM fn_test_get_row(1) AS foo;
        RETURN NEXT i_row;
    END;
    $$ LANGUAGE plpgsql;
    
    其中:

    # select testx();
      testx   
    ---------- 
     (1,Fred)
    (1 row)
    

    将testx中的select更改为以下内容似乎也是可行的:

    SELECT (fn_test_get_row(1)).*
    INTO   i_row;
    

    <> P>错误消息是有意义的,如果你考虑用括号和星来选择你的记录类型的一列。Postgres然后尝试将此列转换为结果的第一列类型,导致出现您给出的错误消息。

    抱歉,这有点混乱。应该读:将数据插入到testtable(id,name)值中(1,'Fred');Create函数Create或REPLACE函数fn_test_get_row(一个整数)将testtable作为$$DECLARE i_row testtable返回;开始从testtable中选择*进入i_行,其中id=a;返回i_行;完;$$语言plpgsql;Create test function Create或REPLACE function testx()将testtable作为$$DECLARE i_row testtable返回;开始选择fn_测试_获取_行(1)到i_行;返回i_行;完;$$语言plpgsql;