2015-12-10 167 views
1

我已經寫了一個函數,但是它什麼都沒返回。但是,當我單獨執行該查詢時,它可以工作。你能幫助理解爲什麼會發生嗎?函數什麼也沒有返回Postgresql

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

回答

2

你沒有從你的函數返回任何東西。 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數據YPE。它是一種固定長度的數據類型,這意味着您存儲在其中的任何內容都將填充空格以定義長度。

您應該改用varchar

+0

謝謝,我將來需要'format',我會將char_block_name傳遞給函數。 – user565447

+0

@ user565447爲了支持一個參數,你不需要格式或動態SQL –