Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   EXECUTE STATEMENT: ¿Qué estoy haciendo mal? (https://www.clubdelphi.com/foros/showthread.php?t=96574)

Angel.Matilla 26-01-2024 13:58:56

EXECUTE STATEMENT: ¿Qué estoy haciendo mal?
 
Estoy tratando de importar datos entre dos BB.DD. diferentes. Parea ello me he definido un procedimiento de la siguiente forma:
Código SQL [-]
CREATE PROCEDURE Insert_Dis
(cTitulo VARCHAR(60), nRegistro INTEGER, cGenero VARCHAR(25), cProductor VARCHAR(50), cUbica VARCHAR(13), cInterpretes VARCHAR(50))
AS DECLARE VARIABLE cSql VARCHAR(255);
BEGIN
  cSql = 'SELECT Album, Registro, Genero, Discografica, Situacion, Interprete FROM Discos
          INTO cTitulo, nRegistro, cGenero, cProductor, cUbica, cInterpretes';
  EXECUTE STATEMENT
    cSql
  ON EXTERNAL 'C:\Ocio_ant\Tablas\Ocio.gdb'
  AS USER 'SYSDBA' PASSWORD 'masterkey';
END;
El procedimiento se crea sin problema pero al ejecutarlo me da este error:
Execute statement error at isc_dsql_prepare :
Execute statement error at isc_dsql_prepare :
Cita:

335544569 : Dynamic SQL Error
335544436 : SQL error code = -104
335544634 : Token unknown - line 2, column 11
335544382 : INTO
Statement : SELECT Album, Registro, Genero, Discografica, Situacion, Interprete FROM Discos
INTO cTitulo, nRegistro, cGenero, cProductor, cUbica, cInterpretes
Data source : Firebird::C:\Ocio_ant\Tablas\Ocio.gdb.
At procedure 'INSERT_DIS'.

SQL Code: -901
IB Error Number: 335544926
La línea 2, columna 11 es el INTO. ¿Dónde me estoy equivocando?

cloayza 26-01-2024 14:35:11

Estimado ha varias puntos a cambiar...

Código SQL [-]
CREATE PROCEDURE Insert_Dis
   (cTitulo VARCHAR(60), nRegistro INTEGER, cGenero VARCHAR(25), cProductor VARCHAR(50), cUbica VARCHAR(13), cInterpretes VARCHAR(50))
AS DECLARE VARIABLE cSql VARCHAR(255);
BEGIN
  --cSql = 'SELECT Album, Registro, Genero, Discografica, Situacion, Interprete FROM Discos
  --        INTO cTitulo, nRegistro, cGenero, cProductor, cUbica, cInterpretes';
  cSql = 'SELECT Album, Registro, Genero, Discografica, Situacion, Interprete FROM Discos';

  FOR EXECUTE STATEMENT cSql
      ON EXTERNAL 'C:\Ocio_ant\Tablas\Ocio.gdb'
      AS USER 'SYSDBA' PASSWORD 'masterkey'
      INTO :cTitulo, :nRegistro, :cGenero, :cProductor, :cUbica, :cInterpretes
  DO
  BEGIN
      suspend;
  END
END;

Saludos cordiales

Angel.Matilla 26-01-2024 18:36:08

Cita:

Empezado por cloayza (Mensaje 554174)
Estimado ha varias puntos a cambiar...
Saludos cordiales

¡Perfecto! Muchas gracias

Angel.Matilla 26-01-2024 19:34:27

Cita:

Empezado por cloayza (Mensaje 554174)
Estimado ha varias puntos a cambiar...
[...]
Saludos cordiales

Efectivamente funciona... Si lo ejecuto desde SQL Manager no hay ningún problema pero si lo ejecuto desde la aplicación me da este error


en esta línea
Cita:

INTO :cTitulo, :nRegistro, :cGenero, :cProductor, :cUbica, :cInterpretes
la columna 14 es el espacio inmediato al INTO.

cloayza 26-01-2024 20:56:17

Claro...Debes cambiar esta línea...

Código SQL [-]
CREATE PROCEDURE Insert_Dis(
   RETURNS cTitulo VARCHAR(60), nRegistro INTEGER, cGenero VARCHAR(25), cProductor VARCHAR(50), cUbica VARCHAR(13), cInterpretes VARCHAR(50)
)

Saludos cordiales

Angel.Matilla 27-01-2024 11:11:01

Lo tengo puesto así, con el RETURNS.
Código SQL [-]
Query->SQL->Text = "CREATE PROCEDURE Insert_Ficha";
Query->SQL->Add("RETURNS (cTitulo VARCHAR(60), nRegistro INTEGER, cGenero VARCHAR(25), cProductor VARCHAR(50), cUbica VARCHAR(13), cInterpretes VARCHAR(50))");
Query->SQL->Add("AS");
Query->SQL->Add("DECLARE VARIABLE cSql VARCHAR(100);");
Query->SQL->Add("BEGIN");
Query->SQL->Add("  cSql = 'SELECT Album, Registro, Genero, Discografica, Situacion, Interprete FROM Discos';");
Query->SQL->Add("    FOR EXECUTE STATEMENT cSql");
Query->SQL->Add("        ON EXTERNAL 'C:\Ocio_ant\Tablas\Ocio.gdb'");
Query->SQL->Add("        AS USER 'SYSDBA' PASSWORD 'masterkey'");
Query->SQL->Add("        INTO :cTitulo, :nRegistro, :cGenero, :cProductor, :cUbica, :cInterpretes");
Query->SQL->Add("    DO");
Query->SQL->Add("    BEGIN");
Query->SQL->Add("      SUSPEND;");
Query->SQL->Add("    END");
Query->SQL->Add("END;");
Query->ExecSQL();
Query->Transaction->Commit();
No obstante lo que me llama la atención es que usando el mismo código con SQL Manager si funciona y desde el programa no.

Casimiro Notevi 27-01-2024 13:59:53

¿No te confunde eso en lugar de algo como esto?:


Código Delphi [-]
Query->SQL->Text = "CREATE PROCEDURE Insert_Ficha "+
                   "RETURNS (cTitulo VARCHAR(60), nRegistro INTEGER, cGenero VARCHAR(25), cProductor VARCHAR(50), cUbica VARCHAR(13), cInterpretes VARCHAR(50)) "+
                   "AS "+
                   "DECLARE VARIABLE cSql VARCHAR(100);" +
                   "BEGIN "+
                   "    cSql = 'SELECT Album, Registro, Genero, Discografica, Situacion, Interprete FROM Discos'; "+
                   "     FOR EXECUTE STATEMENT cSql " +;
                   "         ON EXTERNAL 'C:\Ocio_ant\Tablas\Ocio.gdb' "+
                   "         AS USER 'SYSDBA' PASSWORD 'masterkey' "+
                   "         INTO :cTitulo, :nRegistro, :cGenero, :cProductor, :cUbica, :cInterpretes " +
                   "     DO "+
                   "     BEGIN "+
                   "       SUSPEND; "+
                   "     END "+
                   "END;";

Angel.Matilla 29-01-2024 10:35:38

Cita:

Empezado por Casimiro Notevi (Mensaje 554195)
¿No te confunde eso en lugar de algo como esto?

La verdad es que según me pilla lo hago de las dos maneras; ya me he acostumbrado.


La franja horaria es GMT +2. Ahora son las 02:03:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi