小编ind*_*ago的帖子

将公式存储在表格中并在函数中使用该公式

我有一个 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

10
推荐指数
2
解决办法
9997
查看次数

如何将带有数组字段的表类型传递给 postgresql 中的函数

我有一张桌子叫书

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 datatypes functions postgresql-9.1 array

8
推荐指数
2
解决办法
9762
查看次数

UPSERT 函数中的复合类型问题

我在 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)

postgresql plpgsql postgresql-9.1 upsert

7
推荐指数
2
解决办法
895
查看次数

获取当月的所有日期

我在 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)

mysql datetime date

7
推荐指数
2
解决办法
7万
查看次数

多个表的一个触发器

我在 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)

对所有这些表都这样做,然后我们有多个模式,所以工作量很大,这可以在一个查询中完成吗?然后影响该模式或整个数据库中的所有表?

postgresql trigger database-design postgresql-9.1

6
推荐指数
1
解决办法
2万
查看次数

对日期时间列的慢速选择查询

我在 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))。我怎样才能无限制地实现这一目标?

mysql performance query-performance

3
推荐指数
1
解决办法
1716
查看次数

将表数组作为参数传递给 postgresql 中的 upsert 函数

我有一个运行良好的 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[])吗??任何帮助将不胜感激

postgresql functions postgresql-9.1 array upsert

1
推荐指数
1
解决办法
2936
查看次数