函数 returns 无 Postgresql
Function returns nothing Postgresql
我写了一个函数,但是return没什么。但是当我单独执行该查询时,它起作用了。你能帮忙理解为什么会这样吗?
Sql查询如下:
CREATE TABLE IF NOT EXISTS char_block (
id SERIAL PRIMARY KEY,
char_block_name CHAR(64)
);
CREATE TABLE IF NOT EXISTS string_table (
id SERIAL PRIMARY KEY,
char_name CHAR(64),
char_block_id INTEGER NOT NULL,
char_description CHAR(256),
boolean_value boolean NOT NULL
);
INSERT INTO char_block VALUES(1, 'qqqqqqq:');
INSERT INTO char_block VALUES(2, 'wwwwwwwwwwww:');
INSERT INTO char_block VALUES(3, 'eeeeeeeeeeeee:');
INSERT INTO string_table VALUES(1, 'some string', 1, 'It means that blablabla...', FALSE);
INSERT INTO string_table VALUES(2, 'hm', 1, 'Too long text...', FALSE);
INSERT INTO string_table VALUES(3, 'no', 2, 'It means that blablabla...', FALSE);
INSERT INTO string_table VALUES(4, 'pls', 2, 'Too long text...', FALSE);
INSERT INTO string_table VALUES(5, 'bla', 2, 'Too long text...', FALSE);
INSERT INTO string_table VALUES(6, 'bla1', 2, 'Too long text...', FALSE);
INSERT INTO string_table VALUES(7, 'one more thing', 3, 'How to make...', TRUE);
INSERT INTO string_table VALUES(8, 'another thing', 3, 'It means...', TRUE);
CREATE OR REPLACE FUNCTION get_all_string_table()
RETURNS table(id INTEGER,
char_name CHAR(64),
char_description CHAR(256),
boolean_value boolean,
char_block_name CHAR(64)) AS
$func$
BEGIN
EXECUTE format('
SELECT
string_table.id,
string_table.char_name,
string_table.char_description,
string_table.boolean_value,
char_block.char_block_name
FROM
string_table,
char_block
WHERE
string_table.char_block_id = char_block.id
ORDER BY string_table.id;');
END
$func$ LANGUAGE plpgsql;
所以,如果我 运行
SELECT
string_table.id,
string_table.char_name,
string_table.char_description,
string_table.boolean_value,
char_block.char_block_name
FROM
string_table,
char_block
WHERE
string_table.char_block_id = char_block.id
ORDER BY string_table.id;
...它会起作用,但如果我 运行
SELECT * FROM get_all_string_table();
它将 return 清空 table。
你能解释一下为什么会这样吗?
我正在使用 postgresql 9.3
你没有从你的函数中返回任何东西。 EXECUTE
只运行语句,不产生结果。
您也不需要 format()
调用 "static" 语句,也不需要 PL/pgSQL。以下将正常工作:
CREATE OR REPLACE FUNCTION get_all_string_table()
RETURNS table(id INTEGER,
char_name CHAR(64),
char_description CHAR(256),
boolean_value boolean,
char_block_name CHAR(64)) AS
$func$
SELECT
string_table.id,
string_table.char_name,
string_table.char_description,
string_table.boolean_value,
char_block.char_block_name
FROM
string_table,
char_block
WHERE
string_table.char_block_id = char_block.id
ORDER BY string_table.id;
$func$
LANGUAGE sql;
要使使用 execute
和 format()
的原始版本正常工作,您需要使用:
return query EXECUTE format(....);
而不只是 execute format (...)
无关,但是:您很可能不想要使用CHAR
数据类型。它是一种固定长度的数据类型,这意味着您存储在其中的任何内容都将用空格填充到定义的长度。
您应该改用 varchar
。
我写了一个函数,但是return没什么。但是当我单独执行该查询时,它起作用了。你能帮忙理解为什么会这样吗?
Sql查询如下:
CREATE TABLE IF NOT EXISTS char_block (
id SERIAL PRIMARY KEY,
char_block_name CHAR(64)
);
CREATE TABLE IF NOT EXISTS string_table (
id SERIAL PRIMARY KEY,
char_name CHAR(64),
char_block_id INTEGER NOT NULL,
char_description CHAR(256),
boolean_value boolean NOT NULL
);
INSERT INTO char_block VALUES(1, 'qqqqqqq:');
INSERT INTO char_block VALUES(2, 'wwwwwwwwwwww:');
INSERT INTO char_block VALUES(3, 'eeeeeeeeeeeee:');
INSERT INTO string_table VALUES(1, 'some string', 1, 'It means that blablabla...', FALSE);
INSERT INTO string_table VALUES(2, 'hm', 1, 'Too long text...', FALSE);
INSERT INTO string_table VALUES(3, 'no', 2, 'It means that blablabla...', FALSE);
INSERT INTO string_table VALUES(4, 'pls', 2, 'Too long text...', FALSE);
INSERT INTO string_table VALUES(5, 'bla', 2, 'Too long text...', FALSE);
INSERT INTO string_table VALUES(6, 'bla1', 2, 'Too long text...', FALSE);
INSERT INTO string_table VALUES(7, 'one more thing', 3, 'How to make...', TRUE);
INSERT INTO string_table VALUES(8, 'another thing', 3, 'It means...', TRUE);
CREATE OR REPLACE FUNCTION get_all_string_table()
RETURNS table(id INTEGER,
char_name CHAR(64),
char_description CHAR(256),
boolean_value boolean,
char_block_name CHAR(64)) AS
$func$
BEGIN
EXECUTE format('
SELECT
string_table.id,
string_table.char_name,
string_table.char_description,
string_table.boolean_value,
char_block.char_block_name
FROM
string_table,
char_block
WHERE
string_table.char_block_id = char_block.id
ORDER BY string_table.id;');
END
$func$ LANGUAGE plpgsql;
所以,如果我 运行
SELECT
string_table.id,
string_table.char_name,
string_table.char_description,
string_table.boolean_value,
char_block.char_block_name
FROM
string_table,
char_block
WHERE
string_table.char_block_id = char_block.id
ORDER BY string_table.id;
...它会起作用,但如果我 运行
SELECT * FROM get_all_string_table();
它将 return 清空 table。
你能解释一下为什么会这样吗?
我正在使用 postgresql 9.3
你没有从你的函数中返回任何东西。 EXECUTE
只运行语句,不产生结果。
您也不需要 format()
调用 "static" 语句,也不需要 PL/pgSQL。以下将正常工作:
CREATE OR REPLACE FUNCTION get_all_string_table()
RETURNS table(id INTEGER,
char_name CHAR(64),
char_description CHAR(256),
boolean_value boolean,
char_block_name CHAR(64)) AS
$func$
SELECT
string_table.id,
string_table.char_name,
string_table.char_description,
string_table.boolean_value,
char_block.char_block_name
FROM
string_table,
char_block
WHERE
string_table.char_block_id = char_block.id
ORDER BY string_table.id;
$func$
LANGUAGE sql;
要使使用 execute
和 format()
的原始版本正常工作,您需要使用:
return query EXECUTE format(....);
而不只是 execute format (...)
无关,但是:您很可能不想要使用CHAR
数据类型。它是一种固定长度的数据类型,这意味着您存储在其中的任何内容都将用空格填充到定义的长度。
您应该改用 varchar
。