Hallo Volker,
nachdem ich nun endlich alle Probleme in Sachen CharSet's aus dem
Weg geräumt habe, geht es nun an den 2. Versuch Deine SP zum Laufen
zu bringen.
Der 1. Versuch war eben genau an diesen falschen CharSet's in meinen DB's gescheitert,
was auch gut so war, da erst dieser die Schwere des Problems mir deutlich gemacht hat.
Ich hatte es mir anders erhoft, aber nicht wirklich erwartet, dass dieser gleich klappt.
Leider fliegt dieser der mir wenig sagenden Meldung um die Ohren:
SQLSTATE[HY000]: General error: -804 Dynamic SQL Error SQL error code = -804 Incorrect values within SQLDA structure
Folgendes kann ich an Info's liefern:
1. Dieser Teil zeigt, dass Deine SP in der DB vorhanden ist:
Code: Alles auswählen
$Select = SELECT * FROM RDB$PROCEDURES WHERE RDB$PROCEDURE_NAME='GET_XDB_INSERTSQL';
Connect-String: >//localhost/E:/DataBase/Labor_Update.FDB, SYSDBA, HomePassword<
$Record:
Array
(
[RDB$PROCEDURE_NAME] => GET_XDB_INSERTSQL
[RDB$PROCEDURE_ID] => 1
[RDB$PROCEDURE_INPUTS] => 4
[RDB$PROCEDURE_OUTPUTS] => 1
[RDB$DESCRIPTION] =>
[RDB$PROCEDURE_SOURCE] => begin
-- erzeugt crossdb-SQL für insert in die Zieltabelle und benutzt dazu das "insert" statement
-- input Connect String zur Quell-DB, (SrcDBC), ein Quell-Select (SrcSQL),
-- Anzahl seiner Spalten (SrcFldCount) und der Name der Zieltabelle (DstTbl)
-- Die Feldliste der Zieltabelle werden ermittelt, das SrcSQL muss dieser Feldliste entsprechen
-- Feldtypen der Zieltabelle werden ausgeliehen
-- das SrcSQL muss bis zu SrcFldCount der Struktur der Zieltabelle entsprechen
dsttbl = upper(:dsttbl);
srcsql = replace(:srcsql, '''', '''''''''');
-- SRCDBC auf DB-Alias reduzieren, damit user/pw der aktuellen connection benutzt werden können
srcdbc = substring(:srcdbc from position(':', :srcdbc) + 1);
sql =
'execute block RETURNS (result integer, SQL varchar(30000))
as
declare declares varchar(10000);
declare params varchar(3000);
declare flds varchar(6000);
declare wildcards varchar(3000);
declare insertsql varchar(20000);
declare dstfldcount integer;
declare crlf varchar(2);
begin
-- daten aus srcSQL nach dsttabname laden
crlf = ascii_char(13) || ascii_char(10);
-- anzahl der zieltabellenfelder ermitteln
dstfldcount = (select count(rdb$field_position)
from rdb$relation_fields
where trim(rdb$relation_name) = ''' || :dsttbl || ''');
-- struktur der zieltabelle ermitteln
with
a (fldname, fldpos) as (
select trim(rdb$field_name) fldname, rdb$field_position
from rdb$relation_fields
where rdb$system_flag = 0 and trim(rdb$relation_name) = ''' || :dsttbl || '''
order by 2
rows ' || :srcfldcount || '),
b (declares, flds, wildcards, params) as (
select :crlf || list(''declare '' || fldname || '' TYPE OF COLUMN ' || :dsttbl || '.'' || fldname || '';'', :crlf) || :crlf,
list(fldname), list(''?''), list('':'' || fldname)
from a)
select * from b
into :declares, :flds, :wildcards, :params;
-- kurzes statement ohne feldliste?
if (:dstfldcount <= ' || :srcfldcount || ') then
insertsql = ''''''insert into ' || :dsttbl || ' values ('' || :wildcards || '')'''''';
else
insertsql = ''''''insert into ' || :dsttbl || ' ('' || :flds || '') values ('' || :wildcards || '')'''''';
sql = ''execute block returns (result integer) as '' || :declares || ''begin '';
sql = sql || :crlf || '' result = 0;'';
sql = sql || :crlf || '' for execute statement ''''' || :srcsql || ''''' '';
sql = sql || :crlf || '' on external ''''' || :srcdbc || ''''' '';
sql = sql || :crlf || '' into '' || :params || '' '' || :crlf || '' do '' || :crlf || '' begin '';
-- eintragen lokal
sql = sql || :crlf || '' execute statement ('' || :insertsql || '') ('' || :params || '');'';
sql = sql || :crlf || '' result = result + 1; '' || :crlf || '' end '' || :crlf || '' suspend; '' || :crlf || ''end;'';
in autonomous transaction
do
execute statement sql
-- anzahl der inserts zurückgeben
into :result;
suspend;
end';
suspend;
end
;
[RDB$PROCEDURE_BLR] => &5d&5'&5&5 N&5 N-›g))ºREPLACE)''''')()#"ºPOSITION:)ÿÿÿ)'''''''''''''''''';execute block RETURNS (result integer, SQL varchar(30000))
as
declare declares varchar(10000);
declare params varchar(3000);
declare flds varchar(6000);
declare wildcards varchar(3000);
declare insertsql varchar(20000);
declare dstfldcount integer;
declare crlf varchar(2);
begin
-- daten aus srcSQL nach dsttabname laden
crlf = ascii_char(13) || ascii_char(10);
-- anzahl der zieltabellenfelder ermitteln
dstfldcount = (select count(rdb$field_position)
from rdb$relation_fields
where trim(rdb$relation_name) = ')ì');
-- struktur der zieltabelle ermitteln
with
a (fldname, fldpos) as (
select trim(rdb$field_name) fldname, rdb$field_position
from rdb$relation_fields
where rdb$system_flag = 0 and trim(rdb$relation_name) = ')'
order by 2
rows )w),
b (declares, flds, wildcards, params) as (
select :crlf || list('declare ' || fldname || ' TYPE OF COLUMN )ó.' || fldname || ';', :crlf) || :crlf,
list(fldname), list('?'), list(':' || fldname)
from a)
select * from b
into :declares, :flds, :wildcards, :params;
-- kurzes statement ohne feldliste?
if (:dstfldcount <= )') then
insertsql = '''insert into )K values (' || :wildcards || ')''';
else
insertsql = '''insert into )æ (' || :flds || ') values (' || :wildcards || ')''';
sql = 'execute block returns (result integer) as ' || :declares || 'begin ';
sql = sql || :crlf || ' result = 0;';
sql = sql || :crlf || ' for execute statement '')0'' ';
sql = sql || :crlf || ' on external '')à'' ';
sql = sql || :crlf || ' into ' || :params || ' ' || :crlf || ' do ' || :crlf || ' begin ';
-- eintragen lokal
sql = sql || :crlf || ' execute statement (' || :insertsql || ') (' || :params || ');';
sql = sql || :crlf || ' result = result + 1; ' || :crlf || ' end ' || :crlf || ' suspend; ' || :crlf || 'end;';
in autonomous transaction
do
execute statement sql
-- anzahl der inserts zurückgeben
into :result;
suspend;
end)ÿ›ÿÿÿÿ)ÿÿL
[RDB$SECURITY_CLASS] => SQL$9
[RDB$OWNER_NAME] => SYSDBA
[RDB$RUNTIME] =>
[RDB$SYSTEM_FLAG] => 0
[RDB$PROCEDURE_TYPE] => 1
[RDB$VALID_BLR] => 1
[RDB$DEBUG_INFO] => SRCDBCSRCSQLSRCFLDCOUNTDSTTBLSQLSQL?AOwT´TQ ÿ
)
GET_XDB_INSERTSQL-Check_Procedur: $numRowS = 1
2. Die Tabelle, die ich für diesem Versuch genommen habe, hat in Quell- und Ziel-DB folgende Struktur:
Code: Alles auswählen
CREATE TABLE SYSTEM (
RID_SYSTEM RID NOT NULL,
SYSTEM_NR STXT,
LIZENZ_NR STXT,
AKTIV SI DEFAULT 0,
DATEN TS DEFAULT '11.11.1111 00:00',
DATENBANK TS DEFAULT '11.11.1111 00:00',
EDITDATE TS DEFAULT '11.11.1111 00:00',
INDATE TS DEFAULT 'NOW',
STATUS SI DEFAULT 0,
SCRIPT MTXT,
SCRIPT_USER_NR STXT,
SCRIPT_USER STXT,
BATCH_SCRIPT MTXT,
BATCH_DATE TS DEFAULT '11.11.1111 00:00',
ANDROID TS DEFAULT '11.11.1111 00:00',
DISTANCEMATRIX BI DEFAULT 0,
GEOCODING BI DEFAULT 0
);
3. Dieser Teil zeigt, mit welcher Systax ich die SP angesprochen habe und die Meldung:
Code: Alles auswählen
$SQL: >select * from get_xdb_insertsql('//localhost/E:/DataBase/Labor.FDB, SYSDBA, HomePassword', 'select * from system', 17, 'system')<
Connect-String: >//localhost/E:/DataBase/Labor_Update.FDB, SYSDBA, HomePassword<
$Message: >SQLSTATE[HY000]: General error: -804 Dynamic SQL Error SQL error code = -804 Incorrect values within SQLDA structure <
Habe ich evtl. irgendwelche Hochkommas oder Vergleichbares vergessen ?
Danke und viele Grüße