I'm facing an issue where I have a request that works in SQL Developer
or VsCode
with the oracle DB
add-on but in the php code, it returns 0 rows. PHP
version is old and I can't do anything about that, 5.4.6 , OracleDB
is 11g ( 11.2.0.3.0
).
Here is the request:
$sql = "SELECT
PATIENT_SOIGNE.NOM,
PATIENT_SOIGNE.PATRONYME AS NOM_NAISSANCE,
PATIENT_SOIGNE.PRENOM,
to_date(PATIENT_SOIGNE.DATENAIS,'YYYYMMDD') AS DDN,
decode(PATIENT_SOIGNE.SEXE,'F','Femme','M','Homme','Inconnu') AS SEXE,
PATIENT_SOIGNE.NIP,
S_ACTE_MED.CODEP1 || ' - ' || ( S_ACTE_MED.LIBELLE ) AS ACTE,
OPERATEUR.NOM AS NOM_OPERATEUR,
OPERATEUR.PRENOM AS PRENOM_OPERATEUR
FROM
PENSOINS.ACTE_RDV,
PENSOINS.RDV_STATUT RDV_STATUT,
PENSOINS.ACTE_RDV_GRP,
PENSOINS.S_ACTE_M S_ACTE_MED,
PENSOINS.EJ_PERSO OPERATEUR,
(
SELECT RESSOURCE_OPERATEUR.*, ACTE_RDV_RESA.NIACTERDV
FROM
PENSOINS.DXP_RESSOURCE RESSOURCE_OPERATEUR, PENSOINS.ACTE_RDV_RESA ACTE_RDV_RESA
WHERE
RESSOURCE_OPERATEUR.ID_RESSOURCE=ACTE_RDV_RESA.REF_RESSOURCE
AND
RESSOURCE_OPERATEUR.REF_TYPE_RESSOURCE=1
) TD_RESSOURCE_OPERATEUR,
PENSOINS.EJ_SRV RDV_SRV,
PENSOINS.VENUE,
(
SELECT A.NIACTERDV, A.NIVENUE, TD.NISEJMOUV, V.NIPATIENT, nvl(TD.NISEJOUR, V.NISEJOUR) as NISEJOUR, V.NISERVICE
FROM PENSOINS.ACTE_RDV A,
PENSOINS.VENUE V,
(
SELECT L.NIACTERDV, L.NIVENUE, DER.DATE_DER_MAJ, L.NISEJMOUV, M.NISEJOUR
FROM PENSOINS.LIEN_RDV_MVT L,
PENSOINS.MOUVEMEN M,
(
SELECT A.NIACTERDV, A.NIVENUE, max(nvl(L.DATE_MODIF, L.DATE_CREA)) DATE_DER_MAJ
FROM PENSOINS.ACTE_RDV A,
PENSOINS.LIEN_RDV_MVT L
WHERE A.NIACTERDV = L.NIACTERDV
AND L.RETRAIT = 'F'
GROUP BY A.NIVENUE,A.NIACTERDV
) DER
WHERE L.NISEJMOUV = M.NISEJMOUV
AND DER.NIACTERDV = L.NIACTERDV
AND DER.NIVENUE = L.NIVENUE
AND DER.DATE_DER_MAJ = nvl(L.DATE_MODIF, L.DATE_CREA)
AND L.RETRAIT = 'F'
) TD
WHERE A.NIVENUE(+) = V.NIVENUE
AND TD.NIACTERDV(+) = A.NIACTERDV
) TD_VENUE,
PENSOINS.PATIENT PATIENT_SOIGNE
WHERE
( PENSOINS.ACTE_RDV.STATUTRDV=RDV_STATUT.NI(+) )
AND ( PENSOINS.ACTE_RDV_GRP.NIACTERDV=PENSOINS.ACTE_RDV.NIACTERDV )
AND ( S_ACTE_MED.NIACTE=PENSOINS.ACTE_RDV_GRP.NIACTE and S_ACTE_MED.NISERVICE=PENSOINS.ACTE_RDV_GRP.NISERVICE )
AND ( OPERATEUR.NIUTILISAT(+)=TD_RESSOURCE_OPERATEUR.ID_DXCARE )
AND ( TD_RESSOURCE_OPERATEUR.NIACTERDV(+)=PENSOINS.ACTE_RDV.NIACTERDV )
AND ( PENSOINS.ACTE_RDV.NISERVICE=RDV_SRV.NISERVICE(+) )
AND ( PENSOINS.VENUE.NIVENUE=TD_VENUE.NIVENUE )
AND ( TD_VENUE.NIACTERDV=PENSOINS.ACTE_RDV.NIACTERDV(+) )
AND ( PATIENT_SOIGNE.NIPATIENT(+)=PENSOINS.VENUE.NIPATIENT )
AND RDV_STATUT.CODE|| ' - ' ||RDV_STATUT.LIBELLE IN ( 'R - Attribué','M - Modifié' )
AND RDV_SRV.CODE||' - '||RDV_SRV.NOM IN ( '07 - Diététique','08 - Endocrinologie','18 - Oncologie','19 - Ophtalmologie','24 - Pneumologie','30 - Rhumatologie','34 - Orthophonie','40 - Consultations externes','42 - Stomatologie','43 - HOPITAL DE JOUR MEDECINE','44 - Hématologie','20 - ORL','CE 02 - Anesthésie','CE 03 - Cardiologie','CE 04 - Chirurgie Orthopédique','CE 06 - Chirurgie Urologique','CE 07 - Chirurgie Viscérale','CE 08 - Hépato-gastro-entérologie','CE 09 - Chirurgie Plastique','CE 10 - Gériatrie','CE 11 - Gynécologie-Obstétrique','CE 12 - Médecine interne','CE 14 - Pédiatrie','CE 15 - Tabacologie','CE 16 - Chirurgie Vasculaire','16 - Néphrologie' )
AND substr(PENSOINS.ACTE_RDV.HORAIRE, 1, 8) = '".$date_next."'
GROUP BY
PATIENT_SOIGNE.NOM,
PATIENT_SOIGNE.PATRONYME,
PATIENT_SOIGNE.PRENOM,
to_date(PATIENT_SOIGNE.DATENAIS,'YYYYMMDD'),
decode(PATIENT_SOIGNE.SEXE,'F','Femme','M','Homme','Inconnu'),
PATIENT_SOIGNE.NIP,
S_ACTE_MED.CODEP1 || ' - ' || ( S_ACTE_MED.LIBELLE ),
OPERATEUR.NOM,
OPERATEUR.PRENOM";
And the code which uses it:
$date_next = date_next_day();
$db_o = connexion_oracle_dxcare();
$parsed = oci_parse($db_o, $sql);
$ru=oci_execute($parsed);
if (!$ru) { //doesn't show anything
$e = oci_error($parsed);
print htmlentities($e['message']);
print "\n<pre>\n";
print htmlentities($e['sqltext']);
printf("\n%".($e['offset']+1)."s", "^");
print "\n</pre>\n";
}
$num_rows = oci_fetch_all($parsed, $res); //returns 0 rows
var_dump($res); //show me all the column names but no datas inside
The date format is good, my function return this format ' YYYYMMDD
' which is working.
The var dump shows:
array(9) { ["NOM"]=> array(0) { } ["NOM_NAISSANCE"]=> array(0) { } ["PRENOM"]=> array(0) { } ["DDN"]=> array(0) { } ["SEXE"]=> array(0) { } ["NIP"]=> array(0) { } ["ACTE"]=> array(0) { } ["NOM_OPERATEUR"]=> array(0) { } ["PRENOM_OPERATEUR"]=> array(0) { } }
I surely miss something but I can't find it. Any ideas?
EDIT:
So I tested if the problem was with the accents, but this request:
SELECT PENSOINS.EJ_SRV.NOM from PENSOINS.EJ_SRV WHERE PENSOINS.EJ_SRV.NOM LIKE 'Dié%'
worked fine (even if it's displayed with é in the browser afterward).
I changed this part:
AND substr(PENSOINS.ACTE_RDV.HORAIRE, 1, 8) = '".$date_next."'
GROUP BY
PATIENT_SOIGNE.NOM,
PATIENT_SOIGNE.PATRONYME,
PATIENT_SOIGNE.PRENOM,
to_date(PATIENT_SOIGNE.DATENAIS,'YYYYMMDD'),
multiple times, using some to_char, trunc, to_date but nothing worked.
Concerning the dates, I was able to make this statement:
SELECT PENSOINS.ACTE_RDV.HORAIRE from PENSOINS.ACTE_RDV WHERE substr(PENSOINS.ACTE_RDV.HORAIRE, 1, 8) = :date_test_bv
worked. Here :date_test_bv
is a binding variable of a string like 20140415
So now I'm back at
AND RDV_SRV.CODE||' - '||RDV_SRV.NOM IN ( '07 - Diététique','08 - Endocrinologie','18 - Oncologie','19 - Ophtalmologie','24 - Pneumologie','30 - Rhumatologie','34 - Orthophonie','40 - Consultations externes','42 - Stomatologie','43 - HOPITAL DE JOUR MEDECINE','44 - Hématologie','20 - ORL','CE 02 - Anesthésie','CE 03 - Cardiologie','CE 04 - Chirurgie Orthopédique','CE 06 - Chirurgie Urologique','CE 07 - Chirurgie Viscérale','CE 08 - Hépato-gastro-entérologie','CE 09 - Chirurgie Plastique','CE 10 - Gériatrie','CE 11 - Gynécologie-Obstétrique','CE 12 - Médecine interne','CE 14 - Pédiatrie','CE 15 - Tabacologie','CE 16 - Chirurgie Vasculaire','16 - Néphrologie' )
AND substr(PENSOINS.ACTE_RDV.HORAIRE, 1, 8) = :date_bv
GROUP BY
PATIENT_SOIGNE.NOM,
PATIENT_SOIGNE.PATRONYME,
PATIENT_SOIGNE.PRENOM,
to_date(PATIENT_SOIGNE.DATENAIS,'YYYYMMDD'),
decode(PATIENT_SOIGNE.SEXE,'F','Femme','M','Homme','Inconnu'),
PATIENT_SOIGNE.NIP,
S_ACTE_MED.CODEP1 || ' - ' || ( S_ACTE_MED.LIBELLE ),
OPERATEUR.NOM,
OPERATEUR.PRENOM
Knowing that the binded string date produces a successful result and that using the accents is not a problem.
I have 0 error messages, nor from PHP or Oracle, just empty rows like the var dump I showed earlier.
At that point I really don't understand where the problem could be.
Implicit date conversion is responsible for most queries that work differently in different clients. Date formats default to the NLS_DATE_FORMAT
value set at the system level, but many clients will override that value by setting the parameter at the session level.
Specifically, these two expressions could have problems:
substr(PENSOINS.ACTE_RDV.HORAIRE, 1, 8) = '".$date_next."
...
to_date(PATIENT_SOIGNE.DATENAIS,'YYYYMMDD')
Many people solve these problems by forcing all clients to change their settings, but a better permanent solution is always specify the desired format, or to avoid date conversion entirely. Assuming those two columns are date values, it would be safer to rewrite the expressions to this:
substr(to_char(PENSOINS.ACTE_RDV.HORAIRE, 1, 8), 'YYYYMMDD') = '".$date_next."'
...
trunc(PATIENT_SOIGNE.DATENAIS)
(I'm not sure how PHP works, there may be a better way to pass in the $date_next
as a date instead of a string.)
Another wild guess is that the non-ASCII strings are causing problems somewhere:
RDV_SRV.CODE||' - '||RDV_SRV.NOM IN ( '07 - Diététique', ...
Take a look at the output from select sql_fulltext from gv$sql where lower(sql_fulltext) like '%07 - Di%;
to ensure that the query is getting passed to Oracle correctly. If some file or process doesn't support non-ASCII characters, then you may need to store the Unicode strings like this:
RDV_SRV.CODE||' - '||RDV_SRV.NOM IN ( '07 - Di'||unistr('\00E9')|'t'||unistr('\00E9')||'tique', ...
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.