我的想法是,用户任意输入一个结点传递给@NODE,然后建立一张临时表,将以这个节点为父节点的所有结点都保存到临时表中,这样不断循环,知道查找结果为空时,将该层的深度@DEPTH返回。可是在运行中对@NODE报错,并且在命令中执行exec get_treedepth(@node)也没有返回结果,我是新手,请大家帮忙看看哪里有问题啊,在PL/SQL中运行的,ORACLE 10G。谢谢大家了create or replace procedure Get_TreeDepth(
@Node NUMBER(10) input,
@Depth OUT number(10))
as
begin
--建立临时表
set @sql_exec = create global temporary table NodeCal
(id number(10),
levelno number(10),
QTY number(10),
ParentID number(10)
) exec (@sql_exec)set @depth = select levelno from msot_nodetest where id = @Node--初始化
set @sql_initial = insert into NodeCal values(select * from msot_nodetest where id = @node)
exec (@sql_initial)--开始逐层遍历
while (exists(select * from msot_nodetest where parentID in (select id from NodeCal))) loop
set @sql_insert = insert into NodeCal values(select * from msot_nodetest where parentid in (select id from NodeCal))
exec (@sql_insert)
@Depth = @Depth + 1
end loop
DBMS_OUTPUT.PUT_LINE(@Depth-1)
@Node NUMBER(10) input,
@Depth OUT number(10))
as
begin
--建立临时表
set @sql_exec = create global temporary table NodeCal
(id number(10),
levelno number(10),
QTY number(10),
ParentID number(10)
) exec (@sql_exec)set @depth = select levelno from msot_nodetest where id = @Node--初始化
set @sql_initial = insert into NodeCal values(select * from msot_nodetest where id = @node)
exec (@sql_initial)--开始逐层遍历
while (exists(select * from msot_nodetest where parentID in (select id from NodeCal))) loop
set @sql_insert = insert into NodeCal values(select * from msot_nodetest where parentid in (select id from NodeCal))
exec (@sql_insert)
@Depth = @Depth + 1
end loop
DBMS_OUTPUT.PUT_LINE(@Depth-1)
解决方案 »
- 请教一个oracle的cursor的格式问题?
- oracle 自动保存 edit
- 高手请指教:oracle启动成功后 过几分钟自动 down
- 查询时怎么把oracle表中为空的字段也显示出来?
- 小弟寻找 吉林大学 的oracle 视频教程??? 非常感谢.....
- 在表中有很多重复的记录,我想计算出这些重复的记录的总数并赋值给 zs,然后显示时只显示重复记录的一条,以上功能在一句sql里怎么写?
- [简单问题]数据库用了一段时间,几十个G的磁盘全满了,怎么才能在保证数据库正常运行的情况下,清理出磁盘空间?
- 请问oracle8.1.6如何倒入倒出数据库?
- 当成功从令一台机器exp后,是否只要把dmp文件拿到自己的机器上导入,还是也要别的文件?
- 行级触发器 对本表进行查询 操作的方法
- ORACLE中的WHILE语句的判断条件处报错
- 匿名过程能不能有输入值
CREATE OR REPLACE PROCEDURE Get_TreeDepth(Node NUMBER(10) input,
Depth OUT NUMBER(10)) AS
sql_exec VARCHAR2(2000);
BEGIN
--建立临时表
exec IMMEDIATE 'drop table NodeCal';
sql_exec = 'create global temporary table NodeCal
(id number(10),
levelno number(10),
QTY number(10),
ParentID number(10)
) on commit '; exec IMMEDIATE sql_exec; SELECT levelno INTO depth FROM msot_nodetest WHERE id = Node; INSERT INTO NodeCal
SELECT * FROM msot_nodetest WHERE id = node; --开始逐层遍历
FOR c IN (SELECT *
FROM msot_nodetest
WHERE parentID IN (SELECT id FROM NodeCal)) LOOP
INSERT INTO NodeCal
SELECT *
FROM msot_nodetest
WHERE parentid IN (SELECT id FROM NodeCal);
Depth = Depth + 1;
END LOOP DBMS_OUTPUT.PUT_LINE(Depth - 1);
END;
Node NUMBER(10) input,
Depth OUT NUMBER(10)
这里到底是应该都写到数据类型前,还是后?--开始逐层遍历
FOR c IN (SELECT *
这里的C是我的那个判断条件吧?
(id number(10),
levelno number(10),
QTY number(10),
ParentID number(10)
) on commit ';
这里一直在报错,我把单引号去掉了,还是报错
PLS-00103:CHUXIAN FUHAO "="在需要下列之一时;
(id number(10),
levelno number(10),
QTY number(10),
ParentID number(10)
) on commit ';oracle 中赋值是这样的a:=1 的格式