我使用以下命令从服务器的数据库转储一些结构,以便能够在我的本地硬盘驱动器上创建数据样本.
pg_dump -h myserver.com -U product_user -s -f ./data/base.structure.postgresql.sql -F p -v -T public.* -T first_product.* -T second_product.* -T another_product.locales mydatabase
Run Code Online (Sandbox Code Playgroud)
我需要排除一些模式,否则它会最终导致权限或其他错误.即使我排除了schema public,它也会转储该模式中的所有函数,如下所示:
REVOKE ALL ON FUNCTION gin_extract_trgm(text, internal) FROM PUBLIC;
psql:./data/base.structure.postgresql.sql:8482: ERROR: function gin_extract_trgm(text, internal) does not exist
Run Code Online (Sandbox Code Playgroud)
我知道这来自PostgreSQL中的全文或相似插件,但是我没有使用它而且我的机器上不需要它,所以我想排除这些功能.
我怎么能这样做?
我的PostgreSQL数据库包含一个用于存储已注册实体实例的表.此表格通过电子表格上传填充.Web界面允许操作员修改所呈现的信息.但是,原始数据不会被修改.所有的改变都存储在一个单独的表changes与列unique_id,column_name,value和updated_at.
更改完成后,首先查询原始表,然后查询更改表(使用实例ID和最新更改日期,按列名称分组),将其呈现给操作员.这两个结果在PHP中合并,并在Web界面上显示.这是执行任务的一种相当严格的方式,我想将所有逻辑保留在SQL中.
我可以使用以下查询轻松选择表的最新更改:
SELECT fltr_chg.unique_id, fltr_chg.column_name, chg_val.value
FROM changes AS chg_val
JOIN (
SELECT chg_rec.unique_id, chg_rec.column_name, MAX( chg_rec.updated_at )
FROM information_schema.columns AS source
JOIN changes AS chg_rec ON source.table_name = 'instances'
AND source.column_name = chg_rec.column_name
GROUP BY chg_rec.unique_id, chg_rec.column_name
) AS fltr_chg ON fltr_chg.unique_id = chg_val.unique_id
AND fltr_chg.column_name = chg_val.column_name;
Run Code Online (Sandbox Code Playgroud)
从instances表中选择条目同样简单:
SELECT * FROM instances;
Run Code Online (Sandbox Code Playgroud)
现在,如果只有一种方法可以转换前一个结果并将结果值替换为后者,基于unique_id和column_name,并且仍将结果保留为表格,则问题将得到解决.这可能吗?
我确信这不是最罕见的问题,而且很有可能,某些系统会以类似的方式跟踪数据的变化.如果不是通过上述方法之一(当前和寻求的解决方案),他们如何将它们应用于数据?
我编写了一个存储过程,我想用Java调用它.但我不认为它能够对我通过的查询做任何事情.以下是我的java代码:
String QUERY_LOCATION = "select (license_plate) as test from carInst( (select category_name from reservation where rid = ?) , (select lname from reservation where rid = ?))";
//PreparedStatement check_location = null;
PreparedStatement check_location = connection.prepareStatement(QUERY_LOCATION);
check_location.setInt(1, rid);
check_location.setInt(2, rid);
rs = check_location.executeQuery();
if (rs.next()) {
System.out.print("Car found: "+rs.getString("test")+"\n");
license_plate = rs.getString("test");
update_reservation.setString(5, license_plate);
bool = false;
} else {
System.out
.print("There is no car available\n");
}
Run Code Online (Sandbox Code Playgroud)
以下是我用PL/pgSQL(PostgreSQL)编写的存储过程:
CREATE OR REPLACE FUNCTION carInst(cname varchar(20), loc varchar(20) )
RETURNS TABLE (license_plate varchar(6) …Run Code Online (Sandbox Code Playgroud) 如何在PostgreSQL中动态创建数组?
考虑这个,例如:
CREATE OR REPLACE FUNCTION fun( )
RETURNS SETOF void AS
$BODY$
DECLARE
i numeric;
BEGIN
FOR i in 1..10 LOOP
//I have to create an array as
arr1[] ,arr2[] ... based on length
END LOOP;
END;
$BODY$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud) 根据PostgreSQL的文档,可以直接从查询中将数据复制到csv文件,而无需使用中间表.我很好奇如何做到这一点.
CREATE OR REPLACE FUNCTION m_tbl(my_var integer)
RETURNS void AS
$BODY$
DECLARE
BEGIN
COPY (
select my_var
)
TO 'c:/temp/out.csv';
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:没有这样的列'my_var'.
我是plpgsql的初学者,我被困在编码函数中.我需要一个执行以下操作的函数:
给表,该表中的id_field以及该表中的另一个字段:
id_field field_traspose
--------- --------------
1 A
1 B
1 C
2 A
3 F
3 X
Run Code Online (Sandbox Code Playgroud)
id_field field_traspose
--------- --------------
1 A, B, C
2 A
3 F, X
Run Code Online (Sandbox Code Playgroud)
我的尝试:
CREATE OR REPLACE FUNCTION traspose(mytable character varying, id_field character varying, field_traspose character varying)
RETURNS setof RECORD AS
$BODY$
DECLARE
r record;
result record;
BEGIN
FOR r IN EXECUTE 'SELECT '||id_field||','||field_traspose||' from '||mytable LOOP
-- Here should go the logic that joins every field_traspose for a same …Run Code Online (Sandbox Code Playgroud) 我需要在plpgsql脚本中出于多种目的(计算,显示和存储)在变量中获取最后一个查询的执行时间,所以\timing我找不到psql 选项,因为我无法操纵结果时间。您是否知道是否有类似“ get diagnostics”命令的内容,但是要执行时间(或变通)?
get diagnostics my_var := EXECUTION_TIME;
Run Code Online (Sandbox Code Playgroud)
我找不到任何东西比其他row_count和result_oid...
在PLPGSQL函数中,我有一些行来检查记录是否存在.好吧,即使没有记录,FOUND变量也会设置为TRUE.非常奇怪的事情.
我正在测试的行是:
query:='SELECT i.identity_id FROM app.identity as i,' || quote_ident(schema_name) || '.users as u,' || quote_ident(schema_name) || '.udata as ud WHERE i.identity_id=' || p_identity_id || ' and u.identity_id=i.identity_id and ud.identity_id=i.identity_id';
RAISE WARNING 'query=%',query;
PERFORM query;
RAISE WARNING 'FOUND=%',FOUND;
IF FOUND
THEN
RAISE WARNING 'Record found, rising an exception';
RAISE EXCEPTION USING ERRCODE = 'AA002';
END IF;
Run Code Online (Sandbox Code Playgroud)
这是输出:
WARNING: query=SELECT i.identity_id FROM app.identity as i,"comp-1049007476".users as u,"comp-1049007476".udata as ud WHERE i.identity_id=-1615382132 and u.identity_id=i.identity_id and ud.identity_id=i.identity_id …Run Code Online (Sandbox Code Playgroud) 我需要在数据库(PostgreSQL 9.3.5)的许多表上运行相同的查询,并将表名作为参数传递给函数似乎是一件逻辑的事情。通过阅读文档中的示例和众多SO帖子,我仍然无法确定。
使用以下最小示例:
CREATE TABLE films (
code char(5),
kind varchar(10)
);
INSERT INTO films VALUES
('UA502', 'Comedy');
Run Code Online (Sandbox Code Playgroud)
而这个功能:
CREATE OR REPLACE FUNCTION foo(_t text)
RETURNS void AS -- I know, void is not what I am after
$func$
BEGIN
EXECUTE format('SELECT count(*) FROM %I', _t);
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
以下查询捕获了一些内容:
mydb=> SELECT foo('films');
foo
-----
(1 row)
Run Code Online (Sandbox Code Playgroud)
但是,因为我要检索表,所以我编辑第二行并重新创建该函数,如下所示:
CREATE OR REPLACE FUNCTION foo(_t text)
RETURNS TABLE(count integer) AS
$func$
BEGIN
EXECUTE format('SELECT count(*) FROM %I', _t);
END
$func$ LANGUAGE …Run Code Online (Sandbox Code Playgroud) 我在以下功能中做错了什么?
CREATE OR REPLACE FUNCTION extended_sales(area_type varchar, area_code varchar, dpci varchar) RETURNS TABLE(task_id bigint, location_id int)as
$BODY$
BEGIN
IF area_type = 1 THEN
RETURN QUERY select T.task_id, T.location_id from store_price.task T where T.task_payload->>'str_area_type_i'='3';
ELSE IF area_type = 2 THEN
RETURN QUERY select T.task_id, T.location_id from store_price.task T where T.due_date < '2017-10-06';
ELSE
RETURN QUERY select T.task_id, T.location_id from store_price.task T where task_payload->>'str_area_type_i'='1' and task_payload->>'str_area_c'='7' and due_date < '2016-11-07';
END IF;
END
$BODY$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
当我运行上述功能时,它会出现以下错误
ERROR: syntax error at end …Run Code Online (Sandbox Code Playgroud) plpgsql ×10
postgresql ×10
sql ×2
arrays ×1
crosstab ×1
dynamic-sql ×1
function ×1
java ×1
pg-dump ×1
php ×1