root/trunk/sql/oracle/shortestPath.sql

Revision 18, 0.8 KB (checked in by yabuki, 3 years ago)
Line 
1CREATE OR REPLACE PROCEDURE shortestPath IS
2BEGIN
3  DECLARE
4    maxLength INT:=1;
5    oldSize INT;
6    newSize INT:=0;
7  BEGIN
8    INSERT INTO paths SELECT head AS startNode,tail AS endNode,1 FROM edges;
9   
10    LOOP
11      INSERT INTO paths
12        SELECT DISTINCT p.startNode AS startNode,tail AS endNode,maxLength+1 AS length
13        FROM paths p
14        JOIN edges ON p.endNode=head
15        WHERE p.length=maxLength
16          AND p.startNode!=tail
17          AND NOT EXISTS (
18            SELECT * FROM paths q
19            WHERE q.startNode=p.startNode AND q.endNode=tail);
20      maxLength:=maxLength+1;
21      oldSize:=newSize;
22      SELECT COUNT(*) INTO newSize FROM paths;
23      EXIT WHEN oldSize=newSize;
24    END LOOP;
25  END;
26END;
27/
28
29TRUNCATE TABLE paths; -- こうした方が速い
30
31CALL shortestPath();
Note: See TracBrowser for help on using the browser.