【发布时间】:2013-07-09 23:04:29
【问题描述】:
我有一个 postgresql 函数/存储过程,它执行以下操作: 1. 调用另一个函数并将值保存到变量中。 2. 使用我从第一步获得的值作为参数执行另一个 sql 语句。
我的问题是查询没有返回任何数据。也不返回任何错误。 我只是 postgresql 的新手,所以我不知道调试的最佳方法......但我在第 1 步之后添加了一个 RAISE NOTICE 命令,如下所示:
SELECT INTO active_id get_widget_id(widget_desc);
RAISE NOTICE 'Active ID is:(%)', active_id;
在 pgadmin3 屏幕的“消息”部分,我看到带有数据的调试消息:
注意:活动 ID 为:(2)
我想知道括号是否对我造成了问题。
这是我在第 2 步中尝试运行的 sql:
SELECT d.id, d.contact_id, d.priority, cp.contact
FROM widget_details d, contact_profile cp, contact_type ct
WHERE d.rule_id=active_id
AND d.active_yn = 't'
AND cp.id=d.contact_id
AND cp.contact_type_id=ct.id
AND ct.name = 'email'
Order by d.priority ASC
您会注意到,在我的 where 子句中,我引用了变量“active_id”。 我知道这个查询应该至少返回一行,因为当我运行一个直接的 sql 选择(而不是使用这个函数)并将值 2 替换为变量“active_id”时,我得到了我正在寻找的数据。
任何建议将不胜感激。
谢谢。
编辑 1:
这是完整的函数定义:
CREATE TYPE custom_return_type AS (
widgetnum integer,
contactid integer,
priority integer,
contactdetails character varying
);
CREATE OR REPLACE FUNCTION test(widget_desc integer)
RETURNS SETOF custom_return_type AS
$BODY$
DECLARE
active_id integer;
rec custom_return_type ;
BEGIN
SELECT INTO active_id get_widget_id(widget_desc);
RAISE NOTICE 'Active ID is:(%)', active_id;
FOR rec IN
SELECT d.id, d.contact_id, d.priority, cp.contact
FROM widget_details d, contact_profile cp, contact_type ct
WHERE d.rule_id=active_id
AND d.active_yn = 't'
AND cp.id=d.contact_id
AND cp.contact_type_id=ct.id
AND ct.name = 'email'
Order by d.priority ASC
LOOP
RETURN NEXT rec;
END LOOP;
END
$BODY$
【问题讨论】:
-
你可能需要展示整个函数——或者至少是它的一个子集——以获得任何真正的帮助。您的函数是否定义为“RETURNS setof RECORD”或类似的东西?
-
bma,看看我的“EDIT 1”。谢谢。
-
你是如何执行函数的?喜欢“
select * from test(2)”? -
快速提示:您可以通过将函数定义为
RETURNS TABLE (....cols....)来避免创建自定义类型。方便多了。 -
那个函数永远不可能运行。您没有在任何地方定义
widget_desc,而且您似乎也没有使用fmfm_number参数。这真的是您遇到问题的确切、未经编辑的代码吗?还是您在发布之前对其进行了编辑而不重新测试?
标签: postgresql stored-procedures