Function Postgres 9.0.4:调用从另一个函数中返回行类型的函数时出错
我在使用pl/pgsql的Postgres 9.0.4上遇到了意想不到的行为,这与从另一个函数中将ROWTYPE返回到ROWTYPE变量的函数中进行选择有关。 在下面的示例中,我: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行 调用测试线束 下面显示的错误意外返回 错误:整数的
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;