请再帮我一个PL / pgSQL问题。
我有一个PHP脚本作为每日cronjob运行,并从1个主表中删除了旧记录,并删除了一些其他引用其“ id”列的表:
create or replace function quincytrack_clean()
returns integer as $BODY$
begin
create temp table old_ids
(id varchar(20)) on commit drop;
insert into old_ids
select id from quincytrack
where age(QDATETIME) > interval '30 days';
delete from hide_id where id in
(select id from old_ids);
delete from related_mks where id in
(select id from old_ids);
delete from related_cl where id in
(select id from old_ids);
delete from related_comment where id in
(select id from old_ids);
delete …Run Code Online (Sandbox Code Playgroud) 给定以下骨架pl/pgsql函数,true如果更新成功(某些内容实际更新),如何返回,否则返回false?
CREATE FUNCTION UpdateThingy(
/* input parameters */
) RETURNS BOOLEAN AS $$
BEGIN
UPDATE thingies SET /* blah blah */ WHERE /* blah blah */;
RETURN true;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
目前这将始终返回true,即使没有更新的行.我希望false在没有行受更新影响的情况下返回.
用户可以键入名称,系统应与文本匹配,即使用户输入或数据库字段包含重音(UTF-8)字符也是如此.这是使用该pg_trgm模块.
代码类似于以下内容:
SELECT
t.label
FROM
the_table t
WHERE
label % 'fil'
ORDER BY
similarity( t.label, 'fil' ) DESC
Run Code Online (Sandbox Code Playgroud)
当用户键入时fil,查询匹配filbert但不匹配filé powder.(因为重音字符?)
我试图实现一个unaccent函数并将查询重写为:
SELECT
t.label
FROM
the_table t
WHERE
unaccent( label ) % unaccent( 'fil' )
ORDER BY
similarity( unaccent( t.label ), unaccent( 'fil' ) ) DESC
Run Code Online (Sandbox Code Playgroud)
这只返回filbert.
建议:
CREATE EXTENSION pg_trgm;
CREATE EXTENSION unaccent;
CREATE OR REPLACE FUNCTION unaccent_text(text)
RETURNS text AS
$BODY$
SELECT unaccent($1); …Run Code Online (Sandbox Code Playgroud) 我在Postgres 8.3.5中有一个函数,它从多个表中选择数据并将结果转储到一个表中:
create or replace function test_function_2(startdate timestamp, enddate timestamp)
returns void as $$
begin
delete from cl_final_report;
INSERT INTO cl_final_report
SELECT
b.batchkey AS batchnumber,
pv.productkey,
p.name AS productname,
avg(r.value) AS avgchemlean,
sum(r.auxvalue) AS totalweight,
max(o.time) AS timecompleted
FROM result r
LEFT JOIN physicalvalue pv ON r.physicalvaluekey = pv.physicalvaluekey
LEFT JOIN product p ON pv.productkey = p.productkey
LEFT JOIN object o ON r.objectkey = o.objectkey
LEFT JOIN batch b ON o.batchkey = b.batchkey
WHERE pv.name = 'CL'::text AND
and o.time …Run Code Online (Sandbox Code Playgroud) 我的第一个PL/pgSQL函数被设计为将几何列作为输入并输出一个fishnet/grid表(对我来说是一个常见的任务).
我不确定在return语句中我做错了什么,因为我正在返回伪类型记录而不是具有不同列的表.
我的代码:
CREATE OR REPLACE FUNCTION ST_Fishnet(
nrow integer,
ncol integer,
geo_table varchar,
geom_column varchar)
RETURNS Table( ids text, geom geometry)
AS $$
DECLARE
collected_geom geometry;
xmin numeric;
xmax numeric;
ymin numeric;
ymax numeric;
xsize numeric;
ysize numeric;
BEGIN
EXECUTE 'SELECT st_collect("'||$4||'") FROM "'||$3||'"' INTO collected_geom;
xmax := st_xmin(collected_geom);
xmin := st_xmax(collected_geom);
ymin := st_ymin(collected_geom);
ymax := st_ymax(collected_geom);
xsize := abs(xmax - xmin) / $2;
ysize := abs(ymax - ymin) / $1;
RETURN QUERY
SELECT
i+1||'-'||j+1 as ids,
ST_Translate(cell, …Run Code Online (Sandbox Code Playgroud) 我有一个Postgres 8.4架构,如下所示:
My_Database
|-> Schemas
|-> AccountA
|-> AccountB
|-> AccountC
|-> AccountD
|-> AccountE
...
|-> AccountZ
Run Code Online (Sandbox Code Playgroud)
所有模式都有一个调用的表product,我想立即为它们添加一个布尔列.是否有可能做到这一点?
我到目前为止找到的唯一方法是按帐户运行以下SQL帐户.
ALTER TABLE product ADD COLUMN show_price boolean NOT NULL DEFAULT TRUE;
Run Code Online (Sandbox Code Playgroud) 我想尝试做类似的事情
CREATE TEMP TABLE tblname AS (
INSERT INTO tbl2 FROM SELECT(1,1) RETURNING a,b
);
Run Code Online (Sandbox Code Playgroud)
但我有错误:语法错误在"INSERT"或附近;
是否可以组合CREATE TABLE AS SELECT和INSERT FROM SELECT RETURNING子句?
我正在尝试使用返回表的PL/pgSQL(PostgreSQL 9.3)函数编写循环.我RETURN NEXT;在循环中的每个查询后都没有使用参数,下面的示例如plpgsql错误"RETURN NEXT在表返回函数中没有函数和OUT参数",以及其他地方.但是,我仍然收到一条错误消息:
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
Run Code Online (Sandbox Code Playgroud)
下面是重现问题的最小代码示例.任何人都可以请帮助解释如何修复测试代码以返回表格?
提前致谢.
最小的例子:
CREATE OR REPLACE FUNCTION test0()
RETURNS TABLE(y integer, result text) AS $func$
DECLARE
yr RECORD;
BEGIN
FOR yr IN SELECT * FROM generate_series(1,10,1) AS y_(y)
LOOP
RAISE NOTICE 'Computing %', yr.y;
SELECT yr.y, 'hi';
RETURN NEXT;
END LOOP;
RETURN;
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud) 我已经找到了我要在Oracle和SQL Server上解决的问题的解决方案(我认为),但是似乎无法将其转换为Postgres解决方案。我正在使用Postgres 9.3.6。
这个想法是为了生成用于分析目的的有关表内容的“元数据”。这只能通过让每一列都运行查询来找出(例如...)最小/最大/计数值等来完成(AFAIK)。为了使过程自动化,最好让数据库生成查询,然后执行查询。
使用示例salesdata表,我可以使用以下代码段为每列生成一个选择查询,并返回min()值:
SELECT 'SELECT min('||column_name||') as minval_'||column_name||' from salesdata '
FROM information_schema.columns
WHERE table_name = 'salesdata'
Run Code Online (Sandbox Code Playgroud)
优点是,无论列数如何,数据库都会生成代码。现在,我想到了无数个地方来存储这些查询,这些查询可以是某种变量,也可以是表列,其想法是执行这些查询。我想将生成的查询存储在变量中,然后使用EXECUTE(或EXECUTE IMMEDIATE)语句执行它们,这是此处采用的方法(请参见右窗格),但是Postgres不会让我在函数外部声明变量,因此我一直在抓挠我对如何将它们组合在一起,无论是什至是遵循的方向,也许还有更简单的东西。
您有任何指点吗,由于其他问题,我目前正在尝试类似的方法,但不知道我是否朝着正确的方向前进:
CREATE OR REPLACE FUNCTION foo()
RETURNS void AS
$$
DECLARE
dyn_sql text;
BEGIN
dyn_sql := SELECT 'SELECT min('||column_name||') from salesdata'
FROM information_schema.columns
WHERE table_name = 'salesdata';
execute dyn_sql
END
$$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud) postgresql dynamic-sql plpgsql aggregate-functions dynamic-queries
plpgsql ×10
postgresql ×10
create-table ×1
ddl ×1
dynamic-sql ×1
function ×1
performance ×1
postgis ×1
similarity ×1
sql ×1
utf-8 ×1