Postgresql PLPGSQL错误:查询在参数声明中没有结果数据的目标
我有一个奇怪的Postgres错误说:Postgresql PLPGSQL错误:查询在参数声明中没有结果数据的目标,postgresql,plpgsql,Postgresql,Plpgsql,我有一个奇怪的Postgres错误说: NOTICE: create_task() failed with... error: 42601 query has no destination for result data NOTICE: context: >>PL/pgSQL function app.create_task(character varying,character varying,character varying,integer,integer,integer,
NOTICE: create_task() failed with... error: 42601 query has no destination for result data
NOTICE: context: >>PL/pgSQL function app.create_task(character varying,character varying,character varying,integer,integer,integer,character varying,character varying,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,boolean,integer,character varying,character varying,character varying) line 22 at SQL statement<<
result=undefined
“电子邮件”
(参数声明)与“结果数据”的目的地有什么关系?这甚至不是一个声明。很奇怪。有一些错误消息是不清楚的
我调用的函数声明如下:
CREATE OR REPLACE FUNCTION app.create_task(
identity_id_str varchar,
session_str varchar,
company_id_str varchar,
parent_dep_id integer,
sender_id integer,
recipient_id integer,
title varchar,
description varchar,
template_id integer,
plan_start_date integer,
plan_end_date integer,
start_date integer,
end_date integer,
time2solve integer,
type_id integer,
priority_id integer,
status_id integer,
progress integer,
access integer,
is_template boolean,
udata_id integer,
full_name varchar,
email varchar,
notes varchar
)
RETURNS integer as $$
DECLARE
v_identity_id bigint;
v_session bigint;
v_company_id bigint;
user_id integer;
utype smallint;
server_session bigint;
schema_name varchar;
query varchar;
generic boolean;
current_ts integer;
dep_id integer;
_c text;
BEGIN
SELECT extract(epoch from now())::integer into current_ts;
SELECT identity_id_str::bigint INTO v_identity_id;
SELECT session_str::bigint INTO v_session;
SELECT company_id_str::bigint INTO v_company_id;
schema_name:='comp' || company_id_str;
select session from app.session where app.session.identity_id=v_identity_id and app.session.session=v_session;
IF NOT FOUND
THEN
RAISE EXCEPTION 'Invalid session' USING ERRCODE = '-1';
END IF;
query:='SELECT utype FROM uzer,identity WHERE uzer.identity_id=identity.identity_id AND uzer.user_id=' || sender_id;
EXECUTE QUERY query into utype;
IF NOT FOUND
THEN
RAISE EXCEPTION 'User not found' USING ERRCODE = '-2';
END IF;
IF current_ts > start_date
THEN
start_date:=current_ts;
END IF;
query:='SELECT dep_id FROM ' || schema_name || '.task WHERE dep_id=' || parent_dep_id ;
PERFORM query;
IF NOT FOUND
THEN
RAISE EXCEPTION 'Parent task was not found' USING ERRCODE = '-1';
END IF;
IF udata = 0 THEN
query='INSERT INTO ' || schema_name || '.udata(user_id,email,full_name,notes) VALUES ('
|| user_id
|| ',''' || email
|| ',''' || full_name
|| ''') returning udata_id';
EXECUTE query into udata_id;
END IF;
query:='INSERT INTO ' || schema_name || '.task(template_id,creator_id,user_id,udata_id,num_inlinks,plan_start_date,plan_end_date,start_date,end_date,time2solve,type_id,priority_id,status_id,progress,access,title,description) VALUES('
|| template_id
|| ',' || user_id
|| ',' || user_id
|| ',' || udata_id
|| ',1'
|| ','''''
|| ','''''
|| ','''''
|| ',''''',
|| ',''''',
|| ',' || time2solve
|| ',' || type_id
|| ',' || priority_id
|| ',' || status_id
|| ',' || progress
|| ',' || access
|| ',"' || title
|| '","' || description
|| '") returning dep_id';
EXECUTE query INTO dep_id;
query:='INSERT INTO ' || schema_name || '.link(from_dep_id,to_dep_id,action_id,link_type,sender_id,recipient_id) VALUES(' ||
parent_dep_id || ',' || dep_id || ',2,' || user_id || ',' || recipient_id || ')';
RAISE NOTICE 'q=%',query;
PERFORM query;
query:='INSERT INTO ' || schema_name || '.action(dep_id,sender_id,recipient_id,dateinserted,minutes,code,comment,description) VALUES(' ||
dep_id || ',' || sender_id || ',' || recipient_id || ',' || start_date || ',0,2,1,''Task created'')';
RAISE NOTICE 'q=%',query;
PERFORM query;
RETURN dep_id;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'create_task() failed with... error: % %',SQLSTATE,SQLERRM;
GET STACKED DIAGNOSTICS _c = PG_EXCEPTION_CONTEXT;
RAISE NOTICE 'context: >>%<<', _c;
END
$$ LANGUAGE plpgsql;
这是我的调试输出:
Received from client: {"cmd_code":6,"rkey":"9d07ac2ddb2b1d7f","params":{"identity_id_str":"8","session_str":"162616490852087","company_id_str":"24","task_data":{"parent_dep_id":0,"sender_email":0,"recipient_id":1,"title":"","description":"","template_id":0,"plan_start_date":0,"plan_end_date":0,"start_date":0,"end_date":0,"time2solve":0,"type_id":0,"priority_id":0,"status_id":0,"progress":0,"access":0,"is_template":false,"full_name":"","email:":"hola@mundo.com","notes":""}}}
cmd_code=6
NOTICE: create_task() failed with... error: 42601 query has no destination for result data
NOTICE: context: >>PL/pgSQL function app.create_task(character varying,character varying,character varying,integer,integer,integer,character varying,character varying,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,boolean,integer,character varying,character varying,character varying) line 22 at SQL statement<<
result=undefined
error=|||||||{ Error: ERROR: control reached end of function without RETURN
CONTEXT: PL/pgSQL function app.create_task(character varying,character varying,character varying,integer,integer,integer,character varying,character varying,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,boolean,integer,character varying,character varying,character varying)
at Client._readError (/usr/node/lib/node_modules/pg-native/index.js:80:13)
at Client._read (/usr/node/lib/node_modules/pg-native/index.js:121:19)
at emitNone (events.js:86:13)
at PQ.emit (events.js:185:7)
severity: 'ERROR',
sqlState: '2F005',
messagePrimary: 'control reached end of function without RETURN',
context: 'PL/pgSQL function app.create_task(character varying,character varying,character varying,integer,integer,integer,character varying,character varying,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,boolean,integer,character varying,character varying,character varying)',
sourceFile: 'pl_exec.c',
sourceLine: '361',
sourceFunction: 'plpgsql_exec_function' }||||||||
Error:[[[Error: ERROR: control reached end of function without RETURN
CONTEXT: PL/pgSQL function app.create_task(character varying,character varying,character varying,integer,integer,integer,character varying,character varying,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,boolean,integer,character varying,character varying,character varying)
]]]
从客户处收到:{“cmd_code”:6,“rkey”:“9d07ac2ddb2b1d7f”,“params”:“{”身份id_str“:“8”,“session_str”:“162616490852087”,“公司id_str”:“24”,“任务数据”:{“父部门id”:0,“发件人电子邮件”:0,“收件人id”:1,“标题”:“说明”:“,“模板id”:0,“计划开始日期”:0,“计划结束日期”:0,“开始日期”:0,“结束日期”:0,“结束日期”,“键入\u id:0,“优先级\u id:0”,状态\u id:0,“进度”:0,“访问”:0,“是\u模板”:false,“全名”:”“电子邮件:”hola@mundo.com“,“注释”:“}}”
cmd_代码=6
注意:create_task()失败,错误为:42601查询没有结果数据的目标
注意:context:>>PL/pgSQL函数app.create_任务(字符变化、字符变化、整数、整数、整数、整数、字符变化、整数、整数、整数、整数、整数、整数、整数、整数、布尔、整数、字符变化、字符变化、字符变化)SQL语句第22行可能有不止一个问题。一些错误是以前错误的结果
您尝试使用PERFORM
语句运行动态SQL。它不起作用
query := 'INSERT ...'
PERFORM query; -- it is wrong
EXECUTE query; -- only this is working
PostgreSQL控制台psql
具有命令\sf+funcname
。它显示行号,并可帮助您识别有问题的行。错误消息的行计数开始于函数体的开头,该函数体位于此处的美元引号处(包括行):
第22行实际上是:
select session from app.session where app.session.identity_id=v_identity_id and app.session.session=v_session;
这就是没有目的地的SELECT
。将使用PERFORM
而不是SELECT
,但是如果存在,最好使用:
IF EXISTS (SELECT 1
FROM app.session s
WHERE s.identity_id = v_identity_id
AND s.session = v_session
) THEN
RAISE EXCEPTION 'Invalid session' USING ERRCODE = '-1';
END IF;
可能还有更多的问题,我不再看了
相关,有更多解释:
您的begin…exception
块掩盖了真正错误的位置和性质。将其清除。真正的错误可能是试图在pl/pgsql中选择某个,而不使用进入或返回查询。您希望执行。谷歌搜索错误应该已经解释了这一点帽子
RETURNS integer as $$
select session from app.session where app.session.identity_id=v_identity_id and app.session.session=v_session;
IF EXISTS (SELECT 1
FROM app.session s
WHERE s.identity_id = v_identity_id
AND s.session = v_session
) THEN
RAISE EXCEPTION 'Invalid session' USING ERRCODE = '-1';
END IF;