Re: Linked List

Поиск
Список
Период
Сортировка
От Gregory S. Williamson
Тема Re: Linked List
Дата
Msg-id 71E37EF6B7DCC1499CEA0316A2568328024BC3D4@loki.wc.globexplorer.net
обсуждение исходный текст
Ответ на Linked List  ("Ray Madigan" <ray@madigans.org>)
Ответы Re: Linked List  ("Ben K." <bkim@coe.tamu.edu>)
Список pgsql-sql
Ben,

The pgsql function is compiled and wouldn't know how to handle a table name as a variable.

If you rewrite the SQL to use the 'EXECUTE' statement I think you could do this, something along the lines of
(untested):

EXECUTE ''INSERT INTO '' || quote_ident(tmplist) || '' (SELECT * FROM links WHERE p=x)'';

HTH,

Greg Williamson
DBA
GlobeXplorer LLC


-----Original Message-----
From:    pgsql-sql-owner@postgresql.org on behalf of Ben K.
Sent:    Sun 4/30/2006 6:29 PM
To:    Ray Madigan
Cc:    Pgsql-Sql-Owner; Marc G. Fournier; pgsql-sql@postgresql.org
Subject:    Re: [SQL]Linked List

> I have a table that I created that implements a linked list.  I am not an
> expert SQL developer and was wondering if there are known ways to traverse
> the linked lists.  The table contains many linked lists based upon the head
> of the list and I need to extract all of the nodes that make up a list.  The
> lists are simple with a item and a link to the history item so it goes kind
> of like:
>
> 1, 0
> 3, 1
> 7, 3
> 9, 7
> ...

I missed "The table contains many linked lists", so wanted to do another
try. I guess there should be a better way, but what if you do this?

1)

Assuming your table has two columns (n int, p int), do

create table tmplist (n int, p int);

2)

drop function traverse(integer);
create or replace function traverse (integer)
returns integer as
$$  declare    x int;  begin    x := $1;    while x is not null loop      select n into x from linkedlist where p = x;
   insert into tmplist (select * from links where p=x); 
-- or do any processing    end loop;    return 1 ;  end;
$$
language plpgsql;

3)

select traverse(0);
select * from tmplist;
0 - 1 - 4 - 8 - 12 ...


delete from tmplist;
select traverse(2);
select * from tmplist;
2 - 3 - 5 - 6 - ...

(where 0 or 2 is the heads of the linked lists in the table, which you
want to traverse)

I'd appreciate any insight if there's a better way but somehow it was not
possible to return setof int from within while loop whereas it was
possible from within a for loop. I didn't find a way to deliver the
templist table name as argument. (Somehow there seemed to be a bug(?)
there)



Regards,

Ben K.
Developer
http://benix.tamu.edu

---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?
              http://www.postgresql.org/docs/faq

!DSPAM:445564c2225761179214242!






В списке pgsql-sql по дате отправления:

Предыдущее
От: "Ben K."
Дата:
Сообщение: Re: Linked List
Следующее
От: "Ben K."
Дата:
Сообщение: Re: Linked List