在plpgsql中连接查询字符串中的多个字段

在plpgsql中连接查询字符串中的多个字段,sql,postgresql,stored-procedures,plpgsql,Sql,Postgresql,Stored Procedures,Plpgsql,我正在使用plpgsql和hibernate,希望创建一个包含下面给出的查询字符串的函数。在select子句中,我想连接3个字段,但在运行此查询时,我收到如下错误消息: 错误:在“''”处或附近出现语法错误 SQL状态:42601 上下文:PL/pgSQL函数“est\u fn\u dept\u wise\u emp\u report”第30行打开 我是一个使用存储函数的新手,这可能是一个基本问题,但不知何故,我无法找到解决方案 query1 = 'SELECT est_emp_empmas

我正在使用plpgsql和hibernate,希望创建一个包含下面给出的查询字符串的函数。在select子句中,我想连接3个字段,但在运行此查询时,我收到如下错误消息:

错误:在“''”处或附近出现语法错误
SQL状态:42601
上下文:PL/pgSQL函数“est\u fn\u dept\u wise\u emp\u report”第30行打开

我是一个使用存储函数的新手,这可能是一个基本问题,但不知何故,我无法找到解决方案

 query1 = 'SELECT  est_emp_empmaster.emp_no AS est_emp_empmaster_emp_no,
            adm_m_department.dept_name AS adm_m_department_dept_name,
            adm_m_subdepartment.sub_dept_id AS adm_m_subdepartment_sub_dept_id,
            adm_m_subdepartment.sub_dept_name AS adm_m_subdepartment_sub_dept_name,
            est_m_designation.desig_name AS est_m_designation_desig_name,
            est_emp_empmaster.first_name'|| ' ' ||'est_emp_empmaster.middle_name'|| ' '               ||'est_emp_empmaster.surname AS empname
    FROM public.adm_m_department adm_m_department
        INNER JOIN public.adm_m_subdepartment adm_m_subdepartment
        ON adm_m_department.dept_id = adm_m_subdepartment.dept_id
        INNER JOIN public.est_emp_empmaster est_emp_empmaster
        ON adm_m_department.dept_id = est_emp_empmaster.dept_id
        AND adm_m_subdepartment.sub_dept_id = est_emp_empmaster.sub_dept_id
        INNER JOIN public.est_emp_salary est_emp_salary
        ON est_emp_empmaster.emp_no = est_emp_salary.emp_no
        INNER JOIN public.est_m_designation est_m_designation
        ON est_emp_salary.pre_desig_code = est_m_designation.desig_code
        AND est_emp_salary.retired_flag ='|| quote_literal('N') ||'
         WHERE   est_emp_empmaster.corp_coun_id=0 or est_emp_empmaster.corp_coun_id is null or est_emp_empmaster.corp_coun_id = '|| quote_literal($1) ||'
         ORDER BY adm_m_department.dept_id,adm_m_subdepartment.sub_dept_id,est_emp_empmaster.emp_no ASC';


    OPEN refcur FOR
         EXECUTE query1;
    LOOP
         FETCH refcur INTO return_record;
         EXIT WHEN NOT FOUND;
         RETURN NEXT return_record;
    END LOOP;
    CLOSE refcur;**

如果我不通过查询字符串执行,那么上面的查询运行良好。但由于我想对多个条件使用此查询,并且在这些条件下,我想修改此查询以获得不同的结果。

我找到了上述问题的解决方案, 实际上,它在普通查询中运行得很好,但在动态查询中运行时遇到了问题。 上述问题的解决方法如下。再次感谢:)

这可以更简单、更安全、更快(假设至少有Postgres 8.4):

  • 为了解决您的主要问题:用于简单而安全地连接多个列(不会因
    NULL
    而失败)

  • 这里不需要动态SQL,因为变量只是值(不是标识符)

  • 这里不需要
    光标

  • 您不需要
    循环
    <代码>返回查询也会执行同样的操作,更简单、更快

  • 您不需要列别名,只有
    OUT
    参数的名称(隐式地是
    返回表(…)
    中的列名)是相关的

  • 将查询中的多个架构限定项
    public.
    替换为单个
    SET search\u path=public

  • 我还解开了您的查询,使用了短表别名,并重新格式化以使其更易于阅读

  • 这里甚至不需要plpgsql。可以是更简单的SQL函数:


我怀疑每个人都有一个中间名——在这种情况下,解决方案是不好的。实际上,在我的例子中,我只想连接我已经有的查询字符串。我仍然会接受你的回答,因为它可能会对其他开发人员有所帮助。谢谢分享知识。
est_emp_empmaster.first_name||'' ''||est_emp_empmaster.middle_name||'' ''||est_emp_empmaster.surname AS empname
 CREATE OR REPLACE FUNCTION foo(_corp_coun_id int) -- guessing type
  RETURNS TABLE (
    emp_no        int  -- guessing data types ..
   ,dept_name     text -- .. replace with actual types
   ,sub_dept_id   int
   ,sub_dept_name text
   ,desig_name    text
   ,empname       text) AS
$func$
BEGIN

RETURN QUERY
SELECT em.emp_no
      ,dp.dept_name
      ,sb.sub_dept_id
      ,sb.sub_dept_name
      ,ds.desig_name
      ,concat_ws(' ', em.first_name, em.middle_name, em.surname) --  AS empname
FROM   adm_m_department    dp
JOIN   adm_m_subdepartment su ON sb.dept_id = dp.dept_id
JOIN   est_emp_empmaster   em ON em.dept_id = sb.dept_id 
                             AND em.sub_dept_id = sb.sub_dept_id
JOIN   est_emp_salary      sl ON sl.emp_no = em.emp_no
                             AND sl.retired_flag = 'N'    -- untangled join cond.
JOIN   est_m_designation   ds ON ds.desig_code = sl.pre_desig_code
WHERE  em.corp_coun_id = 0 OR
       em.corp_coun_id IS NULL OR
       em.corp_coun_id = $1
ORDER  BY dp.dept_id, sb.sub_dept_id, em.emp_no;

END    
$func$
  LANGUAGE plpgsql SET search_path=public;
 CREATE OR REPLACE FUNCTION foo(_corp_coun_id int)
  RETURNS TABLE (
    emp_no        int  -- guessing data types ..
   ,dept_name     text -- .. replace with actual types!
   ,sub_dept_id   int
   ,sub_dept_name text
   ,desig_name    text
   ,empname       text) AS
$func$
SELECT em.emp_no
      ,dp.dept_name
      ,sb.sub_dept_id
      ,sb.sub_dept_name
      ,ds.desig_name
      ,concat_ws(' ', em.first_name, em.middle_name, em.surname) --  AS empname
FROM   adm_m_department    dp
JOIN   adm_m_subdepartment sb ON sb.dept_id = dp.dept_id
JOIN   est_emp_empmaster   em ON em.dept_id = sb.dept_id 
                             AND em.sub_dept_id = sb.sub_dept_id
JOIN   est_emp_salary      sl ON sl.emp_no = em.emp_no
                             AND sl.retired_flag = 'N'    -- untangled join cond.
JOIN   est_m_designation   ds ON ds.desig_code = sl.pre_desig_code
WHERE  em.corp_coun_id = 0 OR
       em.corp_coun_id IS NULL OR
       em.corp_coun_id = $1
ORDER  BY dp.dept_id, sb.sub_dept_id, em.emp_no;
$func$
  LANGUAGE sql SET search_path=public;