Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/01/2008, 11h44   #1
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 182
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 182
Points : 39
Points : 39
Par défaut ORA-01036: illegal variable name/number

Bonjour

J'ai une application qui utilise une base de données ORACLE en passant par des driver ODBC. Pour les cles primaires j'utilise les sequence. Jusque la tout va bien.

J'ai besoin de pouvoir inserer des données dont je connais deja la valeur de la cles primaire, donc il faut que je mette a jour la valeur de la clef primaire. Pour ca un drop suivi d'un create de la sequence, ca marche... mais pas tout le temps:

quand je veux remettre ma base de donnée a 0, je fais un drop sur toutes mes tables, puis un drop et un create sur toutes les sequences :
Code :
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
 
begin_transaction();
 
auto_ptr<odbc::PreparedStatement> remoteFolderStm(con->prepareStatement("DELETE FROM RemoteFolder"));
auto_ptr<odbc::PreparedStatement> channelFolderStm(con->prepareStatement("DELETE FROM ChannelFolder"));
[...]		
remoteFolderStm->executeUpdate();
channelFolderStm->executeUpdate();
[...]
remoteFolderStm->close();
channelFolderStm->close();
[...]
auto_ptr<odbc::PreparedStatement> remoteFolderDropSecStm(con->prepareStatement("DROP sequence sq_RemoteFolder_idRemoteFolder"));
auto_ptr<odbc::PreparedStatement> channelFolderDropSecStm(con->prepareStatement("DROP sequence sq_ChannelFolder_idChannelFold"));
[...]
remoteFolderDropSecStm->executeUpdate();
channelFolderDropSecStm->executeUpdate();
[...]
remoteFolderDropSecStm->close();
channelFolderDropSecStm->close();
[...]
auto_ptr<odbc::PreparedStatement> remoteFolderCreaSecStm(con->prepareStatement("CREATE sequence sq_RemoteFolder_idRemoteFolder start WITH 1 increment BY 1"));
auto_ptr<odbc::PreparedStatement> channelFolderCreaSecStm(con->prepareStatement("CREATE sequence sq_ChannelFolder_idChannelFold start WITH 3 increment BY 1"));
[...]
remoteFolderCreaSecStm->executeUpdate();
channelFolderCreaSecStm->executeUpdate();
[...]
remoteFolderCreaSecStm->close();
channelFolderCreaSecStm->close();
 
commit_transaction();
Ca ca marche très bien.

Mais que je veux ajouter des elements, je fais ca :
Code :
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
 
int DataSource_ODBC_ORACLE::add_Remote_Folders(DATA &IN)
{
    SOM_TRACE(ACE_TEXT("DataSource_ODBC_ORACLE::add_Remote_Folders()"));
    ACE_READ_GUARD_RETURN(DBMUTEX, guard, mutex_, -1);
 
    int id, nmb;
    UnicodeString name, path;
 
	IN >> nmb;
 
    try{
 
        begin_transaction();
 
    	auto_ptr<odbc::PreparedStatement> stmt(con->prepareStatement(("INSERT INTO RemoteFolder (idRemoteFolder, name, path) VALUES (?, ?, ?)")));
        FOR (int i = 0; i < nmb; i++) {
 
        	IN >> id >> name >> path;
 
        	stmt->setInt(1, id);
        	stmt->setString(2, strToUTF8(name));
	        stmt->setString(3, strToUTF8(path));
 
	        stmt->executeUpdate();
        }
 
    	// mise a jour de la sequence
        auto_ptr<odbc::PreparedStatement> ps(con->prepareStatement("SELECT idRemoteFolder FROM RemoteFolder ORDER BY idRemoteFolder DESC"));
        auto_ptr<odbc::ResultSet> rs(ps->executeQuery());
        IF (rs->next()) {
			int result = rs->getInt(1);
			auto_ptr<odbc::PreparedStatement> dropSecStm(con->prepareStatement("DROP sequence sq_RemoteFolder_idRemoteFolder"));
            dropSecStm->executeUpdate();
			dropSecStm->close();
 
            result += 1;
            auto_ptr<odbc::PreparedStatement> creaSecStm(con->prepareStatement("CREATE sequence sq_RemoteFolder_idRemoteFolder start WITH ? increment BY 1"));
			creaSecStm->setInt(1, result);
			creaSecStm->executeUpdate();
			creaSecStm->close();
        }
        ps->close();
 
        commit_transaction();
 
        stmt->close();
    } catch (CppSQLite3Exception &e) {
        rollback_transaction();
        ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("-%D Monitor: DataSource exception: %s\n"), e.errorMessage()), -1);
    } catch (std::out_of_range &e) {
        rollback_transaction();
    	ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("-%D Monitor: add_Remote_Folders() out of range: %s\n"), e.what()), -1);
    } catch (std::exception &e) {
        rollback_transaction();
        ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("-%D Monitor: add_Remote_Folders() User command error: %s\n"), e.what()), -1);
    }
    RETURN 0;
}
et j'ai cette erreur que je n'arrive pas a reproduire dans le client ORACLE:
Citation:
User command error: Error executing "CREATE sequence sq_RemoteFolder_idRemoteFolder start WITH ? increment BY 1": [OpenLink][ODBC][Oracle Server]ORA-01036: illegal variable name/number
Pour le ?, ce n'est pas ca le problem, le bind est bien fait, j'ai pu verifier, et si on execute cette requette avec le ? dans le client ORACLE on a pas la meme erreur

Est ce que qq un a une idée d'ou pourait venir le probleme? je ne suis pas un expert en ORACLE.

Merci

A bientot
yupa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2008, 12h15   #2
Membre du Club
 
Inscription : mai 2005
Messages : 134
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 134
Points : 50
Points : 50
Tu as essayé de remplacer le ? par 1 par exemple ?
jokos2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h17.


 
 
 
 
Partenaires

Hébergement Web