PostgreSQL | Function&Procedure | 函数与存储过程的区别

8 篇文章 3 订阅
订阅专栏
本文详细比较了PostgreSQL中的函数和存储过程,包括定义、用途、执行特性、事务处理以及参数类型的区别。强调了函数侧重于返回值,存储过程则可用于执行SQL语句,两者在报错提示中的统一称谓显示其在某些场景下的融合性。
摘要由CSDN通过智能技术生成

PostgreSQL | Function&Procedure | 函数与存储过程的区别

你可能想了解:PostgreSQL的Function和Procedure是一个东西吗?有什么区别?分别用于什么场景?如何更好的理解与记忆?有没有什么注意事项?

1. 简述

书面说法

函数(Function)和存储过程(Stored Procedure)都是数据库中的可重用代码块,用于执行特定的任务。

  1. 两者都提供了代码封装的机制,可以将一系列操作组织成单个单元。
  2. 都可以接受参数,并且可以返回结果。
  3. 存储过程和函数都可以在多个地方重复使用,减少了代码的冗余。
  4. 存储过程更倾向于执行一系列的操作,而函数更专注于返回一个值。

大白话讲

  1. Function通过Returns进行结果值返回,Procedure没有Returns返回值功能。(区别只是有没有Returns并不是说谁不能返回)
  2. Function通过Returns返回一个/组值,也可以returns record返回INOUT, OUT类参数值,这时候就不可以添加sql_body中的return语句。
  3. Procedure虽然不能使用Returns返回信息,但是可以通过INOUT类型参数返回多值,但不能使用Out。
  4. Functions可以被其它查询函数夹带调用并返回结果值(select XXX),Procedures不行,它只能使用CALL调用。
  5. 但是,我们说但是,在PG里Function和Procedure可以广义的理解差不多就是一个东西,结论看最后的问题示例。

2. 函数(Function)

2.1 定义

函数是一段预编译的代码,接受输入参数并返回一个值。函数可以是内置的系统函数,也可以是用户自定义的函数。

2.2 用途

函数主要用于计算和返回一个值,而不是执行一系列的SQL语句。它可以在SELECT语句、WHERE子句、ORDER BY子句等中使用。

2.3 执行

函数通常在SQL语句中嵌套使用,可以用于计算列值、过滤数据等。

2.4 事务处理

一般情况下,函数不包含事务控制语句,因为它们的目标是计算而不是执行修改数据库结构的操作。

2.5 说点例子

CREATE [ OR REPLACE ] FUNCTION
    name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
    [ RETURNS rettype
      | RETURNS TABLE ( column_name column_type [, ...] ) ]
  { LANGUAGE lang_name
    | TRANSFORM { FOR TYPE type_name } [, ... ]
    | WINDOW
    | { IMMUTABLE | STABLE | VOLATILE }
    | [ NOT ] LEAKPROOF
    | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
    | { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER }
    | PARALLEL { UNSAFE | RESTRICTED | SAFE }
    | COST execution_cost
    | ROWS result_rows
    | SUPPORT support_function
    | SET configuration_parameter { TO value | = value | FROM CURRENT }
    | AS 'definition'
    | AS 'obj_file', 'link_symbol'
    | sql_body
  } ...


-- 简单点,常用结构
CREATE OR REPLACE FUNCTION FUNCTION_NAME(IN PARA1 INT,INOUT PARA2 INT, OUT PARA3) 
RETURNS [TYPE|RECORD] LANGUAGE plpgsql
AS $$
DECLARE
BEGIN
[RETURN TYPE]
END;
$$;
1. 当参数都是IN类时

argmode:IN、INOUT、OUT(其中IN类参数类型可以将IN省略不写)

RETURNS TYPE + return xxx 按标准方式处理即可

CREATE OR REPLACE FUNCTION f01(IN a INT,IN b INT) RETURNS INT
LANGUAGE plpgsql
AS $$
DECLARE
BEGIN
	return a+b;
END;
$$;

select f01(1,2);

在这里插入图片描述

2. 参数中出现OUT、INOUT参数时

FUNCTION的sql_body中不能出现return行,否则报错;

  1. 若OUT、INOUT参数出现数量为1个,RETURNS Type 的TYPE需要与INOUT参数一致,且存储过程内不需要写return;
  • 正确写法

    CREATE OR REPLACE FUNCTION f01(IN a INT,INOUT b INT) RETURNS INT
    LANGUAGE plpgsql
    AS $$
    DECLARE
    BEGIN
    b := a+b;
    -- return b;
    END;
    $$;
    
    select f01(2,3);
    

  • 有INOUT、OUT,function内有return会报错

    --ERROR:  RETURN cannot have a parameter in function with OUT parameters
    CREATE OR REPLACE FUNCTION f01(IN a INT,INOUT b INT) RETURNS INT
    LANGUAGE plpgsql
    AS $$
    DECLARE
    BEGIN
      b := a+b;
      return b;
    END;
    $$;
    

    在这里插入图片描述

  • 有INOUT、OUT,RETURNS TYPE不匹配会报错

    --ERROR:  function result type must be integer because of OUT parameters
     CREATE OR REPLACE FUNCTION f01(IN a INT,INOUT b INT) RETURNS VARCHAR
     LANGUAGE plpgsql
     AS $$
     DECLARE
     BEGIN
       b := a+b;
     END;
     $$;
    

  • 有OUT参数时,调用时OUT参数位不需要输入信息的,否则报错-

    -- HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
    CREATE OR REPLACE FUNCTION f01(IN a INT,OUT b INT) RETURNS INT
    LANGUAGE plpgsql
    AS $$
    DECLARE
    BEGIN
      b := a+b;
    END;
    $$;
    
    select f01(2,3);
    

  • 有INOUT参数时,INOUT参数位必须输入信息,否则报错

    -- HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
    CREATE OR REPLACE FUNCTION f01(IN a INT,INOUT b INT) RETURNS INT
    LANGUAGE plpgsql
    AS $$
    DECLARE
    BEGIN
    b := a+b;
    END;
    $$;
    
    select f01(2);
    

  1. 若OUT、INOUT参数出现数量为多个,需要改写为RETURNS record
  • 正确写法

    CREATE OR REPLACE FUNCTION f01(IN a INT,INOUT b INT,OUT c INT) RETURNS record
    LANGUAGE plpgsql
    AS $$
    DECLARE
    BEGIN
      b := a+b;
      c := b*b;
    END;
    $$;
    
    select f01(1,2);
    

  • 未调整为RETURNS record,将会报错

    --ERROR: function result type must be record because of OUT parameters
    CREATE OR REPLACE FUNCTION f01(IN a INT,INOUT b INT,OUT c INT) RETURNS INT
    LANGUAGE plpgsql
    AS $$
    DECLARE
    BEGIN
     b := a+b;
     c := b*b;
    END;
    $$;
    

  • 多INOUT、OUT参数其它错误与1个INOUT、OUT基本一致,不再举例。

3. 存储过程(Procedure)

3.1 定义

存储过程是一组预编译的SQL语句集,被保存在数据库中,可以在需要时调用执行。存储过程通常由数据库管理员或有特殊权限的用户创建。

3.2 用途

存储过程主要用于封装和执行一系列的SQL语句,以完成特定的任务。它可以接受参数,并可以包含条件逻辑、循环等程序控制结构。

3.3 执行

存储过程可以被应用程序或其他存储过程调用。一旦创建,它们可以在数据库中被重复使用,提高了代码的可维护性和可重用性。

3.4 事务处理

存储过程可以包含事务控制语句,允许进行复杂的事务处理。

3.5 说点例子

CREATE [ OR REPLACE ] PROCEDURE
    name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
  { LANGUAGE lang_name
    | TRANSFORM { FOR TYPE type_name } [, ... ]
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    | SET configuration_parameter { TO value | = value | FROM CURRENT }
    | AS 'definition'
    | AS 'obj_file', 'link_symbol'
    | sql_body
  } ...


-- 简单点,常用结构
CREATE OR REPLACE PROCEDURE PROCEDURE_NAME(IN/INOUT PARA1,...)
AS $$
Declare
BEGIN
END;
$$ Language plpgsql;
  1. 基本用法与Function一致,只是Procedure参数中不能使用OUT类型,且不能使用Returns返回数据。

    CREATE OR REPLACE PROCEDURE p01(IN a INT, INOUT b INT, INOUT c INT) Language plpgsql
    AS $$
    DECLARE
    BEGIN
      b := a+b;
      c := b*b;
    END;
    $$;
    
    call p01(2,3,4);
    

  2. 如果使用OUT参数将报错

    --ERROR:  procedures cannot have OUT arguments
    --HINT:  INOUT arguments are permitted.
    CREATE OR REPLACE PROCEDURE p01(IN a INT, INOUT b INT, OUT c INT) Language plpgsql
    AS $$
    DECLARE
    BEGIN
      b := a+b;
      c := b*b;
    END;
    $$;
    

问题

  1. 函数和存储过程是否都可以执行DDL?

    答案是:在PG中都可以执行,不过函数一般用来计算结果,最好不要夹带DDL语句;

    CREATE OR REPLACE FUNCTION f01() RETURNS VOID Language plpgsql
    AS $$
    DECLARE
    BEGIN
      CREATE TABLE IF NOT EXISTS t1(id int);
      DROP TABLE t1;
    END;
    $$;
    select f01();
    
    CREATE OR REPLACE PROCEDURE p01() Language plpgsql
    AS $$
    DECLARE
    BEGIN
    	CREATE TABLE IF NOT EXISTS t1(id int);
      DROP TABLE t1;
    END;
    $$;
    call p01();
    

  2. 为什么说PG中 函数 与 存储过程 广义上可以理解为一个东西?

    我们来看一个报错,通过报错提示我们发现,函数与存储过程在报错中都被叫做function

    CREATE OR REPLACE FUNCTION f01() RETURNS VOID Language plpgsql
    AS $$
    DECLARE
    BEGIN
    	-- 不存在这张表,会报错;
      DROP TABLE t123;
    END;
    $$;
    select f01();
    
    CREATE OR REPLACE PROCEDURE p01() Language plpgsql
    AS $$
    DECLARE
    BEGIN
    	-- 不存在这张表,会报错;
      DROP TABLE t456;
    END;
    $$;
    call p01();
    

参阅

SQL - CREATE FUNCTION
SQL - CREATE PROCEDURE
Procedures Vs. Functions in PostgreSQL





🎉如果对你有所帮助,可以点赞、关注、收藏起来,不然下次就找不到了🎉


【点赞】⭐️⭐️⭐️⭐️⭐️
【关注】⭐️⭐️⭐️⭐️⭐️
【收藏】⭐️⭐️⭐️⭐️⭐️

Thanks for watching.
Kenny

PostgreSQL 存储过程Procedures)和函数Functions)的区别
灰的博客
10-30 7017
什么是存储过程,什么是函数,它们有什么区别Postgresql中, 其实这两个都是同一个概念,创建方式相同,都是create function … 上图的区分: 存储过程Procedures):无返回值(返回值为void)的函数function)。 函数functions):有返回值(返回值非void)的函数function)。 在Oracle中, 1、创建方式不同, 存储过程,创建方式是create procedure函数,创建方式是create function … 2、函数只能返回
PostgreSQL函数存储过程的基本使用
热门推荐
Mr_Door的博客
10-14 4万+
postgre存储过程新手入门级教程。存储过程的基本结构和调用。存储过程变量赋值。存储过程if语句、for语句使用...
PostgreSQL——存储过程函数
最新发布
cf_808的博客
07-31 1262
PostgreSQL(简称PG)是一个功能强大的开源对象-关系数据库系统,支持几乎所有的SQL标准并且提供了许多其他现代特性。在PostgreSQL中,存储过程函数数据库编程的重要组成部分,它们允许用户封装复杂的数据库操作逻辑,以提高代码的重用性、减少网络传输的数据量,并增强数据库操作的安全性。
MySQL高级之存储过程和存储函数
淮右布衣的博客
04-07 1009
存储过程和存储函数1 存储过程函数概述2 创建存储过程3 调用存储过程4 查看存储过程5 删除存储过程6 语法6.1 变量6.2 if条件判断6.3 传递参数6.4 case结构6.5 while循环6.6 repeat结构6.7 loop语句6.8 leave语句6.9 游标/光标7 存储函数 1 存储过程函数概述 存储过程函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合,调...
PostgreSQ 存储过程 和 存储函数区别
weixin_49242088的博客
11-12 1740
1、存储过程用户在数据库中完成特定操作或者任务(如插入、删除、更新),函数用于返回特定的数据。 2、存储过程声明用 PROCEDURE函数FUNCTION。 3、存储过程不需要返回类型,函数必须要返回类型。 4、存储过程可作为独立的plsql执行,函数不能做独立的plsql执行,必须做为表达的一部分。 5、 存储过程只能通过out,in/out,来返回值,函数除了可以使用out,in/out以外,还可以使用 return 返回值。 6、 sql 语句(dml或select)中不可用调用存储过
【Postgres】11、PROCEDURE 存储过程FUNCTION 函数、使用方式和区别
呆呆的猫的博客
02-19 1936
PostgreSQL中,存储过程Procedure)和函数Function)是两种可执行的数据库对象,它们之间有一些区别。总体来说,Function 功能更强大
浅谈数据库中的存储过程
007liuchao007
12-24 112
[url]http://www.cnblogs.com/Alpha-Fly/archive/2012/04/08/2437577.html[/url] [size=large]一、存储过程函数区别:   1.一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。   2.对于存储过程来说可以返回参数(output),而函数只能返回值或者表对象。   3.存...
Oracle————存储过程函数
追梦无惧
05-30 2139
存储过程 存储过程参数模式包括IN、OUT、 IN OUT。 IN(默认参数模式):表示当存储过程别调用时,实参值被传递给形参;形参起变量作用,只能读该参数,而不能修改该参数。IN模式参数可以是变量或表达式。 OUT:表示当存储过程被调用时,实参值被忽略;形参起未初始化的PL/SQL变量的作用,形参的初始值为NULL,可以进行读/写操作,在存储过程调用结束后,形参值被给实参。OUT模式参数只...
Mybatis调用PostgreSQL存储过程实现数组入参传递
12-16
在本文中,我们将探讨如何在Mybatis框架中调用PostgreSQL存储过程,特别是处理 PostgreSQL 的数组类型作为存储过程的输入参数。Mybatis是一个流行的Java持久层框架,它允许开发者编写SQL语句,并与Java对象进行...
PostgreSQL中调用存储过程并返回数据集实例
09-10
PostgreSQL数据库中,存储过程是一种用户自定义的SQL集合,它可以执行一系列操作,并可能返回一个或多个结果。本文将详细讲解如何在PostgreSQL中创建存储过程并返回数据集,通过一个具体的实例来阐述整个流程。 1...
java 调用postgresql 函数_如何用Java调用PostgreSQL过程?
weixin_35330796的博客
02-25 931
如何在Java中像这样进行查询并获得结果:SELECT filedata.num,st_area(ST_Difference(ST_TRANSFORM(filedata.the_geom,70066),filedata_temp.the_geom))FROM filedata, filedata_tempWhere filedata.num=filedata_temp.num或者,如果我从此查询在...
PostgreSQLPostgreSQL重命名表的函数(rename_table_f)及存储过程(rename_table_p)
tttzzzqqq2018的博客
03-13 719
【实操】【PostgreSQLPostgreSQL重命名表的函数(rename_table_f)及存储过程(rename_table_p)
java 调用postgresql 函数_PostgreSQL调用函数
weixin_39862097的博客
02-16 987
PostgreSQL允许函数有命名参数,可以被位置 或名称表示法调用。名称表示法对有大量参数的函数特别有用,因为它更加明确和可靠的标记了形参和实参之间的联系。在位置表示法里,一个函数调用的参数值要用与函数声明相同的顺序来写出。在名称表示法里,参数是通过名称来与函数参数相匹配的,可以以任意顺序写出。不管用那种表示法,在函数声明时给出的有默认值的参数在调用时不必写出。但是这在名称表示法中是特别有用的,...
存储过程函数区别
weixin_42615105的博客
03-17 2411
储存过程与函数区别: 1、标识符不同。函数的标识符为FUNCTION,过程为:PROCEDURE。 2、函数中有返回值,且必须返回,而过程没有返回值。 3、过程无返回值类型,不能将结果直接赋值给变量;函数有返回值类型,调用时,除在select中,必须将返回值赋给变量。 4、函数可以在select语句中直接使用,而过程不能,例如:假设已有函数fun_getAVG() 返回number类型绝对值。那...
mysql 自定义函数function函数存储过程区别
Meiko记录
05-27 4645
1.MySQL自定义函数简介  在MySQL中使用自定义函数也需要相应的要求,语法如下,  创建新函数:    Create function function_name(参数列表)    returns返回值类型    函数体内容  相关说明,函数名:应该合法的标识符,并且不应该与已有的关键字冲突。一个函数应该属于某数据库,可以使用db_name.funciton_name的形式执行当前函数所属...
面试题20: 存储过程函数区别
伤心的辣条
07-26 1395
存储过程是一组预定义的SQL语句,可以通过参数接收输入数据,并返回输出数据。存储函数是一组可重复使用的SQL语句,可以接收输入参数并返回输出值。
函数存储过程区别
Winn~
09-30 1011
先看一下存储过程函数的定义。存储过程: 存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。 存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回
postgresql 找出当前的所有存储过程函数
06-02
要找出 PostgreSQL 数据库中当前的所有存储过程函数,可以使用以下 SQL 查询语句: ``` SELECT proname AS procedure_name, pg_get_function_identity_arguments(oid) AS arguments, pg_get_functiondef(oid) AS definition FROM pg_proc WHERE proname NOT LIKE 'pg_%' AND proname NOT LIKE 'sql_%' ORDER BY proname; ``` 这条 SQL 查询语句将返回一个结果集,其中包含每个存储过程函数的名称、参数和定义。请注意,此查询将排除以“pg_”和“sql_”开头的函数,因为这些函数PostgreSQL 系统函数,而不是用户定义的函数
写文章

热门文章

  • python中input输出“Name ‘XXX‘ is not defined问题 36549
  • 胖客户端与瘦客户端概念与区别 25375
  • Database | DBeaver | 完美解决驱动下载/连接失败报错问题 18730
  • 解决 ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务 14440
  • Python | Pycharm | 快速统计项目代码行数 13461

分类专栏

  • 高可用 1篇
  • 负载均衡 1篇
  • Keepalived 1篇
  • Python - 基础 60篇
  • Javascript 1篇
  • 华为 1篇
  • Odoo | 笔记 45篇
  • Odoo - 基础 5篇
  • Docker 5篇
  • Kubernetes(K8S) 1篇
  • Openstack
  • Django 1篇
  • Flask 1篇
  • Leetcode 6篇
  • ORACLE 8篇
  • Linux 14篇

最新评论

  • Nas | Docker | 获取镜像太慢、失败等(绿源DX4600)

    nuoyan_cfan: 管用且好用。

  • Database | DBeaver | 【一键解决】找不到自己的数据库?

    比特本特: 新版本都有,是不是版本比较旧?

  • Database | DBeaver | 【一键解决】找不到自己的数据库?

    Chris_G1024: 没有该选项啊

  • Database | DBeaver | 【一键解决】找不到自己的数据库?

    长生_zz: 太感谢了,还以为建了一天的数据库都没了表情包

  • Database | DBeaver | 【一键解决】找不到自己的数据库?

    水平则静: 没有"缺省数据库"这个选项

大家在看

  • 【学术会议征稿】第三届地理信息与遥感技术国际学术会议(GIRST 2024) 103
  • 【Java】通俗易懂方法引用
  • 提货券软件的功能介绍及市场推荐分析
  • 【无人机设计与控制】基于改进拥挤距离的多模态多目标优化差分进化(MMODE-ICD)求解无人 1399
  • 【中科协认证会议】第五届机械工程、智能制造与自动化技术国际学术会议(MEMAT 2024) 27

最新文章

  • NGINX+KEEPALIVED | 一文搞懂NG+KL负载均衡高可用架构的实操教程(详细)
  • Vscode | Python | launch.json配置gevent多进程断点失效问题处理
  • MacOS | Cherry | MacOS使用Cherry键盘如何切换F1-F12的功能键
2024年5篇
2023年18篇
2022年16篇
2021年27篇
2020年13篇
2019年20篇
2018年24篇
2017年18篇
2016年6篇
2015年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比特本特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家南通玻璃钢雕塑诚信企业淮北玻璃钢雕塑定做常见玻璃钢花盆设计动物玻璃钢雕塑生成厂家玻璃钢花盆美观实用北京走廊商场美陈销售怒江玻璃钢座椅雕塑造价五华区玻璃钢雕塑定做厂家哪里好福建景观玻璃钢雕塑多少钱淮南大型户外玻璃钢雕塑报价抽象玻璃钢雕塑哪家好南京广场玻璃钢雕塑制作校园文化玻璃钢雕塑造型舟山玻璃钢雕塑哪家便宜主题玻璃钢雕塑图片重庆玻璃钢雕塑市场报价荆门景区玻璃钢雕塑生产厂家铜陵玻璃钢雕塑多少钱一平米东方玻璃钢景观雕塑澳门玻璃钢造型雕塑大同玻璃钢广场雕塑定制福建抽象玻璃钢雕塑批发西安玻璃钢花盆生产厂家大连哪里有玻璃钢雕塑厂家电话玻璃钢雕塑制作合同商场夏季海洋美陈布置方案辽宁玻璃钢雕塑工程施工标准昆明步行街玻璃钢雕塑吉林玻璃钢人物雕塑新化玻璃钢造型雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化