I recently upgraded the database underlying one of my applications to PostgreSQL 15 (from 12, where things were working fine). Using Xojo 2023 R2, I don’t seem to be able to write to the database. Reading from the database is OK. I use functions in postgreSQL. From Xojo I simply call the function and it either updates the existing record, or creates a new one. I verified whether it could be related to usine the public schema. It does not seems so, but I could be wrong.
- I am running Xojo 20223 R2 on Win 11 fully patched. The postgreSQL server is Debian Linux 12.1
- Running the below code in Xojo fails silently. No exception, no error, no result either…
- Running the functions in the database from Navicat, copying the data from the debug pane in Xojo, performs correctly, as expected.
Here is an example Xojo method (inside a class)
If AdrsDirty = True Then 'start saving process
Try
' SQLStr = "Select 'cust_manage_address_data'"
If Me.adrnr < 1 Then
SQLStr = SQLStr + "'', "
Else
SQLStr = SQLStr + "'" + Me.adrnr.tostring + "', " 'p0
End If
SQLStr = SQLStr + "( cast('" + Me.nom + "' as character varying), " 'p1
SQLStr = SQLStr + "cast('" + Me.prenom + "' as character varying), " 'p2
SQLStr = SQLStr + "cast('" + Me.nom1 + "' as character varying), " 'p3
SQLStr = SQLStr + "cast('" + Me.nom2 + "' as character varying), " 'p4
SQLStr = SQLStr + "cast('" + Me.nom3 + "' as character varying), " 'p5
SQLStr = SQLStr + "cast('" + Me.nom4 + "' as character varying), " 'p6
SQLStr = SQLStr + "cast('" + Me.numciv + "' as character varying), " 'p7
SQLStr = SQLStr + "cast('" + Me.adresse1 + "' as character varying), " 'p8
SQLStr = SQLStr + "cast('" + Me.adresse2 + "' as character varying), " 'p9
SQLStr = SQLStr + "cast('" + Me.adresse3 + "' as character varying), " 'p10
SQLStr = SQLStr + "cast('" + Me.adresse4 + "' as character varying), " 'p11
SQLStr = SQLStr + "cast('" + Me.ville + "' as character varying), " 'p12
SQLStr = SQLStr + "cast('" + Me.ville2 + "' as character varying), " 'p13
SQLStr = SQLStr + "cast('" + Me.region + "' as character varying), " 'p14
SQLStr = SQLStr + "cast('" + Me.pays + "' as character(2)), " 'p15
SQLStr = SQLStr + "cast('" + Me.codepostal + "' as character varying), " 'p16
SQLStr = SQLStr + "cast('" + Me.nomrue + "' as character varying), " 'p17
SQLStr = SQLStr + "cast('" + Me.FormattedAddress + "' as character varying), " 'p18
SQLStr = SQLStr + "cast('" + Me.NumAppt + "' as character varying));" 'p19
SQLStr = DefineEncoding(SQLStr,encodings.UTF8)
Session.con.ExecuteSQL(SQLStr)
Catch e As DatabaseException
System.debuglog "Save Sales Partner Address data: " + e.message
TransactionOK = False
End Try
End If 'adrsDirty
And here is the correspondng plsql function:
CREATE OR REPLACE FUNCTION "public"."cust_manage_address_data"(INOUT "p0" int8, IN "p1" varchar, IN "p2" varchar, IN "p3" varchar, IN "p4" varchar, IN "p5" varchar, IN "p6" varchar, IN "p7" varchar, IN "p8" varchar, IN "p9" varchar, IN "p10" varchar, IN "p11" varchar, IN "p12" varchar, IN "p13" varchar, IN "p14" varchar, IN "p15" varchar, IN "p16" varchar, IN "p17" varchar, IN "p18" varchar, IN "p19" varchar)
RETURNS "pg_catalog"."int8" AS $BODY$
BEGIN
LOOP
-- first try to update the key
UPDATE dadrs SET nom = p1, prenom = p2, nom1 = p3, nom2 = p4, nom3 = p5, nom4 = p6, numciv = p7, adresse1 = p8, adresse2 = p9, adresse3 = p10, adresse4 = p11, ville = p12, ville2 = p13, region = p14, pays = p15, codepostal = p16, nomrue = p17, formattedaddress = p18, numappt = p19 WHERE adrnr = P0;
IF found THEN
RETURN ;
END IF;
BEGIN
INSERT INTO dadrs(adrnr, nom, prenom, nom1, nom2, nom3, nom4, numciv, adresse1, adresse2, adresse3, adresse4, ville, ville2, region, pays, codepostal, nomrue, formattedaddress, numappt) VALUES (P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19) returning P0;
RETURN ;
EXCEPTION WHEN unique_violation THEN
-- do nothing : loop to try the UPDATE again (concurrent insert of the same key)
END;
END LOOP;
END$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
Please note: the issue is not limited to this specific function, I am providing an example of what does not work.
Has anyone else encountered a similar issue? Or did I just stumble upon an issue with Xojo and PostgreSQL 15? Or am I just missing something obvious?