ORA-01036: Error con C++ Builder

angel_matilla
21 de Octubre del 2009
Estoy trabajando con C++ Builder 5 contra una base de datos en Oracle y al efectuar un INSERT en una tabla desde el programa me da este error; sin embargo, si ejecuto el INSERT desde una herramienta externa (SqlDbx) la inserción de la fila es correcta. El código que estoy usando es este:
Query2->Close();
Query2->DeclareVariable(\"Formato\" , otString);
Query2->DeclareVariable(\"Version\" , otString);
Query2->DeclareVariable(\"Orden\" , otInteger);
Query2->DeclareVariable(\"Etiqueta\", otString);
Query2->DeclareVariable(\"Longitud\", otInteger);
Query2->DeclareVariable(\"Mascara\" , otString);
Query2->DeclareVariable(\"Campo\" , otString);
Query2->SQL->Text = \"INSERT INTO AUDI_FORMATOS_2 (Aplicativo, Formato, Version, Orden, Etiqueta, Separador, Concatenado, Longitud, Mascara, Campo) VALUES (\\'I\\', :Formato, :Version, :Orden, :Etiqueta, 0, 0, :Longitud, :Mascara, :Campo)\";
try
{
Query2->SetVariable(\"Formato\" , Trim(cFileName.SubString(1, cFileName.Pos(\".XML\") - 1)));
Query2->SetVariable(\"Version\" , Date().FormatString(\"yyyymmdd\"));
Query2->SetVariable(\"Orden\" , nItem + 1);
Query2->SetVariable(\"Etiqueta\", cAux);
Query2->SetVariable(\"Longitud\", nLongitud);
Query2->SetVariable(\"Mascara\" , cMascara);
Query2->SetVariable(\"Campo\" , cCampo);
Query2->Execute();
}
catch (const Exception &E)
{
Application->Terminate();
return;
}

Y la orden que se genera es esta:

INSERT INTO AUDI_FORMATOS_2 (Aplicativo, Formato, Version, Orden, Etiqueta, Separador, Concatenado, Longitud, Mascara, Campo) VALUES (\\'I\\', \\'AMEM001\\', \\'20091020\\', 1, \\'OPCION\\', 0, 0, 1, NULL, \\'OPCION\\')

Andoni
21 de Octubre del 2009
El error que comentas es bastante obvio, revisa el codigo con atención y enseguida lo veras.

angel_matilla
21 de Octubre del 2009
Y al estructura de la tabla, que no me había dado cuenta de incluirla, es esta:

CREATE TABLE AUDITORIA.AUDI_FORMATOS_2
(
APLICATIVO VARCHAR2(2) NOT NULL,
FORMATO VARCHAR2(11) NOT NULL,
VERSION VARCHAR2(11) NOT NULL,
ORDEN NUMBER NOT NULL,
ETIQUETA VARCHAR2(31),
SEPARADOR NUMBER,
CONCATENADO NUMBER,
LONGITUD NUMBER,
MASCARA VARCHAR2(25),
CAMPO VARCHAR2(21)
)
TABLESPACE AUDITORIA
LOGGING
NOCACHE
STORAGE (BUFFER_POOL DEFAULT);

CREATE UNIQUE INDEX PK_AUDI_FORMATOS_2 ON AUDITORIA.AUDI_FORMATOS_2 (APLICATIVO, FORMATO, VERSION, ORDEN);

angel_matilla
21 de Octubre del 2009
Lo siento Andoni: Tal vez sea obvio pero le llevo dadas tantas vueltas a ese trozo que no veo lo que a ti te parece tan evidente. Es más, he reemplazado los DeclareVariable / SetVariable por código puro y duro:
Query2->Close();
Query2->SQL->Clear();
Query2->SQL->Text = "INSERT INTO AUDI_FORMATOS_2 (Aplicativo, Formato, Version, Orden, Etiqueta, Separador, Concatenado, Longitud, Mascara, Campo) VALUES ('I', '" + Trim(cFileName.SubString(1, cFileName.Pos(".XML") - 1)) + "', '" + Date().FormatString("yyyymmdd") + "', " + IntToStr(nItem + 1) + ", '" + Trim(cAux) + "', 0, 0, " + IntToStr(nLongitud) + ", " + cMascara + ", '" + Trim(cCampo) + "')";
try
{
Query2->Execute();
}
catch (const Exception &E)
{
Application->Terminate();
return;
}

Se genera el mismo query:
INSERT INTO AUDI_FORMATOS_2 (Aplicativo, Formato, Version, Orden, Etiqueta, Separador, Concatenado, Longitud, Mascara, Campo) VALUES ('I', 'AMEM001', '20091021', 1, 'OPCION', 0, 0, 1, NULL, 'OPCION')

Pero sigue dando el mismo error.

angel_matilla
21 de Octubre del 2009
Ya está aclarado. Tenías razón Andoni: Es una tontería; bastaba con poner ANTES de los DeclareVariable Query2->DeleteVariables().

Andoni
21 de Octubre del 2009
Cierto.
Podría habertelo puesto, pero prefería que lo vieras tu mismo.