Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Merge oracle

2 réponses
Avatar
tjfromparis
Bonjour

je ne sais pas si beaucoup d'entre vous travaille avec des bases
oracle...
Je suis en train de me faire la main sur le merge oracle et ca
simplifie =E9norm=E9ment le code.

PROCEDURE UPSERT_BUDGET(oBudget est un c_Budget)

_retFonction est un bool=E9en

_sql est une cha=EEne
_sql +=3D " merge into BUDGET using (select 1 from dual) ori on
(BUDGET.ID_BUDGET =3D '%1') "
_sql +=3D " when matched then update set BUDGETLIBELLE =3D '%2' "
_sql +=3D "when not matched then Insert (ID_BUDGET , BUDGETLIBELLE )
values ( '%1' , '%2' ) ; "

_sql =3D Cha=EEneConstruit(_sql,oBudget.ID_BUDGET,oBudget.BudgetLibelle)

_retFonction =3D otl4WD:mySQLExec(_sql, 1)

IF (_retFonction) THEN
otl4WD:mySQLFerme(1)
_retFonction =3D otl4WD:mySQLExec("COMMIT",1)
IF (_retFonction) THEN
// rien juste renvoyer code retour
SINON
msg est une cha=EEne =3D (otl4WD:mySQLGetErrorMessage())
LOG(msg )
END
ELSE
Erreur(otl4WD:mySQLGetErrorMessage())
END

otl4WD:mySQLFerme(1)

RENVOYER _retFonction


Entre le dataBinding de windev et le merge d'oracle le nombre de code
diminue dans des proportions assez impressionnante.

Quand j'aurais un peu de temps, je vais voir pour une construction
dynamique de la requete de MERGE en fonction de la description de la
table et de la classe.

Si ca peut faire gagner du temps =E0 quelqu'un...

2 réponses

Avatar
Firetox
Bonjour,

juste pour info car je vois quelque chose qui ne va pas dans votre code sur
OTL4WD il faut fermer la requete quelque soit le resultat du exec (les 2 ne
sont pas liés)

_sql = ChaîneConstruit(_sql,oBudget.ID_BUDGET,oBudget.BudgetLibelle)
_retFonction = otl4WD:mySQLExec(_sql, 1)
otl4WD:mySQLFerme(1)

IF (_retFonction) THEN
_retFonction = otl4WD::mySQLTransaction((otl4WD::mySQLFin), 1)
IF pas (_retFonction) THEN
msg est une chaîne = (otl4WD:mySQLGetErrorMessage())
LOG(msg )
END
ELSE
Erreur(otl4WD:mySQLGetErrorMessage())
END

RENVOYER _retFonction

voila juste pour optimiser les lignes de code et le fonctionnement
pour eviter de se trouver avec une requete ouverte et faire des mySQLFerme
un peu partout

cordialement


a écrit dans le message de
news:
Bonjour

je ne sais pas si beaucoup d'entre vous travaille avec des bases
oracle...
Je suis en train de me faire la main sur le merge oracle et ca
simplifie énormément le code.

PROCEDURE UPSERT_BUDGET(oBudget est un c_Budget)

_retFonction est un booléen

_sql est une chaîne
_sql += " merge into BUDGET using (select 1 from dual) ori on
(BUDGET.ID_BUDGET = '%1') "
_sql += " when matched then update set BUDGETLIBELLE = '%2' "
_sql += "when not matched then Insert (ID_BUDGET , BUDGETLIBELLE )
values ( '%1' , '%2' ) ; "

_sql = ChaîneConstruit(_sql,oBudget.ID_BUDGET,oBudget.BudgetLibelle)

_retFonction = otl4WD:mySQLExec(_sql, 1)

IF (_retFonction) THEN
otl4WD:mySQLFerme(1)
_retFonction = otl4WD:mySQLExec("COMMIT",1)
IF (_retFonction) THEN
// rien juste renvoyer code retour
SINON
msg est une chaîne = (otl4WD:mySQLGetErrorMessage())
LOG(msg )
END
ELSE
Erreur(otl4WD:mySQLGetErrorMessage())
END

otl4WD:mySQLFerme(1)

RENVOYER _retFonction


Entre le dataBinding de windev et le merge d'oracle le nombre de code
diminue dans des proportions assez impressionnante.

Quand j'aurais un peu de temps, je vais voir pour une construction
dynamique de la requete de MERGE en fonction de la description de la
table et de la classe.

Si ca peut faire gagner du temps à quelqu'un...
Avatar
tjfromparis
c'est parce que je n'ai pas fais le copier/coller jusqu'au bout mais
je ferme bien mes requetes.

On 16 mar, 08:47, "Firetox" wrote:
Bonjour,

juste pour info car je vois quelque chose qui ne va pas dans votre code s ur
OTL4WD il faut fermer la requete quelque soit le resultat du exec (les 2 ne
sont pas liés)

_sql = ChaîneConstruit(_sql,oBudget.ID_BUDGET,oBudget.BudgetLibelle)
_retFonction = otl4WD:mySQLExec(_sql, 1)
otl4WD:mySQLFerme(1)

IF (_retFonction) THEN
      _retFonction = otl4WD::mySQLTransaction((otl4WD::mySQLFin), 1)
        IF pas (_retFonction) THEN
            msg est une chaîne = (otl4WD:mySQLGetErrorMes sage())
            LOG(msg )
        END
ELSE
        Erreur(otl4WD:mySQLGetErrorMessage())
END

RENVOYER _retFonction

voila juste pour optimiser les lignes de code et le fonctionnement
pour eviter de se trouver avec une requete ouverte et faire des mySQLFerm e
un peu partout

cordialement

a écrit dans le message denews:d464a9a5-6af4-40
Bonjour

je ne sais pas si beaucoup d'entre vous travaille avec des bases
oracle...
Je suis en train de me faire la main sur le merge oracle et ca
simplifie énormément le code.

PROCEDURE UPSERT_BUDGET(oBudget est un c_Budget)

_retFonction est un booléen

_sql est une chaîne
_sql += " merge into BUDGET   using (select 1 from dual) ori on
(BUDGET.ID_BUDGET = '%1') "
_sql += " when matched then update set BUDGETLIBELLE = '%2' "
_sql += "when not matched then Insert (ID_BUDGET , BUDGETLIBELLE )
values ( '%1' , '%2' ) ; "

_sql = ChaîneConstruit(_sql,oBudget.ID_BUDGET,oBudget.BudgetLibelle)

_retFonction = otl4WD:mySQLExec(_sql, 1)

IF (_retFonction) THEN
otl4WD:mySQLFerme(1)
_retFonction = otl4WD:mySQLExec("COMMIT",1)
IF (_retFonction) THEN
// rien juste renvoyer code retour
SINON
msg est une chaîne = (otl4WD:mySQLGetErrorMessage())
LOG(msg )
END
ELSE
Erreur(otl4WD:mySQLGetErrorMessage())
END

otl4WD:mySQLFerme(1)

RENVOYER _retFonction

Entre le dataBinding de windev et le merge d'oracle le nombre de code
diminue dans des proportions assez impressionnante.

Quand j'aurais un peu de temps, je vais voir pour une construction
dynamique de la requete de MERGE en fonction de la description de la
table et de la classe.

Si ca peut faire gagner du temps à quelqu'un...