【问题标题】:How to return a query result from postgresql function如何从 postgresql 函数返回查询结果
【发布时间】:2016-01-12 08:57:05
【问题描述】:

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

以下是返回类型为表的函数

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;

如果我做错了什么,请。告诉我。

我正在使用 Postgres 9.4

【问题讨论】:

  • 创建或执行时??因为我在我的数据库中复制了你的函数,它只是创建了没有任何错误
  • 你如何(以及从哪里)调用函数?
  • 创建函数时出错。我通过 PgAdmin SQL 编辑器尝试过。
  • @VineethV 看看这个:-goo.gl/0NeA6T

标签: postgresql user-defined-functions postgresql-9.4


【解决方案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 等。这就是错误的原因,也是插入列中的一些后面条目的原因-name-list 不会被替换。它们不会与参数名称冲突。

使用不同的变量名。

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

【讨论】:

    【解决方案2】:

    在我更改了返回表中的变量名后,它终于开始工作了。 谢谢大家

    【讨论】:

      猜你喜欢
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多