除了语法糖和表现力之外,运行效率的差异是什么.我的意思是,plpgsql可以比plpythonu或pljava快吗?或者它们大致相等?
我们正在使用存储过程来检测中等大小的数据库(大约10M的记录)中几乎重复的人员记录的任务
使用以下代码行获得以下错误:
RAISE NOTICE '*** Rolling back job run id ' || CONVERT(varchar, v_job_run_id)
|| ' for table ' || v_table_name || '***';
Run Code Online (Sandbox Code Playgroud)
错误:
错误:"|"处或附近的语法错误 第43行:提高通知' *
回滚作业运行ID'|| CONVERT(VAR ...
我不能立即从例子中找到这个.我想在一个函数中增加循环中的变量.
例如:
DECLARE
iterator float4;
BEGIN
iterator = 1;
while iterator < 999
.....
iterator ++;
END;
Run Code Online (Sandbox Code Playgroud)
怎么做?
我正在查看有关流量控制的文档:http:
//www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html
并且它们似乎都不适合我,除非这些绝对是模拟递增变量的唯一方法.
我已经编写了一个自动化功能,如下所述,它根据一些规则调用其他一些功能.该函数给出了我想要的结果,但我面临的问题是它在内部处理每个函数后都没有提交数据.一旦主要功能完成,它就会提交整个数据.我想做一个内部事务,它应该在内部函数执行完成时提交数据.我尝试在每个PERFORM语句之后给出一个COMMIT语句,但是我收到一个错误,说"无法在PL/pgSQL中开始/结束事务".
任何人都可以建议我如何在函数内部进行事务处理.
CREATE OR REPLACE FUNCTION ccdb.fn_automation_for_updation()
RETURNS void AS
$BODY$
DECLARE
sec_col refcursor;
cnt integer;
sec_code ccdb.update_qtable%ROWTYPE;
new_cnt integer;
BEGIN
SELECT COUNT(*)
INTO cnt
FROM ccdb.update_qtable
WHERE status_flag IN (-1,1);
OPEN sec_col FOR
SELECT * FROM ccdb.update_qtable WHERE status_flag IN (-1,1);
FOR i IN 1..cnt
LOOP
FETCH sec_col INTO sec_code;
PERFORM ccdb.o_dtr_update(sec_code.section_code);
PERFORM ccdb.o_consumer_update_for_update(sec_code.section_code);
PERFORM ccdb.o_consumer_update_for_insert(sec_code.section_code);
PERFORM ccdb.o_bills_update_for_update(sec_code.section_code);
PERFORM ccdb.o_bills_update_for_insert(sec_code.section_code);
PERFORM ccdb.o_payments_update_for_update_new(sec_code.section_code);
PERFORM ccdb.o_payments_update_for_insert(sec_code.section_code);
PERFORM ccdb.o_payments_map_update_for_update(sec_code.section_code);
PERFORM ccdb.o_payments_map_update_for_insert(sec_code.section_code);
SELECT COUNT(*) INTO new_cnt FROM ccdb.update_qtable WHERE status_flag IN (-1,1);
IF …Run Code Online (Sandbox Code Playgroud) CREATE OR REPLACE FUNCTION mover(src text, dst text, cpquery text, conname text, ifbin boolean) returns void as
$$
DECLARE
cnt integer;
dlcnt integer;
del_count integer;
ret text;
BEGIN
SELECT pg_catalog.dblink_copy_open(conname, dst, ifbin) INTO ret ;
RAISE LOG 'dblink_open %',ret;
execute 'SELECT 1 as check FROM ' || src ||' limit 1' into cnt;
IF cnt=0 THEN
PERFORM pg_sleep(2);
END IF;
IF ifbin=true THEN
RAISE DEBUG 'Start to Copy data with binary';
execute 'COPY (' || cpquery || ' ) to …Run Code Online (Sandbox Code Playgroud) 我刚刚继承了旧的PostgreSQL安装,需要做一些诊断来找出这个数据库运行缓慢的原因.在MS SQL上,您将使用Profiler等工具查看正在运行的查询,然后查看其执行计划的外观.
PostgreSQL存在哪些工具,如果有的话,我可以用它做什么?我很感激任何帮助,因为我对Postgres很新.
我试图将text值转换为timestamp值.对于下表称为a:
id | c1
----+--------------------
1 | 03-03-2000
2 | 01-01-2000
3 | 12/4/1990
4 | 12 Sept 2011
5 | 12-1-1999 12:33:12
6 | 24-04-89 2:33 am
Run Code Online (Sandbox Code Playgroud)
我试图select用演员表演如下:
select id, c1,c1::timestampas c2 from a;
这正常工作,如果有只有前5行,但第6行地方c1是24-04-89 2:33 am它引发以下错误:
错误:日期/时间字段值超出范围:"24-04-89 2:33 am"
提示:也许您需要一个不同的"日期样式"设置.
我想要的是null那些不能被转换为时间戳而不是命令完全失败的值.像这样:
id | c1 | c2
----+--------------------+---------------------
1 | 03-03-2000 | 2000-03-03 00:00:00
2 | 01-01-2000 | 2000-01-01 00:00:00 …Run Code Online (Sandbox Code Playgroud) 我有问题,我在postgresql中有一个函数,计算两个整数,应该将结果返回到c#(npgsql)conosle,我不知道我的错误在哪里,因为调试器没有对我说什么,这是很有帮助.
所以首先是c#的代码和函数的代码.
...
cmd.Parameters["x"].Value = 20;
cmd.Parameters["y"].Value = 22;
connection.Open();
if (connection.State == System.Data.ConnectionState.Open) {
//Console.WriteLine(cmd.Parameters["x"].Value);
command.ExecuteNonQuery();
Console.WriteLine(cmd.Parameters["sum"].Value);
}
Run Code Online (Sandbox Code Playgroud)
现在DB的代码:
CREATE OR REPLACE FUNCTION t2(
IN x integer,
IN y integer,
OUT sum integer)
RETURNS integer AS
$BODY$BEGIN
sum := x + y;
INSERT INTO t2 (x, y, sum) values (x, y, sum);
END
Run Code Online (Sandbox Code Playgroud)
所以,当我尝试运行它时,
Console.WriteLine(cmd.Parameters["sum"].Value);
Run Code Online (Sandbox Code Playgroud)
将为空且["sum"].值为NULL.我究竟做错了什么?我是对的,当我说"sum"是一个OUT变量时,我不需要返回吗?
请帮忙.
求助了,谢谢大家!@Patrick给了我正确的答案: 使用ExecuteScalar()而不是ExecuteNonQuery()
我有使用UUID的表.我希望能够在有或没有UUID的情况下插入新行,因为有时客户端会生成UUID,有时则不会.
每个表都有它的核心:
CREATE TABLE IF NOT EXISTS person (
id UUID PRIMARY KEY DEFAULT gen_random_uuid()
);
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用函数来插入行.我希望能够传递一个NULL id并获得一个默认值(生成的UUID).我有这样的事情:
CREATE OR REPLACE FUNCTION create_person(
id UUID
) RETURNS BOOLEAN LANGUAGE plpgsql SECURITY DEFINER AS $$
BEGIN
INSERT INTO person( id )
VALUES (
COALESCE(id,default)
);
RETURN FOUND;
END;
$$;
Run Code Online (Sandbox Code Playgroud)
我试过这个:
INSERT INTO person ( id ) VALUES (
COALESCE(id, default),
);
Run Code Online (Sandbox Code Playgroud)
还有这个:
INSERT INTO person ( id ) VALUES (
CASE WHEN id IS NULL THEN default ELSE id END
); …Run Code Online (Sandbox Code Playgroud) 在PostgreSQL中,就其目的,优点和缺点而言,预准备语句与SQL或PL/pgSQL函数之间有什么区别?我们什么时候用哪个?
在这个非常简单的例子中,它们是否正常工作,对吗?
CREATE TABLE foo (id INT, name VARCHAR(80));
CREATE FUNCTION myfunc1(INT, VARCHAR(80)) RETURNS void AS '
INSERT INTO foo VALUES ($1, $2);
' LANGUAGE SQL;
SELECT myfunc1(3, 'ben');
CREATE FUNCTION myfunc2(INT, VARCHAR(80)) RETURNS void AS '
BEGIN
INSERT INTO foo VALUES ($1, $2);
END' LANGUAGE plpgsql;
SELECT myfunc2(3, 'ben');
PREPARE fooplan (INT, VARCHAR(80)) AS
INSERT INTO foo VALUES($1, $2);
PREPARE
EXECUTE fooplan(3, 'ben');
Run Code Online (Sandbox Code Playgroud) plpgsql ×10
postgresql ×10
sql ×4
c# ×1
casting ×1
debug-print ×1
increment ×1
sql-function ×1
transactions ×1