我有一个 PostgreSQL 9.1 数据库,其中的一部分处理代理佣金。每个代理都有他/她自己的计算佣金的公式。我有一个函数来生成每个代理应该获得的佣金数量,但是随着代理数量的增加,它变得无法使用。被迫做一些非常长的case语句和重复的代码,这让我的函数变得非常大。
所有公式都有常量变量:
d .. 那个月的工作天数 r .. 获得新节点 l .. 忠诚度得分 s .. 子代理佣金 b .. 基本利率 我 .. 收入增加
公式可以是这样的:
d*b+(l*4+r)+(i/d)+s
Run Code Online (Sandbox Code Playgroud)
每个代理与人力资源部协商支付公式。那么我可以将公式存储在代理表中,然后像一个小函数一样从表中获取公式并将其转换为值并计算数量吗?
postgresql database-design stored-procedures functions postgresql-9.1
我有一张桌子叫书
CREATE TABLE book
(
id smallint NOT NULL DEFAULT 0,
bname text,
btype text,
bprices numeric(11,2)[],
CONSTRAINT key PRIMARY KEY (id )
)
Run Code Online (Sandbox Code Playgroud)
和一个函数 save_book
CREATE OR REPLACE FUNCTION save_book(thebook book)
RETURNS text AS
$BODY$
DECLARE
myoutput text :='Nothing has occured';
BEGIN
update book set
bname=thebook.bname,
btype=thebook.btype,bprices=thebook.bprices WHERE id=thebook.id;
IF FOUND THEN
myoutput:= 'Record with PK[' || thebook.id || '] successfully updated';
RETURN myoutput;
END IF;
BEGIN
INSERT INTO book values(thebook.id,thebook.bname,thebook.btype,
thebook.bprices);
myoutput:= 'Record successfully added';
END;
RETURN myoutput; …Run Code Online (Sandbox Code Playgroud) 我在 PostgreSQL 9.1 中有一个名为fun_test. 它有一个复合类型作为输入参数,我在调用它时不断收到转换错误。
CREATE OR REPLACE FUNCTION netcen.fun_test(myobj netcen.testobj)
RETURNS boolean AS
$BODY$
DECLARE
tmp_code smallint;
cur_member refcursor;
BEGIN
-- Check if the member exists first
OPEN cur_member FOR
EXECUTE 'SELECT testkey FROM netcen.test WHERE testkey=' || myobj.testkey ;
FETCH cur_member INTO tmp_code;
CLOSE cur_member;
CASE tmp_code
WHEN COALESCE(tmp_code,0)=0 THEN
-- Record not found INSERT a new record
-- will skip user defined validation for now
insert into netcen.test values(myobj.testkey,
myobj.tes,
myobj.testname);
ELSE
-- Record found …Run Code Online (Sandbox Code Playgroud) 我在 MySQL 中有一个查询,它通过获取当月内的所有记录来很好地为我服务;
SELECT date_field,val FROM MY_TABLE WHERE date_field>=(CURDATE()-INTERVAL 1 MONTH);
Run Code Online (Sandbox Code Playgroud)
上面的查询运行良好。所以如果这个月我们只有两个记录和 28 天,它只会带来两个记录。
date_field | val
========================
2015-02-08 | 567
2015-02-09 | 345
Run Code Online (Sandbox Code Playgroud)
但我希望返回的记录数与当月的天数完全相同。如果当月有 28 天并且只有两个记录,它应该带来;
date_field | val
========================
2015-02-01 | 0
2015-02-02 | 0
2015-02-03 | 0
2015-02-04 | 0
2015-02-05 | 0
2015-02-06 | 0
2015-02-07 | 0
2015-02-08 | 567
2015-02-09 | 345
2015-02-10 | 0
2015-02-11 | 0
2015-02-12 | 0
2015-02-13 | 0
2015-02-14 | 0
2015-02-15 | 0
2015-02-16 | 0
2015-02-17 …Run Code Online (Sandbox Code Playgroud) 我在 PostgreSql 9.1 中有一个触发器,我想在插入多个表时触发它。是否可以让它影响所有这些表而不是为所有这些表创建触发器?我有 58 个表,我想使用调用触发器函数的同一个插入触发器,所以我一直在使用
create trigger tuweke
after insert on product
for each row execute procedure tuwekeAdjustextract();
create trigger tuweke
after insert on caneweightment
for each row execute procedure tuwekeAdjustextract();
...
Run Code Online (Sandbox Code Playgroud)
对所有这些表都这样做,然后我们有多个模式,所以工作量很大,这可以在一个查询中完成吗?然后影响该模式或整个数据库中的所有表?
我在 MySQL 中有一个表,它有大约 1000 万条记录,现在一个过去需要微秒的查询现在需要超过 8 秒才能执行!这是我的表结构:
CREATE TABLE `runs` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`runstub` VARCHAR(20) DEFAULT NULL,
`userid` INT(11) DEFAULT NULL,
`processid` INT(11) DEFAULT NULL,
`rundata` VARCHAR(255) DEFAULT NULL,
`token` VARCHAR(60) DEFAULT NULL,
`created_at` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `created_at` (`created_at`)
) ENGINE=INNODB AUTO_INCREMENT=10039971 DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)
这是需要超过 8 秒的查询...
SELECT MIN(created_at), MAX(created_at) FROM runs ORDER BY id DESC LIMIT 10000
Run Code Online (Sandbox Code Playgroud)
有没有办法优化这个查询,让它在不到一秒的时间内运行?
这是我想要达到的结果:从最近的 10k 条记录(不是全部),花费的时间。我想要它开始的时间 ( MIN(created_at)) 和结束的时间 ( MAX(created_at))。我怎样才能无限制地实现这一目标?
我有一个运行良好的 UPSERT 函数,但我批量更新和插入记录,可以修改此函数,以便我将所有记录作为数组传递给此函数,然后它将作为一个事务一次性插入/更新所有记录? 如果记录号 x 失败,它应该回滚撤消在 x 之前插入/更新的任何记录?这是我的 upsert 函数:
CREATE OR REPLACE FUNCTION save_weights(rec tbl_weightment)
RETURNS text AS
$BODY$
DECLARE
myoutput text :='Nothing has occured';
BEGIN
update tbl_weightment set
vname=rec.vname,
iquality=rec.iquality,
vhooks=rec.vhooks,
tstamp=rec.tstamp
vtare=rec.vtare,
vgross=rec.vgross
WHERE id=rec.id;
IF FOUND THEN
myoutput:= 'Record successfully updated';
RETURN myoutput;
END IF;
BEGIN
INSERT INTO tbl_weightment SELECT(rec).*;
myoutput:= 'Record successfully added';
END;
RETURN myoutput;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Run Code Online (Sandbox Code Playgroud)
这个功能可以修改成这样save_weights(rec tbl_weightment[])吗??任何帮助将不胜感激