Bonjour,

Bon je débute pas mal avec pgsql. Il faut bien un début.

J'ai donc créé mes premières fonctions.

voilà le script sql que je teste pour l'instant*

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
 
DROP LANGUAGE IF EXISTS plpgsql CASCADE;
 
CREATE LANGUAGE plpgsql;
 
 
 
------------------------
-- CREATION DES TYPES --
------------------------
DROP TYPE IF EXISTS enum_admingrp CASCADE;
 
CREATE TYPE enum_admingrp AS ENUM ('groupe 1', 'groupe 2');
 
 
 
-------------------------
-- CREATION DES TABLES --
-------------------------
 
DROP TABLE IF EXISTS ADMINISTRATION CASCADE;
 
CREATE TABLE ADMINISTRATION (
	id		serial,
	nom		varchar(64)	NOT NULL UNIQUE CHECK (nom SIMILAR TO '[a-zA-Z -]+' = true),
	adr_postal	varchar(64)	NOT NULL	CHECK (adr_postal SIMILAR TO '([a-zA-Z0-9 ,.-])+' = true),
	cd_postal	numeric(5)	NOT NULL,	CHECK (cd_postal > 1000),
	commune		varchar(32)	NOT NULL,	CHECK (commune SIMILAR TO '[a-zA-Z -]+' = true),
	num_tel		char(10)	NOT NULL,	CHECK (num_tel SIMILAR TO '[[:digit:]]+' = true),
	groupe		enum_admingrp,
 
	CONSTRAINT "administration_pkey" PRIMARY KEY (id)
);
 
----------------------------
-- CREATION DES FONCTIONS --
----------------------------
 
DROP FUNCTION IF EXISTS creer_administration();
 
CREATE FUNCTION creer_administration(_nom varchar, _adr_postal varchar, _cd_postal numeric, _commune varchar, _num_tel char, _groupe enum_admingrp) RETURNS boolean AS
$$
	BEGIN
		INSERT INTO ADMINISTRATION (nom, adr_postal, cd_postal, commune, num_tel, groupe) VALUES (upper(_nom), _adr_postal, _cd_postal, upper(_commune), _num_tel, _groupe);
 
		RAISE NOTICE 'ADMINISTRATION CRÉÉE :%', _nom;
 
		RETURN true;
 
		EXCEPTION
			WHEN check_violation THEN
 
				RAISE NOTICE 'ADMINISTRATION NON CRÉÉE :% (check_violation) ', _nom;
 
				RETURN false;
 
			WHEN not_null_violation  THEN
 
				RAISE NOTICE 'ADMINISTRATION NON CRÉÉE :% (not_null_violation) ', _nom;
 
				RETURN false;
 
			WHEN unique_violation THEN
 
				RAISE NOTICE 'ADMINISTRATION NON CRÉÉE :% (unique_violation) ', _nom;
 
				RETURN false;
	END;
$$
LANGUAGE plpgsql;
 
DROP FUNCTION IF EXISTS creer_organisme();
 
CREATE FUNCTION creer_organisme(_nom varchar, _adr_postal varchar, _cd_postal numeric, _commune varchar, _num_tel char) RETURNS boolean AS
$$
	DECLARE
 
		retour boolean;
 
	BEGIN
		SELECT creer_administration(_nom, _adr_postal, _cd_postal, _commune, _num_tel, 'groupe 1') INTO retour;
 
		RETURN retour;
	END;
$$
LANGUAGE plpgsql;
 
 
 
-----------------------
-- CREATION DES VUES --
-----------------------
 
CREATE VIEW GROUPE1 AS SELECT * FROM ADMINISTRATION WHERE groupe = 'groupe 1';
 
CREATE VIEW GROUPE2 AS SELECT * FROM ADMINISTRATION WHERE groupe = 'groupe 2';
 
 
 
---------------------------
-- INSERTION DES DONNÉES --
---------------------------
 
SELECT creer_administration('organisme un', '9, rue de l eglise', 75000, 'PARIS', '0000000000', 'groupe 1');
 
SELECT creer_organisme('organisme 2', '10, rue de l  eglise', 75000, 'PARIS', '0000000000');
 
SELECT creer_organisme('organisme trois', '9, rue de l''église', 75000, 'PARIS', '0000000000');
 
SELECT creer_organisme('organisme quatre', '9, rue de l eglise', 75000, 'PARIS', '0000000000');
 
SELECT * FROM ADMINISTRATION;
le premier (soucis) c'est que même si je lève des exceptions des id sont créer. Je pensais que en levant des exceptions l'INSERT ne se ferait pas et donc que l'id ne serait pas créé.

Les niveaux possibles sont DEBUG, LOG, INFO, NOTICE, WARNING et EXCEPTION. EXCEPTION lève une erreur (ce qui annule habituellement la transaction en cours)
(sortie de la doc de pgsql 8.3)

Est-ce normale ou y a-t-il un moyen que l'id ne soit pas créer?

Autre question (qui je sais sort un peu du contexte de la question : le CHECK de l'attribut adr_postal ne me permet pas d'avoir des accent 'é' par exemple et je ne permet pas non plus le caractère ' ce qui n'est pas très pratique pour une adresse postale.

j'ai bien essayer de doubler l'entre cote '' ou de mettre des antislash mais rien n'y fait.

Si quelqu'un à la petite astuce pour ça je suis prenneur

Et pour un débutant, je dois avouer que je n'utiliserai plus un SGBD de la même façon à présent.