Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 6.53 KB | None | 0 0
  1. -- Function: addgeometrycolumn(character varying, character varying, character varying, character varying, integer, character varying, integer)
  2.  
  3. -- DROP FUNCTION addgeometrycolumn(character varying, character varying, character varying, character varying, integer, character varying, integer);
  4.  
  5. CREATE OR REPLACE FUNCTION addgeometrycolumn(CHARACTER VARYING, CHARACTER VARYING, CHARACTER VARYING, CHARACTER VARYING, INTEGER, CHARACTER VARYING, INTEGER)
  6.   RETURNS text AS
  7. $BODY$
  8. DECLARE
  9.     catalog_name alias FOR $1;
  10.     schema_name alias FOR $2;
  11.     TABLE_NAME alias FOR $3;
  12.     column_name alias FOR $4;
  13.     new_srid alias FOR $5;
  14.     new_type alias FOR $6;
  15.     new_dim alias FOR $7;
  16.     rec RECORD;
  17.     sr VARCHAR;
  18.     real_schema name;
  19.     SQL text;
  20.  
  21. BEGIN
  22.  
  23.     -- Verify geometry type
  24.     IF ( NOT ( (new_type = 'GEOMETRY') OR
  25.                (new_type = 'GEOMETRYCOLLECTION') OR
  26.                (new_type = 'POINT') OR
  27.                (new_type = 'MULTIPOINT') OR
  28.                (new_type = 'POLYGON') OR
  29.                (new_type = 'MULTIPOLYGON') OR
  30.                (new_type = 'LINESTRING') OR
  31.                (new_type = 'MULTILINESTRING') OR
  32.                (new_type = 'GEOMETRYCOLLECTIONM') OR
  33.                (new_type = 'POINTM') OR
  34.                (new_type = 'MULTIPOINTM') OR
  35.                (new_type = 'POLYGONM') OR
  36.                (new_type = 'MULTIPOLYGONM') OR
  37.                (new_type = 'LINESTRINGM') OR
  38.                (new_type = 'MULTILINESTRINGM') OR
  39.                (new_type = 'CIRCULARSTRING') OR
  40.                (new_type = 'CIRCULARSTRINGM') OR
  41.                (new_type = 'COMPOUNDCURVE') OR
  42.                (new_type = 'COMPOUNDCURVEM') OR
  43.                (new_type = 'CURVEPOLYGON') OR
  44.                (new_type = 'CURVEPOLYGONM') OR
  45.                (new_type = 'MULTICURVE') OR
  46.                (new_type = 'MULTICURVEM') OR
  47.                (new_type = 'MULTISURFACE') OR
  48.                (new_type = 'MULTISURFACEM')) )
  49.     THEN
  50.         RAISE EXCEPTION 'Invalid type name - valid ones are:
  51.     POINT, MULTIPOINT,
  52.     LINESTRING, MULTILINESTRING,
  53.     POLYGON, MULTIPOLYGON,
  54.     CIRCULARSTRING, COMPOUNDCURVE, MULTICURVE,
  55.     CURVEPOLYGON, MULTISURFACE,
  56.     GEOMETRY, GEOMETRYCOLLECTION,
  57.     POINTM, MULTIPOINTM,
  58.     LINESTRINGM, MULTILINESTRINGM,
  59.     POLYGONM, MULTIPOLYGONM,
  60.     CIRCULARSTRINGM, COMPOUNDCURVEM, MULTICURVEM
  61.     CURVEPOLYGONM, MULTISURFACEM,
  62.     or GEOMETRYCOLLECTIONM';
  63.         RETURN 'fail';
  64.     END IF;
  65.  
  66.  
  67.     -- Verify dimension
  68.     IF ( (new_dim >4) OR (new_dim <0) ) THEN
  69.         RAISE EXCEPTION 'invalid dimension';
  70.         RETURN 'fail';
  71.     END IF;
  72.  
  73.     IF ( (new_type LIKE '%M') AND (new_dim!=3) ) THEN
  74.         RAISE EXCEPTION 'TypeM needs 3 dimensions';
  75.         RETURN 'fail';
  76.     END IF;
  77.  
  78.  
  79.     -- Verify SRID
  80.     IF ( new_srid != -1 ) THEN
  81.         SELECT SRID INTO sr FROM spatial_ref_sys WHERE SRID = new_srid;
  82.         IF NOT FOUND THEN
  83.             RAISE EXCEPTION 'AddGeometryColumns() - invalid SRID';
  84.             RETURN 'fail';
  85.         END IF;
  86.     END IF;
  87.  
  88.  
  89.     -- Verify schema
  90.     IF ( schema_name IS NOT NULL AND schema_name != '' ) THEN
  91.         SQL := 'SELECT nspname FROM pg_namespace ' ||
  92.             'WHERE text(nspname) = ' || quote_literal(schema_name) ||
  93.             'LIMIT 1';
  94.         RAISE DEBUG '%', SQL;
  95.         EXECUTE SQL INTO real_schema;
  96.  
  97.         IF ( real_schema IS NULL ) THEN
  98.             RAISE EXCEPTION 'Schema % is not a valid schemaname', quote_literal(schema_name);
  99.             RETURN 'fail';
  100.         END IF;
  101.     END IF;
  102.  
  103.     IF ( real_schema IS NULL ) THEN
  104.         RAISE DEBUG 'Detecting schema';
  105.         SQL := 'SELECT n.nspname AS schemaname ' ||
  106.             'FROM pg_catalog.pg_class c ' ||
  107.               'JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace ' ||
  108.             'WHERE c.relkind = ' || quote_literal('r') ||
  109.             ' AND n.nspname NOT IN (' || quote_literal('pg_catalog') || ', ' || quote_literal('pg_toast') || ')' ||
  110.             ' AND pg_catalog.pg_table_is_visible(c.oid)' ||
  111.             ' AND c.relname = ' || quote_literal(TABLE_NAME);
  112.         RAISE DEBUG '%', SQL;
  113.         EXECUTE SQL INTO real_schema;
  114.  
  115.         IF ( real_schema IS NULL ) THEN
  116.             RAISE EXCEPTION 'Table % does not occur in the search_path', quote_literal(TABLE_NAME);
  117.             RETURN 'fail';
  118.         END IF;
  119.     END IF;
  120.    
  121.  
  122.     -- Add geometry column to table
  123.     SQL := 'ALTER TABLE ' ||
  124.         quote_ident(real_schema) || '.' || quote_ident(TABLE_NAME)
  125.         || ' ADD COLUMN ' || quote_ident(column_name) ||
  126.         ' geometry ';
  127.     RAISE DEBUG '%', SQL;
  128.     EXECUTE SQL;
  129.  
  130.  
  131.     -- Delete stale record in geometry_columns (if any)
  132.     SQL := 'DELETE FROM geometry_columns WHERE
  133.         f_table_catalog = ' || quote_literal('') ||
  134.         ' AND f_table_schema = ' ||
  135.         quote_literal(real_schema) ||
  136.         ' AND f_table_name = ' || quote_literal(TABLE_NAME) ||
  137.         ' AND f_geometry_column = ' || quote_literal(column_name);
  138.     RAISE DEBUG '%', SQL;
  139.     EXECUTE SQL;
  140.  
  141.  
  142.     -- Add record in geometry_columns
  143.     SQL := 'INSERT INTO geometry_columns (f_table_catalog,f_table_schema,f_table_name,' ||
  144.                                           'f_geometry_column,coord_dimension,srid,type)' ||
  145.         ' VALUES (' ||
  146.         quote_literal('') || ',' ||
  147.         quote_literal(real_schema) || ',' ||
  148.         quote_literal(TABLE_NAME) || ',' ||
  149.         quote_literal(column_name) || ',' ||
  150.         new_dim::text || ',' ||
  151.         new_srid::text || ',' ||
  152.         quote_literal(new_type) || ')';
  153.     RAISE DEBUG '%', SQL;
  154.     EXECUTE SQL;
  155.  
  156.  
  157.     -- Add table CHECKs
  158.     SQL := 'ALTER TABLE ' ||
  159.         quote_ident(real_schema) || '.' || quote_ident(TABLE_NAME)
  160.         || ' ADD CONSTRAINT '
  161.         || quote_ident('enforce_srid_' || column_name)
  162.         || ' CHECK (ST_SRID(' || quote_ident(column_name) ||
  163.         ') = ' || new_srid::text || ')' ;
  164.     RAISE DEBUG '%', SQL;
  165.     EXECUTE SQL;
  166.  
  167.     SQL := 'ALTER TABLE ' ||
  168.         quote_ident(real_schema) || '.' || quote_ident(TABLE_NAME)
  169.         || ' ADD CONSTRAINT '
  170.         || quote_ident('enforce_dims_' || column_name)
  171.         || ' CHECK (ST_NDims(' || quote_ident(column_name) ||
  172.         ') = ' || new_dim::text || ')' ;
  173.     RAISE DEBUG '%', SQL;
  174.     EXECUTE SQL;
  175.  
  176.     IF ( NOT (new_type = 'GEOMETRY')) THEN
  177.         SQL := 'ALTER TABLE ' ||
  178.             quote_ident(real_schema) || '.' || quote_ident(TABLE_NAME) || ' ADD CONSTRAINT ' ||
  179.             quote_ident('enforce_geotype_' || column_name) ||
  180.             ' CHECK (GeometryType(' ||
  181.             quote_ident(column_name) || ')=' ||
  182.             quote_literal(new_type) || ' OR (' ||
  183.             quote_ident(column_name) || ') is null)';
  184.         RAISE DEBUG '%', SQL;
  185.         EXECUTE SQL;
  186.     END IF;
  187.  
  188.     RETURN
  189.         real_schema || '.' ||
  190.         TABLE_NAME || '.' || column_name ||
  191.         ' SRID:' || new_srid::text ||
  192.         ' TYPE:' || new_type ||
  193.         ' DIMS:' || new_dim::text || ' ';
  194. END;
  195. $BODY$
  196.   LANGUAGE 'plpgsql' VOLATILE STRICT
  197.   COST 100;
  198. ALTER FUNCTION addgeometrycolumn(CHARACTER VARYING, CHARACTER VARYING, CHARACTER VARYING, CHARACTER VARYING, INTEGER, CHARACTER VARYING, INTEGER) OWNER TO "raschia-g";
  199. COMMENT ON FUNCTION addgeometrycolumn(CHARACTER VARYING, CHARACTER VARYING, CHARACTER VARYING, CHARACTER VARYING, INTEGER, CHARACTER VARYING, INTEGER) IS 'args: catalog_name, schema_name, table_name, column_name, srid, type, dimension - Adds a geometry column to an existing table of attributes.';
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement