Hello amis DBA,

Pour mes tests j'ai créée une table avec un nom de colonne contenant des caractères spéciaux.
Problème : impossible de référencer la colonne.
Plus fort : les colonnes semblent être traitée différemment que les tables car une table avec le même nom peut être interrogée.

La création de la colonne avec des guillemets est OK.
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
SQL> CREATE TABLE test02 ("a$^ù*$" VARCHAR2(10));
Table created.
 
 
SQL> desc  test02
Name			Null?	Type
------------------------------------
a$^??*$					VARCHAR2(10)
 
 
SQL> SELECT * FROM test02;
a$^??*$
----------
TEST
 
 
SQL> SELECT COLUMN_NAME from dba_tab_cols where TABLE_NAME = 'TEST02' and owner = 'HR'; 
COLUMN_NAME
----------------------------------------------------------------------------------------------------
a$^??*$

Interrogation KO.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
SQL> select a$^??*$ from test02;
select a$^??*$ from test02
         *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected
 
 
SQL> select "a$^??*$" from test02;
select "a$^??*$" from test02
       *
ERROR at line 1:
ORA-00904: "a$^??*$": invalid identifier

En PL/SQL c'est pas mieux...
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
SQL> DECLARE
	v_col_name VARCHAR2(128);
	v_select VARCHAR2(128);
BEGIN
	SELECT COLUMN_NAME into v_col_name from dba_tab_cols where TABLE_NAME = 'TEST02' and owner = 'HR';
	v_select := 'SELECT "' || v_col_name || '" FROM test02';
	dbms_output.put_line(v_select);
	EXECUTE IMMEDIATE 'SELECT ' || v_col_name || ' FROM test02';
END;
/  
 
SELECT "a$^??*$" FROM test02
DECLARE
*
ERROR at line 1:
ORA-00923: FROM keyword not found where expected
ORA-06512: at line 8

En revanche, pour une table de même nom, pas de problème pour utiliser les guillemets.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
SQL> CREATE TABLE "a$^??*$" ( ID NUMBER);
Table created.
 
 
SQL> desc "a$^??*$"
Name						       Null?	Type
----------------------------------------------------- -------- ------------------------------------
ID								NUMBER
 
 
SQL> select * from "a$^??*$";
no rows selected

Une aide serait bienvenue