今天花了好久使用plpython写了一个存储过程函数,终于解决了问题,庆祝一下,哈哈。下面把代码贴上来,可供参考:
-- Function: bazaar_denim_nav(text)
DROP FUNCTION bazaar_denim_nav(text);
CREATE OR REPLACE FUNCTION bazaar_denim_nav(text)
RETURNS text AS
$BODY$
import cPickle as pickle
# Unpack args
filters = [f.strip() for f in args[0].split(',')]
filters = [f for f in filters if f]
filters.append('designerdenimnav')
# Work out some SQL to extract all products that match a set of filters.
if filters:
# Find complete list of categories we should be using.
inClause = ','.join(['$'+str(i+1) for i in range(len(filters))])
qNodes = plpy.prepare(
"""select lft_node, rgt_node from hierarchy where object in
(select id from category where alphanum in (%s))""" % inClause,
['text']*len(filters)
)
nodes = list(plpy.execute(qNodes, filters))
# Build query
parts = []
for node in nodes:
parts.append(
"""select distinct i.id from item i
join item_category ic on ic.item_id=i.id
join category c on c.id=ic.category_id
where ic.category_id in (select object from hierarchy
where lft_node >= %s and rgt_node <= %s)""" % (node['lft_node'], node['rgt_node'])
)
filterSql = ' intersect '.join(parts)
filterSql = ' '.join(filterSql.split())
# Prepare most of the plans
if filters:
if len(filterSql) > 0:
qItems = plpy.prepare("select i.id from item i inner join stock_level sl on i.id=sl.item_id where sl.in_stock>0 and i.id in (%s) order by i.id"%filterSql)
else:
# Nothing matches the criteria so return now
return pickle.dumps([])
else:
qItems = plpy.prepare("select i.id from item i inner join stock_level sl on i.id=sl.item_id where sl.in_stock>0 order by i.id")
# get item lists
items = list(plpy.execute(qItems))
itemids = [item['id'] for item in items]
strItemIds = ', '.join([str(id) for id in itemids])
# define get sub categories function which filter by the in_stock
def getChildren(alphanum, strItemIds):
if strItemIds:
qChildren = plpy.prepare("""select distinct c.name, c.alphanum from category c inner join item_category ic on c.id=ic.category_id
where c.id in (select object from hierarchy where
parent=(select h.id from hierarchy h inner join category ca on ca.id=h.object where ca.alphanum='%s'))
and ic.item_id in (%s)"""%(alphanum, strItemIds))
children = list(plpy.execute(qChildren))
else:
children = []
return children
# Classification list
classification = {}
classification['brand'] = []
classification['type'] = []
classification['brand'] = getChildren('brand', strItemIds)
top_types = getChildren('designerdenimnav', strItemIds)
for temp in top_types:
t_alphanum = temp['alphanum'][1:]
t_name = temp['name'][1:]
t_children = getChildren(t_alphanum, strItemIds)
classification['type'].append({'name':t_name, 'alphanum':t_alphanum, 'children': t_children})
return pickle.dumps(classification)
$BODY$
LANGUAGE 'plpythonu' VOLATILE
COST 100;
ALTER FUNCTION bazaar_denim_nav(text) OWNER TO postgres;
分享到:
相关推荐
- **RETURN**:结束存储过程或函数并返回一个值。 6. **事务管理**: - 使用`BEGIN TRANSACTION`, `COMMIT`和`ROLLBACK`来确保数据的一致性和完整性。 7. **视图(Views)**: 可以结合存储过程和函数一起使用...
适合sqlserver数据库初学者,实验四存储过程和函数实验
数据库函数类似于存储过程,但主要目的是返回一个值。创建函数的基本语法如下: ```sql CREATE OR REPLACE FUNCTION 函数名称 (参数列表) RETURN 返回类型 AS BEGIN -- SQL语句或PL/SQL代码 RETURN 返回值; END; `...
由于函数会返回一个值,所以格式通常是`{? = call function_name(?, ?, ...)}`。在执行后,通过`CallableStatement.getObject()`方法获取函数返回的结果。 四、异常处理 在调用过程中,可能会遇到SQL异常或其他运行...
3. **无返回值**:与函数不同,存储过程不直接返回一个具体的值,而是通过输出参数或直接修改数据库状态来实现其功能。 4. **支持多条SQL语句**:存储过程中可以包含多条SQL语句,这些语句可以是查询、更新或其他...
存储函数与存储过程类似,但主要区别在于存储函数必须返回一个值。函数可以被用作表达式的一部分。 #### 创建存储函数 创建存储函数的基本语法如下: ```sql CREATE [OR REPLACE] FUNCTION 函数名 (参数列表) ...
存储过程是GBase 8S中一个重要的特性,它们是一组预编译的SQL语句集合,能够执行特定任务,并作为独立的数据库对象存在。与普通的SQL查询相比,存储过程有以下几个显著优点: 1. **模块化编程**:存储过程类似高级...
除了存储过程和函数外,**触发器**也是PL/SQL中的一个重要概念。触发器是一种特殊类型的存储过程,它会在特定事件发生时自动执行,如插入、更新或删除表中的数据。触发器可以用来强制实施业务规则或进行数据审计。 ...
下面通过一个具体的例子来展示如何创建和使用存储过程。 1. **创建表**: ```sql CREATE TABLE xiaozhe ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(10) ); INSERT INTO xiaozhe(name) VALUES ('...
**函数**则是一种特殊的存储过程,它也包含PL/SQL代码,但与存储过程不同的是,函数必须返回一个值。这个值可以被其他SQL语句或PL/SQL代码所引用。 #### 案例分析 假设我们有一个存储过程`plan_station_contrast`...
相比之下,函数(Function)更像是一个计算单元,它接收输入参数并返回一个单一的值。函数必须有返回值,而且这个返回值的类型在函数定义时就已经确定。函数通常用于进行特定的计算或数据转换,其结果可以直接在查询...
如果需要删除一个存储过程,使用`DROP PROCEDURE`语句,而重新编译则需要`ALTER PROCEDURE COMPILE`。 **存储函数** 与存储过程类似,但函数必须有返回值,并且其返回类型在定义时指定。函数通常用于执行计算或返回...
下面展示一个简单的存储过程示例,该过程接受一个部门编号作为输入参数,并返回该部门的所有员工信息: ```sql CREATE OR REPLACE PROCEDURE GetEmpByDept(deptno IN NUMBER) IS BEGIN FOR emp_rec IN (SELECT * ...
在PLSQL Developer中,用户可以使用CREATE PROCEDURE语句来创建一个存储过程。例如,以下是一个简单的存储过程,用于显示雇员信息: ```sql CREATE OR REPLACE PROCEDURE EMP_LIST AS BEGIN FOR cur IN (SELECT * ...
mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的结构: mysql> desc orders; +----------------+-------------+------+-----+--------...
7. **视图**:视图是数据库中的虚拟表,由一个或多个表的查询结果组成。视图提供了抽象层,可以简化复杂的查询,保护数据,以及为用户提供定制的视图。 8. **控制用户权限**:Oracle提供了精细的权限管理系统,如...
oracle笔记存储函数和存储过程,有具体的代码案例!存储函数和存储过程的知识笔记!
示例中创建了一个名为`preader`的存储过程,用于向读者信息表`reader`中添加记录。该存储过程接收五个参数,分别为读者ID、姓名、性别、注册日期、可借阅数量以及状态。存储过程首先检查该读者是否已经存在于表中,...
在SQL Server中,扩展存储过程(Extended Stored Procedures)是一种增强数据库功能的方法,它允许开发者创建自己的函数、存储过程和数据类型,这些功能是通过Windows动态链接库(DLL)实现的。编写安全的SQL Server...