CodeIgniter Oracle select - случайная ошибка - PullRequest
0 голосов
/ 08 сентября 2011

У меня очень странная проблема с довольно простым оператором select. Вот оно:

Я читаю CSV-файл (это экспорт из файла Excel). Разделитель поля - ";" и каждое поле заключено в "".

Я использую второе, третье и пятое поля для создания SELECT для поиска этой информации в БД. Другими словами, я ищу людей в таблице по их фамилии и имени, а также по электронной почте. Например:

SELECT MAX(n_id_persona) AS n_id_persona 
FROM (
    SELECT DISTINCT MAX(p.n_id_persona) AS n_id_persona
    FROM PERSONAS p
    WHERE (NO_ACCENTS(p.d_apellidos) LIKE NO_ACCENTS('%Lastname%') 
        AND NO_ACCENTS(p.d_nombres) LIKE NO_ACCENTS('%Firstname%'))
    UNION
    SELECT DISTINCT MAX(p.n_id_persona) AS n_id_persona
    FROM PERSONAS p
    LEFT JOIN CORREOS c ON (p.n_id_persona = c.n_id_persona)
    WHERE ((c.c_correo LIKE '%email@host.com%')) );

Проблема в том, что в случайном порядке CodeIgniter не приносит никакого N_ID_PERSONA, но если я тестирую тот же запрос в Oracle SQL Developer, он получает и идентификатор.

Сначала я подумал, что это был тайм-аут, но от него отказались. Кроме того, переформулировали запросы, потому что я думал, что они не были правильными, но нет. Функция NO_ACCENTS () просто заменяет все акцентированные символы соответствующей буквой и записывает все в верхнем регистре. Я также попытался без использования этой функции NO_ACCENTS () и получил тот же странный результат.

Есть идеи? Это с кем-нибудь случается?

Большое спасибо!

V * * 1016

/////////////////////////////////////////////// ////////////////////////////

Вот это код:

Контроллеры / importador.php

public function __construct()
{
    parent::__construct();
    $this->output->enable_profiler(TRUE);
    session_start();
}

public function index()
{
    //Connection info to the DB

    $_SESSION['c'] = $connection_info;

    $this->db = $this->load->database($_SESSION['c'], TRUE, TRUE);
    $this->load->model('Importador_model');

    //Reads the csv
    $this->load->library('csvreader');

    $filePath = '/home/vcl/Desktop/CRM/File_name.csv';

    $data['csvData'] = $this->csvreader->parse_file($filePath);

    foreach($data['csvData'] as $linea){

        $data['coincidencia'] = $this->Importador_model->Buscar_contacto(str_replace('\'', '\'\'', $linea['Apellido']), str_replace('\'', '\'\'', $linea['Nombre']), $linea['Email']);  

        echo $linea['Apellido'].' '.$linea['Nombre'].''.$linea['Entrevista'].'<br>';
        $temp = $data['coincidencia']->row();
        echo $temp->N_ID_PERSONA;
        echo '<br>';
    }
}

модель / importador_model.php

function Buscar_contacto($ape = NULL, $nom = NULL, $email = NULL) 
{
$CI =& get_instance();

$query = $CI->db->query('SELECT MAX(n_id_persona) AS n_id_persona 
             FROM (
                SELECT DISTINCT MAX(p.n_id_persona) AS n_id_persona
                FROM PERSONAS p
                WHERE (NO_ACCENTS(p.d_apellidos) LIKE NO_ACCENTS(\'%'.$ape.'%\') 
                    AND NO_ACCENTS(p.d_nombres) LIKE NO_ACCENTS(\'%'.$nom.'%\'))
                UNION
                SELECT DISTINCT MAX(p.n_id_persona) AS n_id_persona
                FROM PERSONAS p
                LEFT JOIN CORREOS c ON (p.n_id_persona = c.n_id_persona)
                WHERE ((c.c_correo LIKE \'%'.$email.'%\')) )');

return $query;
}

Помогает ли это немного больше?

1 Ответ

0 голосов
/ 10 ноября 2015

Вы можете использовать функцию «обрезки», иногда вы можете иметь пробелы между условиями тестирования, попробуйте что-то вроде этого:

SELECT ...

WHERE TRIM((NO_ACCENTS(p.d_apellidos)) LIKE TRIM(NO_ACCENTS('%Lastname%')) 
    AND TRIM(NO_ACCENTS(p.d_nombres)) LIKE TRIM(NO_ACCENTS('%Firstname%')))

обратите внимание, что у менядобавили обрезку в поле таблицы (p.d_apelidos) и сделали то же самое в (no_accents ('% Lastname%'))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...