我必须在数据库中执行循环.这只是一次性要求.执行该函数后,我现在正在删除该函数.
有没有什么好的方法来创建临时/一次性功能?
我正在尝试提取与特定日期和 user_ids 对应的记录计数,这些记录在数据库中的下一个日期没有对应的 user_ids。这是我试图完成它的方式(使用 plpgsql 但不定义函数:
DO
$BODY$
DECLARE
a date[]:= array(select distinct start_of_period from monthly_rankings where balance_type=2);
res int[] = '{}';
BEGIN
FOR i IN array_lower(a,1) .. array_upper(a,1)-1
LOOP
res:=array_append(res,'SELECT COUNT(user_id) from (select user_id from monthly_rankings where start_of_period=a[i] except select user_id from monthly_rankings where start_of_period=a[i+1]) as b');
i:=i+1;
END LOOP;
RETURN res;
$BODY$ language plpgsql
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:无法检索结果:错误:RETURN 不能在返回 void LINE 11: RETURN res; 的函数中有一个参数。我是这种程序语言的新手,无法发现该函数返回 void 的原因。我确实将值分配给了变量,并且我声明了空数组,而不是 NULL 数组。是否有语法或更重要的推理错误?
我想在Postgres中以编程方式运行SQL,而无需创建函数。
原因:确保我的plpgsql可以事先工作,并且在将查询提交给函数之前先对其进行“解释分析”。
我是Postgres的新手,我认为这很简单。我找不到任何示例。也许不可能吗?下面的代码如何工作?
DO
$body$
DECLARE
v_name_short VARCHAR;
BEGIN
v_name_short := 'test Account 1';
RETURN QUERY
SELECT
a.name_short,
a.name_long
FROM enterprise.account a
WHERE
CASE WHEN v_name_short IS NOT NULL THEN
LOWER(a.name_short) = LOWER(v_name_short)
ELSE
1 = 1
END;
END;
$body$
LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
同样,这里的目标是测试我的SQL,就像在这种情况下,我想确保我的CASE语句仍在使用我创建的索引(LOWER(name_short))。无论如何,我收到此错误消息:
错误:无法在非SETOF函数中使用RETURN QUERY
我要问的在Postgres中可能吗?如果没有,是否可以查询函数内部的分析计划?
我有一个NewSchemaSafe.sql基于项目目录创建新模式的脚本;它是从 Windows 命令行调用的,如下所示:
for %%a in (.) do set this=%%~na
-- other stuff here
psql -U postgres -d SLSM -e -v v1=%this% -f "NewSchemaSafe.sql"
Run Code Online (Sandbox Code Playgroud)
NewSchemaSafe.sql 如下:
-- NewSchemaSafe.sql
-- NEW SCHEMA SETUP
-- - checks if schema exists
-- - if yes, renames existing with current monthyear as suffix
-- NOTE: will always delete any schema with the 'rename' name (save_schema)
-- since any schema thus named must have resulted from this script
-- on this date - …Run Code Online (Sandbox Code Playgroud)