在H2数据库的嵌套集中创建存储过程添加节点

Posted

技术标签:

【中文标题】在H2数据库的嵌套集中创建存储过程添加节点【英文标题】:create stored procedure adding node in nested set in H2 database 【发布时间】:2010-06-23 15:07:35 【问题描述】:

我有一个用于为嵌套集添加节点的 sql,这是我的 sql SELECT @myRight := rgt FROM nested_category WHERE name = 'TELEVISIONS';

更新nested_category SET rgt = rgt + 2 WHERE rgt > @myRight; 更新nested_category SET lft = lft + 2 WHERE lft > @myRight;

INSERT INTO nested_category(name, lft, rgt) VALUES('GAME CONSOLES', @myRight + 1, @myRight + 2);

通常我可以把它放在存储过程中,但是在 H2 中不支持创建过程,似乎解决方案是使用带有创建别名的 java 函数。谁能帮帮我。

【问题讨论】:

【参考方案1】:

抱歉回复晚了。问题是,你没有添加h2 标签,所以这个问题没有出现在我的列表中。

drop table nested_category;
drop alias cat_add;
create table nested_category(id identity, lft int, rgt int, name varchar);
create alias cat_add as $$
void catAdd(Connection conn, String name, String after) throws SQLException 
  Statement stat = conn.createStatement();
  stat.execute("SET @myRight 0");
  PreparedStatement prep = conn.prepareStatement(
    "SELECT @myRight := rgt FROM nested_category WHERE name = ?");
  prep.setString(1, after);
  prep.execute();
  stat.execute("UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight");
  stat.execute("UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight");
  prep = conn.prepareStatement(
    "INSERT INTO nested_category(name, lft, rgt) VALUES(?, @myRight + 1, @myRight + 2)");
  prep.setString(1, name);
  prep.execute();

$$;
call cat_add('television', null);
call cat_add('game consoles', 'television');
select * from nested_category;

【讨论】:

一个像这样使用 Connection 的好例子在文档的 H2“功能”部分非常有帮助。它确实为我节省了很多时间......

以上是关于在H2数据库的嵌套集中创建存储过程添加节点的主要内容,如果未能解决你的问题,请参考以下文章

redis集群扩容(添加新节点)

DOM / jQuery创建节点及节点属性

在嵌套集中重复节点名称

如何使用多个嵌套的私有节点模块?

链表的创建以及链表节点的添加和删除

DocumentFragment(创建文档碎片节点)