[Issue]HSQL requêtes et fonctions personnalisées

Discussions sur le module de base de données Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est dédiée au module Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
Pour accélérer les réponses, vous pouvez mettre en ligne votre base en joignant un fichier ODB : comment faire.
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
Messages : 753
Inscription : 09 avr. 2013 07:15
Localisation : T'as pas dit bonjour, merci et à bientot !

[Issue]HSQL requêtes et fonctions personnalisées

Message par martinbrait »

Bonjour,

Je souhaitais utiliser une fonction personnalisée,
à l'intérieur d'une requête SQL, afin de passer une mise à jour,
directement depuis la console HSQL.

Code : Tout sélectionner

insert into "prenoms_PRE" ("prenom")
SELECT DISTINCT MajSansAccentNiCedille$("Prenom") FROM "prenoms_PREbis" ORDER BY "Prenom" ASC

En essayant par code, j'ai l'impression de retourner sur la même difficulté !
'ATTENTION A LA CASSE SENSIBLE CONCERNANT LE NOM DE COLONNES.

Code : Tout sélectionner

'Auteur l: Greengiant224

Sub Insert2Table
REM INSERT RECORDS INTO DATABASE TABLE
Dim Context
Dim DB
Dim Conn
Dim Stmt
Dim Result
Dim strSQL As String
Context=CreateUnoService("com.sun.star.sdb.DatabaseContext") '< get  the database context
DB=Context.getByName("travail") '<- change database name
Conn=DB.getConnection("","") '<- username & password pair - HSQL default blank

Stmt=Conn.createStatement()
strSQL= _
"insert into ""prenoms_PRE"" (""prenom"") " & _
"SELECT DISTINCT ""prenom"" FROM ""prenoms_PREbis"" ORDER BY ""prenom"" ASC;"

'LA REQUETE CI-DESSOUS NE FONCTIONNE PAS !!!
'#     "insert into ""prenoms_PRE"" (""prenom"") " & _
'#     "SELECT DISTINCT MajSansAccentNiCedille$(""prenom"") FROM ""prenoms_PREbis"" ORDER BY ""prenom"" ASC;"

Stmt.executeUpdate(strSQL) '<- update the inserted data

Conn.close() '<- close the db connection
End Sub
L'application m'a répondu "access denied".
L'usage des fonctions personnalisées avec le HSQL est il possible.


Je viens de trouver un post à ce sujet :
https://forum.openoffice.org/en/forum/v ... 13&t=72206

Bref, je cherche maintenant à écrire une fonction personnalisée dans la console,
mais tout seul, je n'ai aucune idée pour savoir le faire, et savoir me déboguer.

Code : Tout sélectionner



'FONCTION A TRADUIRE DANS LA CONSOLE SQL :
Public Function MajSansAccentNiCedille$(ByVal Chaine$)
'Auteur : Thierry POURTIER
Const VAccent = "àáâãäåéêëèìíîïðòóôõöùúûüç", VSsAccent = "aaaaaaeeeeiiiioooooouuuuc"
Dim Bcle&
'Dim Bcle As String
For Bcle = 1 To Len(VAccent)
Chaine = Replace(Chaine, Mid(VAccent, Bcle, 1), Mid(VSsAccent, Bcle, 1))
Next Bcle
MajSansAccentNiCedille$ = Chaine
End Function



'je ne suis pas sûr de savoir créer une fonction personnalisée, comme sur ce modèle, 
'qui me permettrait d'implémenter la fonction personnalisée à mon libreoffice :
'aller dans le menu Tools\SQL
'Dans la console d'exécution SQL, injecter le code suivant :
'puis exécuter
'refermer la console



'A CREER :
CREATE FUNCTION MajSansAccentNiCedille$ (INPUTSTRING VARCHAR(32000))
   RETURNS VARCHAR(32000)
   LANGUAGE SQL
   NOT DETERMINISTIC
   CONTAINS SQL
   -- Be sure to return a NULL value if input is NULL
   RETURNS NULL ON NULL INPUT
   BEGIN ATOMIC



   RETURN MajSansAccentNiCedille$;
END



'MODELE QUI FONCTIONNE, A SUIVRE :
CREATE FUNCTION PROPER (INPUTSTRING VARCHAR(32000))
   RETURNS VARCHAR(32000)
   LANGUAGE SQL
   NOT DETERMINISTIC
   CONTAINS SQL
   -- Be sure to return a NULL value if input is NULL
   RETURNS NULL ON NULL INPUT
   BEGIN ATOMIC
      DECLARE PROPERCASE VARCHAR(32000);
      -- Bring back all characters as lower CASE
      SET PROPERCASE = LOWER(INPUTSTRING);
      -- When PROPERCASE is blank, no need to proceed so end it here
      IF PROPERCASE = '' THEN
         RETURN PROPERCASE;
      END IF;
      -- Use UNNEST, and REGEXP_SUBSTRING_ARRAY to bring back unique array of
      -- NOT [^\p{javaLowerCase}] followed by [\p{javaLowerCase}]
      FOR
          SELECT DISTINCT REG_ARRAY as REG_CHAR FROM UNNEST(REGEXP_SUBSTRING_ARRAY(PROPERCASE,'[^\p{javaLowerCase}][\p{javaLowerCase}]')) AS T(REG_ARRAY)
      DO
         SET PROPERCASE = REPLACE(PROPERCASE,REG_CHAR,UPPER(REG_CHAR));
      END FOR;
      -- Make sure first character is UPPER CASE
      SET PROPERCASE = UPPER(SUBSTR(PROPERCASE,1,1)) || SUBSTR(PROPERCASE,2);
   RETURN PROPERCASE;
END
A ce stade, je ne sais pas si le retour en erreur java, dans ma console, provient de ma version libre office trop faible, ou provient
d'une erreur de syntaxe de mon instruction HSQL.

Un conseil ?


Merci et à bientôt.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par martinbrait le 21 juin 2017 11:39, modifié 2 fois.
LibreOffice version 5.4.7.2.M6 (x64)
Windows 10
+
LibreOffice version 5.4.7.2.M6 (x64)
Windows 7

#HSQL Database Engine 1.8.0
version=1.8.0

Locale : fr-FR (fr_FR)

Obligation de version


Bonjour, merci et à bientôt !
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25175
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: HSQL requêtes et fonctions personnalisées

Message par Dude »

martinbrait a écrit :Un conseil ?
Image
https://forum.openoffice.org/fr/forum/v ... onction%2A
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
Messages : 753
Inscription : 09 avr. 2013 07:15
Localisation : T'as pas dit bonjour, merci et à bientot !

Re: HSQL requêtes et fonctions personnalisées

Message par martinbrait »

Bonjour Dude,

J'y suis donc allé de mon post d'encouragement,
à la suite de ton propre message 49185.

Merci et à bientôt !
LibreOffice version 5.4.7.2.M6 (x64)
Windows 10
+
LibreOffice version 5.4.7.2.M6 (x64)
Windows 7

#HSQL Database Engine 1.8.0
version=1.8.0

Locale : fr-FR (fr_FR)

Obligation de version


Bonjour, merci et à bientôt !