ste*_*mex 3 postgresql plpgsql
我无法解决这个问题:
CREATE OR REPLACE FUNCTION dpol_insert(
dpol_cia integer, dpol_tipol character, dpol_nupol integer,
dpol_conse integer,dpol_date timestamp)
RETURNS integer AS
$BODY$
DECLARE tabla text := 'dpol'||EXTRACT (YEAR FROM $5::timestamp);
BEGIN
EXECUTE '
INSERT INTO '|| quote_ident(tabla) ||'
(dpol_cia, dpol_tipol, dpol_nupol, dpol_conse, dpol_date) VALUES ($1,$2,$3,$4,$5)
';
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Run Code Online (Sandbox Code Playgroud)
在尝试时
SELECT dpol_insert(1,'X',123456,1,'09/10/2013')
Run Code Online (Sandbox Code Playgroud)
返回下一条消息:
ERROR: there is no parameter $1
LINE 3: ...tipol, dpol_nupol, dpol_conse, dpol_date) VALUES ($1,$2,$3,$...
^
QUERY:
INSERT INTO dpol2013
(dpol_cia, dpol_tipol, dpol_nupol, dpol_conse, dpol_date) VALUES ($1,$2,$3,$4,$5)
CONTEXT: PL/pgSQL function "dpol_insert" line 4 at EXECUTE statement
Run Code Online (Sandbox Code Playgroud)
*** 错误 ***
ERROR: there is no parameter $1
SQL state: 42P02
Context: PL/pgSQL function "dpol_insert" line 4 at EXECUTE statement
Run Code Online (Sandbox Code Playgroud)
mu *_*ort 10
你这里有几个问题.当前的问题是:
错误:没有参数$ 1
之所以会发生这种情况,是因为$1在SQL中你要处理EXECUTE $1与主函数体内部不同.EXECUTE SQL中的编号占位符位于EXECUTE的上下文中,而不是在函数的上下文中,因此您需要为这些占位符提供一些EXECUTE参数:
execute '...' using dpol_cia, dpol_tipol, dpol_nupol, dpol_conse, dpol_date;
-- ^^^^^
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅手册中的执行动态命令.
接下来的问题是你没有从你的功能中返回任何东西RETURNS integer.我不知道你打算什么回来,但也许你tablea有一个SERIAL id,你想回来.如果是这样,那么你想要更像这样的东西:
declare
tabla text := 'dpol' || extract(year from $5::timestamp);
id integer;
begin
execute 'insert into ... values ($1, ...) returning id' into id using dpol_cia, ...;
-- ^^^^^^^^^^^^ ^^^^^^^
return id;
end
Run Code Online (Sandbox Code Playgroud)
在你的功能.
| 归档时间: |
|
| 查看次数: |
9310 次 |
| 最近记录: |