Advertisement
Guest User

Untitled

a guest
Jun 28th, 2019
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. DROP TABLE coordinates;
  2. DROP FUNCTION near;
  3. DROP FUNCTION dist;
  4. DROP TYPE result;
  5. DROP TYPE res_record;
  6.  
  7. CREATE TABLE coordinates (
  8.     id NUMBER PRIMARY KEY,
  9.     latitude NUMBER,
  10.     longitude NUMBER
  11. );
  12.  
  13. BEGIN
  14.     FOR i IN 1..1000000 LOOP
  15.         INSERT INTO coordinates VALUES(i, (dbms_random.VALUE * 180) - 90, dbms_random.VALUE * 180);
  16.     END LOOP;
  17. END;
  18.  
  19. CREATE OR REPLACE FUNCTION dist(
  20.     x1 NUMBER, y1 NUMBER, z1 NUMBER,
  21.     x2 NUMBER, y2 NUMBER, z2 NUMBER
  22. )
  23. RETURN NUMBER
  24. IS
  25.     r1 NUMBER;
  26.     r2 NUMBER;
  27.     a NUMBER;
  28.     b NUMBER;
  29. BEGIN
  30.     r1 := SQRT(x1*x1+y1*y1+z1*z1);
  31.     r2 := SQRT(x2*x2+y2*y2+z2*z2);
  32.     a := ACOS((x1*x2+y1*y2+z1*z2)/r1/r2);
  33.     b := LN(r1/r2);
  34.     RETURN SQRT(a*a+b*b);
  35. END;
  36.  
  37. CREATE TYPE res_record IS object (
  38.     id NUMBER,
  39.     latitude NUMBER,
  40.     longitude NUMBER,
  41.     distance NUMBER
  42. );
  43.  
  44. CREATE TYPE result IS TABLE OF res_record;
  45.  
  46. CREATE OR REPLACE FUNCTION near(
  47.     lat NUMBER, lon NUMBER, n NUMBER
  48. )
  49. RETURN result IS
  50.     res result;
  51. BEGIN
  52.     SELECT res_record(id, latitude, longitude, distance) BULK COLLECT INTO res FROM (
  53.         SELECT  c.*,
  54.                 dist(
  55.                     6371*SIN(c.latitude)*COS(c.longitude),
  56.                     6371*SIN(c.latitude)*SIN(c.longitude),
  57.                     6371*COS(c.latitude),
  58.                     6371*SIN(lat)*COS(lon),
  59.                     6371*SIN(lat)*SIN(lon),
  60.                     6371*COS(lat)
  61.                 ) AS distance
  62.         FROM    coordinates c
  63.         ORDER BY distance)
  64.     WHERE ROWNUM <= n;
  65.     RETURN res;
  66. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement