【问题标题】:Function returns nothing Postgresql函数不返回任何东西 Postgresql
【发布时间】:2015-12-10 15:53:46
【问题描述】:

我写了一个函数,但它什么也没返回。但是当我单独执行该查询时,它可以工作。请您帮忙了解一下为什么会这样?

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();

它将返回空表。

你能解释一下为什么会这样吗?

我正在使用 postgresql 9.3

【问题讨论】:

    标签: sql postgresql join postgresql-9.3


    【解决方案1】:

    你没有从你的函数中返回任何东西。 EXECUTE 只运行语句,但不生成结果。

    您也不需要 format() 调用“静态”语句,也不需要 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;
    

    要使用 executeformat() 使您的原始版本正常工作,您需要使用:

    return query EXECUTE format(....); 
    

    而不仅仅是execute format (...)


    不相关,但是:您很可能想要使用CHAR 数据类型。它是一种固定长度的数据类型,这意味着您存储在其中的任何内容都将用空格填充到定义的长度。

    您应该改用varchar

    【讨论】:

    • 谢谢,我以后需要format,我会把char_block_name传给函数。
    • @user565447 要支持不需要format 或动态SQL 的参数
    猜你喜欢
    • 1970-01-01
    • 2016-11-10
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多