-- Function: maint_sales_summary_bytime()
-- DROP FUNCTION maint_sales_summary_bytime();
CREATE OR REPLACE FUNCTION maint_sales_summary_bytime()
RETURNS trigger AS
$BODY$
DECLARE
delta_time_key integer;
delta_amount_sold numeric(15,2);
delta_units_sold numeric(12);
delta_amount_cost numeric(15,2);
BEGIN
-- Work out the increment/decrement amount(s).
IF (TG_OP = 'DELETE') THEN
delta_time_key = OLD.time_key;
delta_amount_sold = -1 * OLD.amount_sold;
delta_units_sold = -1 * OLD.units_sold;
delta_amount_cost = -1 * OLD.amount_cost;
ELSIF (TG_OP = 'UPDATE') THEN
-- forbid updates that change the time_key -
-- (probably not too onerous, as DELETE + INSERT is how most
-- changes will be made).
IF ( OLD.time_key != NEW.time_key) THEN
RAISE EXCEPTION 'Update of time_key : % -> %
not allowed', OLD.time_key, NEW.time_key;
END IF;
delta_time_key = OLD.time_key;
delta_amount_sold = NEW.amount_sold -
OLD.amount_sold;
delta_units_sold = NEW.units_sold - OLD.units_sold;
delta_amount_cost = NEW.amount_cost -
OLD.amount_cost;
ELSIF (TG_OP = 'INSERT') THEN
delta_time_key = NEW.time_key;
delta_amount_sold = NEW.amount_sold;
delta_units_sold = NEW.units_sold;
delta_amount_cost = NEW.amount_cost;
END IF;
-- Insert or update the summary row with the new values.
<<insert_update>>
LOOP
UPDATE sales_summary_bytime
SET amount_sold = amount_sold +
delta_amount_sold,
units_sold = units_sold + delta_units_sold,
amount_cost = amount_cost + delta_amount_cost
WHERE time_key = delta_time_key;
EXIT insert_update WHEN found;
BEGIN
INSERT INTO sales_summary_bytime (
time_key,
amount_sold,
units_sold,
amount_cost)
VALUES (
delta_time_key,
delta_amount_sold,
delta_units_sold,
delta_amount_cost
);
EXIT insert_update;
EXCEPTION
WHEN UNIQUE_VIOLATION THEN
-- do nothing
END;
END LOOP insert_update;
RETURN NULL;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION maint_sales_summary_bytime() OWNER TO postgres;
------------------------------------------------------------------------------------------
-- Function: process_emp_audit()
-- DROP FUNCTION process_emp_audit();
CREATE OR REPLACE FUNCTION process_emp_audit()
RETURNS trigger AS
$BODY$
BEGIN
--
-- Create a row in emp_audit to reflect the
-- operation performed on emp, make use of the
-- special variable TG_OP to work out the
-- operation.
--
IF (TG_OP = 'DELETE') THEN
INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*;
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*;
RETURN NEW;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION process_emp_audit() OWNER TO postgres;
GRANT EXECUTE ON FUNCTION process_emp_audit() TO postgres;
--------------------------------------函数---------------------------------------
-- Function: proc_check_max(character, character)
-- DROP FUNCTION proc_check_max(character, character);
CREATE OR REPLACE FUNCTION proc_check_max(v_tno character, v_cno character)
RETURNS integer AS
$BODY$
DECLARE
a_max integer;
a_cur integer;
BEGIN
LOCK TABLE 教师选课结果表 IN EXCLUSIVE MODE;
SELECT 人数上限 INTO a_max FROM 上课地点表;
SELECT 选课人数 INTO a_cur FROM 教师选课结果表
WHERE 教师号 IS NOT NULL and 选课号 IS NOT NULL ;
IF a_max < ( a_cur + 1 ) THEN
RETURN 0 ;
--RAISE EXCEPTION '超过最大人数限制,无法报名';
ELSE
RETURN 1 ;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION proc_check_max(character, character) OWNER TO postgres;
分享到:
相关推荐
"图书销售管理系统数据库SQL应用编程实验报告" 本实验报告旨在对图书销售管理系统数据库进行SQL应用编程实验,...* 本实验报告也掌握了基本的数据库后端编程能力,例如使用PL/pgSQL语言编写存储过程函数和触发器函数。
其支持复杂的查询、外键、触发器、视图和事务完整性等特性。正则表达式是处理字符串模式匹配的强大工具,PostgreSQL对正则表达式的处理能力允许用户在数据库层面对字符串进行复杂的搜索和修改。本篇总结将介绍...
在数据库领域,Oracle和PostgreSQL都是非常知名的开源关系型数据库管理...然而,全面的兼容性不仅限于函数层面,还需要考虑SQL语法、存储过程、触发器、索引、分区表等方面,这需要根据实际情况进行深入研究和规划。
在IT行业中,数据库是数据存储和管理的核心,而PostgreSQL是一种功能强大、开源的关系型数据库管理系统,被广泛应用于各种规模的应用程序。Java作为一款多平台的编程语言,提供了丰富的库和API来与数据库进行交互,...
PL/PGSQL 是一种块结构的语言,函数定义的所有文本都必须是一个块。在 PL/PGSQL 中,一个块用以下方法定义:[ <<label>> ][ DECLARE declarations ]BEGIN statements END; 块中的每个声明和每条语句都是用一个分号...
5. PL/pgSQL触发器和事件触发: - 触发器可以在数据库表的特定事件发生时自动执行函数。 - PostgreSQL支持基于行的触发器以及事件触发器,后者在特定的系统事件发生时触发。 - 通过触发器,可以实现数据变更的...
这些文档可能包括表格、视图、索引、约束、触发器、函数和存储过程的详细信息,帮助你理解数据库的设计和操作。 总结起来,从PostgreSQL数据库导出数据字典是一项关键的任务,它有助于数据库的维护、迁移、审计和...
- 过程语言是用来编写自定义函数的语言,如PL/pgSQL、PL/TCL等。 - **服务器编程接口** - 提供了低级别的API用于编写服务器端插件。 ### VI. 参考手册 - **SQL命令** - 详尽地列出了PostgreSQL支持的所有SQL...
- **对象管理**:通过直观的树状视图来管理数据库对象,包括表、索引、视图、触发器等。 - **数据编辑**:提供类似电子表格的数据编辑器,支持数据的添加、删除、复制和粘贴等多种操作,使得数据处理变得更加简单。 ...
可以被用来创建函数和触发器过程 对SQL语言增加控制结构 可以执行复杂计算 继承所有用户定义类型、函数和操作符 可以被定义为受服务器信任 便于使用 优点 客户端和服务器之间的额外往返通信被消除 客户端不需要的...
对于开发者来说,理解PostgreSQL的SQL语法、函数、触发器、存储过程等也是至关重要的。 总之,PostgreSQL 9.5免安装版为64位用户提供了一个便捷、高效的数据管理平台。无论你是初学者还是经验丰富的开发者,都可以...
TSQL是Microsoft SQL Server中用于编写存储过程、触发器和函数的编程语言。它基于标准的SQL,但添加了许多微软特有的功能和语法。相反,PL/PGSQL是PostgreSQL的内置过程语言,它允许用户编写复杂的逻辑和控制流程,...
2. **PostgreSQL**:同样开源且功能强大的数据库系统,支持ACID(原子性、一致性、隔离性、持久性)事务,提供了丰富的数据类型和高级SQL特性,如窗口函数和JSON支持,适合复杂的查询和分析。 **mysql2pgsql脚本** ...
1. 定义一个PL/pgSQL函数,该函数负责检查和创建子表,并将数据插入到正确的子表中。 2. 创建一个触发器,该触发器在主表上触发并在插入数据时调用上述函数。 3. 可选地,可以创建额外的触发器来处理其他业务逻辑,...
`OBJECT_ID()`函数用于返回指定对象的ID,这在与其他系统视图一起使用时非常有用。 接下来,我们关注存储过程的创建和修改时间。`sys.objects`和`sys.all_objects`系统视图提供了关于所有数据库对象的信息,包括...
在传统的PostgreSQL应用中,通常会使用SQL语句来定义数据库操作,如函数和触发器,这些操作通常在服务器端用PL/pgSQL编写。然而,通过postgres-deno,开发者可以利用TypeScript的强大特性,包括静态类型检查和现代化...
5. **触发器和存储过程**:允许自定义数据库行为,增强业务逻辑的实现。 6. **复制和分片**:支持主从复制和数据分片,提高系统的可用性和可扩展性。 **PHP访问PostgreSQL的最佳实践** 1. **连接管理**:使用连接...
同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类型、函数、操作符、聚集函数、索引方法、过程语言等。另外,因为许可证的灵活,任何人都可以以任何目的免费使用、修改和分发PostgreSQL。
2. **SQLPL/pgSQL支持**:`ddlx`扩展可能使用了SQLPL/pgSQL语言编写,这是一种在PostgreSQL中实现过程语言的方式,允许用户定义存储过程和函数。这使得`ddlx`函数可以直接在SQL查询中调用,无需额外的编程环境。 3....