在plpgsql中连接查询字符串中的多个字段
我正在使用plpgsql和hibernate,希望创建一个包含下面给出的查询字符串的函数。在select子句中,我想连接3个字段,但在运行此查询时,我收到如下错误消息: 错误:在“''”处或附近出现语法错误在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
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;