2015-10-14 153 views
0

我是Postgres的新手,在ms sql server中我们可以编写存储过程来执行逻辑并返回select语句。同样,我用返回类型表编写了以下pqsql函数。但它显示了一些不正确的语法错误,但如果我用整数替换返回类型并注释掉select语句,它工作正常。如何从postgresql函数返回查询结果

以下为返回类型表

CREATE OR REPLACE FUNCTION candidate_save 
(
    p_name varchar(50), 
    p_dob date, 
    p_course_level_code integer, 
    p_email varchar(50), 
    p_mob character(10), 
    p_sslc_regno varchar(10), 
    p_sslc_year_of_passing character(4), 
    p_sslc_board_of_examination integer, 
    p_password character(128), 
    p_ip_address varchar(15) 
) 
RETURNS TABLE 
(
    regno char(10), 
    name varchar(50), 
    dob date, 
    course_level_code integer, 
    email varchar(50), 
    mob character(10), 
    sslc_regno varchar(10), 
    sslc_year_of_passing character(4), 
    sslc_boe integer 
) 
AS 
$BODY$ 
DECLARE 
    max_row_count integer; 
    random_no integer; 
    v_regno character(10); 
BEGIN 

    SELECT COUNT(*) INTO max_row_count FROM candidates WHERE course_level_code = p_course_level_code; 

    max_row_count := max_row_count + 1; 

    v_regno := cast(p_course_level_code as character) || cast(trunc(random() * 89999 + 10000) as integer) || to_char(max_row_count, 'FM0000'); 

    INSERT INTO candidates 
     (regno, name, dob, course_level_code, email, mob, sslc_regno, sslc_year_of_passing, sslc_board_of_examination, password, created_on, ip_address) 
    VALUES 
     (v_regno, p_name, p_dob, p_course_level_code, p_email, p_mob, p_sslc_regno, p_sslc_year_of_passing, p_sslc_board_of_examination, p_password, now(), p_ip_address); 

    RETURN QUERY 
     SELECT regno, name, dob, course_level_name, email, mob, sslc_regno, sslc_year_of_passing, c.board as sslc_boe 
     FROM candidates a 
      INNER JOIN course_levels b on a.course_level_code = b.course_level_code 
      INNER JOIN sslc_board_of_examinations c ON a.sslc_board_of_examination = boe_code 
     WHERE regno = v_regno; 

END; 
$BODY$ 
LANGUAGE plpgsql; 
上面以下错误函数创建时

是显示

ERROR: syntax error at or near "$1" 
LINE 1: INSERT INTO candidates ($1 , $2 , $3 , $4 , $5 , $6 , ... 
           ^
QUERY: INSERT INTO candidates ($1 , $2 , $3 , $4 , $5 , $6 , $7 , $8 , sslc_board_of_examination, password, created_on, ip_address) VALUES ($9 , $10 , $11 , $12 , $13 , $14 , $15 , $16 , $17 , $18 , now(), $19) 
CONTEXT: SQL statement in PL/PgSQL function "candidate_save" near line 30 

********** Error ********** 

ERROR: syntax error at or near "$1" 
SQL state: 42601 
Context: SQL statement in PL/PgSQL function "candidate_save" near line 30 

的功能,但如果我用整数替换表正常工作。

CREATE OR REPLACE FUNCTION candidate_save 
(
    p_name varchar(50), 
    p_dob date, 
    p_course_level_code integer, 
    p_email varchar(50), 
    p_mob character(10), 
    p_sslc_regno varchar(10), 
    p_sslc_year_of_passing character(4), 
    p_sslc_board_of_examination integer, 
    p_password character(128), 
    p_ip_address varchar(15) 
) 
RETURNS integer 
AS 
$BODY$ 
DECLARE 
    max_row_count integer; 
    random_no integer; 
    v_regno character(10); 
BEGIN 

    SELECT COUNT(*) INTO max_row_count FROM candidates WHERE course_level_code = p_course_level_code; 

    max_row_count := max_row_count + 1; 

    v_regno := cast(p_course_level_code as character) || cast(trunc(random() * 89999 + 10000) as integer) || to_char(max_row_count, 'FM0000'); 

    INSERT INTO candidates 
     (regno, name, dob, course_level_code, email, mob, sslc_regno, sslc_year_of_passing, sslc_board_of_examination, password, created_on, ip_address) 
    VALUES 
     (v_regno, p_name, p_dob, p_course_level_code, p_email, p_mob, p_sslc_regno, p_sslc_year_of_passing, p_sslc_board_of_examination, p_password, now(), p_ip_address); 

    RETURN 1; 

END; 
$BODY$ 
LANGUAGE plpgsql; 

如果我做错了什么pl。让我知道。

我使用的是Postgres 9.4

enter image description here

+0

当创建或执行?因为我复制你的函数在我的数据库,它只是创建没有任何错误(S) –

+0

你怎么(从哪里)_call_函数? –

+0

创建函数时发生错误。我通过PgAdmin SQL编辑器尝试过。 –

回答

1
INSERT INTO candidates 
    (regno 
    ^------- The error 

ERROR: syntax error at or near "$1" 
LINE 1: INSERT INTO candidates ($1 

问题是regno是PLPGSQL变量,因为它是在输出表中的列名。

RETURNS TABLE 
(
    regno char(10), 

RETURNS TABLE每个条目都登记为一个变量,以便可以分配给它,并使用RETURN NEXT

当解析和处理,在报表PLPGSQL变量与位置参数代替像$1$2等。这就是为什么错误是它是什么,并且也是为什么一些在插入列名 - 后来的条目列表不会被替换。它们不与参数名称冲突。

使用不同的变量名称。

我认为9.5检测参数名称冲突并报告更清晰的错误。

+0

谢谢@Craig Ringer,现在工作 –

0

终于在我改变了返回表中的变量名后开始工作。 感谢所有