create table if not exists tb_log_gps ( id bigint not null, device_id varchar not null, platform_id varchar, location varchar, happen_time varchar, create_time TIMESTAMP NOT NULL DEFAULT now() ); CREATE INDEX idx_tb_log_gps_id ON tb_log_gps(id); CREATE INDEX idx_tb_log_gps_happen_time ON tb_log_gps(happen_time); CREATE OR REPLACE FUNCTION insert_log_gps_partition_func() RETURNS TRIGGER AS $$ DECLARE date_text TEXT; insert_statement TEXT; date_part DATE := '2000-01-01'; date_next DATE := '2000-01-01'; BEGIN SELECT SUBSTRING(NEW.happen_time,1,10) INTO date_text; insert_statement := 'INSERT INTO tb_log_gps_' || date_text ||' VALUES ($1.*);'; EXECUTE insert_statement USING NEW; RETURN NULL; EXCEPTION WHEN UNDEFINED_TABLE THEN date_part := ('''' || date_part('year'::text, to_date(NEW.happen_time,'yyyy-MM-dd hh24:mi:ss')) || '-' || date_part('month'::text, to_date(NEW.happen_time,'yyyy-MM-dd hh24:mi:ss')) || '-' || date_part('day'::text, to_date(NEW.happen_time,'yyyy-MM-dd hh24:mi:ss')))::DATE; date_next := date_part + '1 day'::interval; EXECUTE 'CREATE TABLE IF NOT EXISTS tb_log_gps_' || date_text || '(CHECK(' || 'happen_time' || '>= ''' || date_part::text || ''' AND ' || 'happen_time' || '< ''' || date_next::text || ''')) INHERITS (tb_log_gps);'; EXECUTE 'create index idx_tb_log_gps_' || date_text || '_happen_time on tb_log_gps_' || date_text || '(happen_time);'; EXECUTE 'create index idx_tb_log_gps_' || date_text || '_id on tb_log_gps_' || date_text || '(id);'; EXECUTE insert_statement USING NEW; RETURN NULL; END; $$ LANGUAGE plpgsql VOLATILE; DROP TRIGGER IF EXISTS insert_tb_log_gps_partition_trigger ON tb_log_gps; CREATE TRIGGER insert_tb_log_gps_partition_trigger BEFORE INSERT ON tb_log_gps FOR EACH ROW EXECUTE PROCEDURE insert_log_gps_partition_func(); 插入数据报错,这个分表触发器哪里错了
时间: 2024-02-19 22:03:37 浏览: 248
根据你提供的代码,可能是因为以下几个问题导致插入数据报错:
1. 函数中的 insert_statement 变量定义错误
在函数 insert_log_gps_partition_func() 中,定义了 insert_statement 变量用于存储 INSERT 语句,但是在代码中将值赋给了 insert_log_gps_partition_func(),这个是一个函数,会导致 insert_statement 变量没有值,从而导致插入数据报错。
解决方法是将 insert_log_gps_partition_func() 改为 NEW,将值赋给 insert_statement 变量,如下所示:
```
insert_statement := 'INSERT INTO tb_log_gps_' || date_text ||' VALUES ($1.*);';
```
2. 函数中的单引号使用错误
在函数中拼接 SQL 语句时,需要使用单引号将字符串括起来,但是在代码中出现了多余的单引号,导致语法错误。
解决方法是在需要使用单引号时,使用两个单引号代替一个单引号,如下所示:
```
date_part := ('''' || date_part('year'::text, to_date(NEW.happen_time,'yyyy-MM-dd hh24:mi:ss')) || '-' || date_part('month'::text, to_date(NEW.happen_time,'yyyy-MM-dd hh24:mi:ss')) || '-' || date_part('day'::text, to_date(NEW.happen_time,'yyyy-MM-dd hh24:mi:ss')))::DATE;
```
应该改为:
```
date_part := ('''' || date_part('year'::text, to_date(NEW.happen_time,'yyyy-MM-dd hh24:mi:ss')) || '-' || date_part('month'::text, to_date(NEW.happen_time,'yyyy-MM-dd hh24:mi:ss')) || '-' || date_part('day'::text, to_date(NEW.happen_time,'yyyy-MM-dd hh24:mi:ss')))::DATE;
```
3. 函数中的 EXECUTE 语句使用错误
在函数中使用 EXECUTE 语句执行动态 SQL 语句时,需要使用 USING 子句将参数传递给 SQL 语句,但是在代码中没有传递参数,导致语法错误。
解决方法是在 EXECUTE 语句中添加 USING 子句,如下所示:
```
EXECUTE insert_statement USING NEW;
```
经过以上修改后,代码应该可以正确执行了。
阅读全文