`
huangro
  • 浏览: 337995 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

plpython写的一个存储过程函数

阅读更多
今天花了好久使用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;




分享到:
评论

相关推荐

    MySQL实验报告5(存储过程与函数)(1)(1).pdf

    - count_sch5: 该存储过程接收一个输出参数size,返回表sch中的总行数。使用了“select count(*) into size from sch”语句,将表sch中的行数赋值给size变量。 - count_sch2: 接收两个输出参数s_a和s_id,分别返回表...

    sqlserver 存储过程 函数 常用知识点

    - **RETURN**:结束存储过程或函数并返回一个值。 6. **事务管理**: - 使用`BEGIN TRANSACTION`, `COMMIT`和`ROLLBACK`来确保数据的一致性和完整性。 7. **视图(Views)**: 可以结合存储过程和函数一起使用...

    实验4存储过程和函数实验

    适合sqlserver数据库初学者,实验四存储过程和函数实验

    存储过程和函数

    数据库函数类似于存储过程,但主要目的是返回一个值。创建函数的基本语法如下: ```sql CREATE OR REPLACE FUNCTION 函数名称 (参数列表) RETURN 返回类型 AS BEGIN -- SQL语句或PL/SQL代码 RETURN 返回值; END; `...

    java调用oracle存储过程或者函数

    由于函数会返回一个值,所以格式通常是`{? = call function_name(?, ?, ...)}`。在执行后,通过`CallableStatement.getObject()`方法获取函数返回的结果。 四、异常处理 在调用过程中,可能会遇到SQL异常或其他运行...

    第11章MySQL存储过程与函数.docx

    4. 存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用。 创建存储过程的示例: CREATE PROCEDURE getnamebysno(in xh char(10), out name char(20)) BEGIN SELECT sname INTO ...

    Oracle存储过程、函数和包

    - **定义**:函数类似于存储过程,但它总是返回一个值。 - **语法**: ```sql CREATE [OR REPLACE] FUNCTION 函数名 (参数列表) RETURN 返回类型 IS BEGIN -- 函数体 RETURN 值; END; ``` #### 8. 包 - **...

    GBase 8S 自定义存储过程和函数.doc

    存储过程是GBase 8S中一个重要的特性,它们是一组预编译的SQL语句集合,能够执行特定任务,并作为独立的数据库对象存在。与普通的SQL查询相比,存储过程有以下几个显著优点: 1. **模块化编程**:存储过程类似高级...

    PLSQL程序设计-存储过程函数触发器

    除了存储过程和函数外,**触发器**也是PL/SQL中的一个重要概念。触发器是一种特殊类型的存储过程,它会在特定事件发生时自动执行,如插入、更新或删除表中的数据。触发器可以用来强制实施业务规则或进行数据审计。 ...

    Oracle存储过程和函数(最详细包含emp 表实例操作,边看边操作)

    函数与存储过程相似,但函数必须返回一个值,而存储过程可以不返回。函数可以被用作查询的一部分,提升SQL语句的灵活性。 1. **创建函数**:使用`CREATE FUNCTION`语句定义函数,例如: ```sql CREATE OR REPLACE...

    Mysql存储过程和函数

    下面通过一个具体的例子来展示如何创建和使用存储过程。 1. **创建表**: ```sql CREATE TABLE xiaozhe ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(10) ); INSERT INTO xiaozhe(name) VALUES ('...

    oracle函数调用存储过程

    **函数**则是一种特殊的存储过程,它也包含PL/SQL代码,但与存储过程不同的是,函数必须返回一个值。这个值可以被其他SQL语句或PL/SQL代码所引用。 #### 案例分析 假设我们有一个存储过程`plan_station_contrast`...

    MySQL数据库函数,触发器,存储过程

    触发器是数据库中的一个特殊类型的存储过程,它在特定的数据库操作(如INSERT、UPDATE、DELETE)之前或之后自动执行。触发器可以用于实现复杂的业务逻辑,如数据验证、审计日志记录或保持数据库的一致性。 例如,...

    存储过程与函数的区别

    相比之下,函数(Function)更像是一个计算单元,它接收输入参数并返回一个单一的值。函数必须有返回值,而且这个返回值的类型在函数定义时就已经确定。函数通常用于进行特定的计算或数据转换,其结果可以直接在查询...

    存储过程 函数

    编写存储过程和函数通常涉及SQL语法,例如在MySQL中,我们可以这样创建一个简单的存储过程: ```sql CREATE PROCEDURE `myProcedure`(IN param1 INT, OUT param2 VARCHAR(50)) BEGIN SELECT 'Hello, ' AS `msg`, ...

    sqlserver存储过程函数加解密保好用工具dbForge SQL Decryptor v3.1.24

    而函数则是一类特殊的存储过程,它主要用来返回一个值。在SQL Server中,函数同样可以包含逻辑处理,但其设计目的是为了返回单个值或表。 存储过程和函数在数据库设计中扮演着重要的角色,但它们也存在被恶意用户...

    易飞系统触发器储存过程函数视图

    这些是平时个人兴趣爱好收集到的易飞ERP系统触发器/函数/储存过程/视图集。适合人群:系统管理员,运维专员或鼎捷顾问等

    SQL Server创建存储过程、触发器、函数等(学习札记)

    SQL的存储过程、触发器等建立视图存储过程触发器函数(自定义函数)索引 视图  视图是从一个或几个基本表(或视图)导出的表。不同的是,它是一虚表,数据库中只存放视图的定义,而不存放视图对应的数据,这些数据...

    mysql存储过程之返回多个值的方法示例

    mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的结构: mysql&gt; desc orders; +----------------+-------------+------+-----+--------...

    oracle中的存储过程.函数,包

    创建一个简单的存储过程如下: ```sql CREATE OR REPLACE PROCEDURE my_procedure (p_no NUMBER) IS BEGIN -- 执行语句 END; ``` 其中`CREATE OR REPLACE`表示如果已经存在同名的存储过程,则替换掉原有的存储...

Global site tag (gtag.js) - Google Analytics