Oracle clob php

Итак, я получаю эту ошибку, когда пытаюсь выполнить следующий код

ociexecute(): ORA-00932: inconsistent datatypes: expected - got CLOB 


$where_clause = "A.sent_newsletter='N' AND
                     A.validated='Y' AND
                     (TRUNC(A.date_validity_to) >= TRUNC(SYSDATE) OR A.date_validity_to IS NULL) AND
                     (TRUNC(A.date_validity_from) <= TRUNC(SYSDATE) OR A.date_validity_from IS NULL) AND
                     A.id_category=21 AND
                     A.id_category=B.id_category AND
                       B.id_type=C.id_type AND
                       C.id_subscription=".OCIResult($stmt_users, "ID_SUBSCRIPTION")." AND
                       C.id_type=D.id_type AND
                     E.id_news=A.id_news AND";

    $stmt_news = OCIParse($conn, "SELECT *
                                  FROM (
                                    SELECT A.id_news,
                                           A.id_category,
                                           A.lang,
                                           A.title,
                                           A.subtitle,
                                           TO_CHAR(A.date_creation, 'DD/MM/YYYY') AS DATE_CREATION,
                                           D.description,
                                           E.text
                                    FROM ".$db_schema_name."news_header A,
                                           ".$db_schema_name."newsletter_typecat_profile B,
                                           ".$db_schema_name."newsletter_subtyp_profile C,
                                           ".$db_schema_name."newsletter_type D,
                                         ".$db_schema_name."news_paragraph E
                                    WHERE ".$where_clause."
                                          A.lang='".OCIResult($stmt_users, "LANG")."'
                                    UNION
                                    SELECT A.id_news,
                                           A.id_category,
                                           A.lang,
                                           A.title,
                                           A.subtitle,
                                           TO_CHAR(A.date_creation, 'DD/MM/YYYY') AS DATE_CREATION,
                                           D.description,
                                           E.text
                                    FROM ".$db_schema_name."news_header A,
                                           ".$db_schema_name."newsletter_typecat_profile B,
                                           ".$db_schema_name."newsletter_subtyp_profile C,
                                           ".$db_schema_name."newsletter_type D,
                                         ".$db_schema_name."news_paragraph E
                                    WHERE ".$where_clause."
                                          A.lang='".$default_language."' AND
                                          A.id_news NOT IN (SELECT A.id_news
                                                            FROM ".$db_schema_name."news_header A,
                                                                   ".$db_schema_name."newsletter_typecat_profile B,
                                                                   ".$db_schema_name."newsletter_subtyp_profile C,
                                                                   ".$db_schema_name."newsletter_type D,
                                                                 ".$db_schema_name."news_paragraph E
                                                            WHERE ".$where_clause."
                                                                  A.lang='".OCIResult($stmt_users, "LANG")."')
                                  ) ORDER BY id_category, id_news DESC");

E.text - это клочок, и я хочу запомнить его, а затем отобразить. Есть идеи, почему? Код работает отлично, если я удалю таблицу E. Но теперь я хочу отображать также абзацы из новостей, и для этого мне нужно поле ТЕКСТ.

while(OCIFetch($stmt_news) && (OCIFetchInto($stmt_news, $fields,OCI_ASSOC))) {
  $paragraph_text = $fields['TEXT']->load();
  $id_newsletter_collection[$id_newsletter_collection_index++] = OCIResult($stmt_news, "ID_NEWS");
  $newsletter_item[$newsletter_item_index++] = New newsletter_item(OCIResult($stmt_news, "ID_NEWS"),
                                                                   OCIResult($stmt_news, "LANG"),
                                                                   OCIResult($stmt_news, "TITLE"),
                                                                   OCIResult($stmt_news, "SUBTITLE"),
                                                                   OCIResult($stmt_news, "DATE_CREATION"),
                                                                   $paragraph_text,


                                            $sentence_local[OCIResult($stmt_news, "DESCRIPTION")][OCIResult($stmt_users, "LANG")]);
} /* end while */

person Farcas Alexandru    schedule 10.04.2017    source источник


Ответы (2)


Вы не можете использовать DISTINCT с типами данных clob, UNION подразумевает Distinct, поэтому вы можете заменить его на UNION ALL. . Это решит проблему, но, возможно, вам нужно переписать запрос (зависит от необходимых вам данных).

person Leo    schedule 10.04.2017

@Лео уже ответил "ПОЧЕМУ". У вас есть больше вариантов, чем union all:

Во-первых, использовать dbms_lob.substr(e.text) вместо e.text в списке выбора.

select a.id_news, dbms_lob.substr(e.text)
  from a join e on e.id_news = a.id_news
  where <condition1>
union 
select a.id_news, dbms_lob.substr(e.text)
  from a join e on e.id_news = a.id_news
  where <condition2>

Во-вторых, измените union, объединив ваши предложения where с or:

select a.id_news, e.text
  from a 
  join e on e.id_news = a.id_news
  where <condition1>
     or <condition2>

Второй не полностью эквивалентен вашему исходному запросу, он не удаляет дубликаты, если они есть, но проверьте, подходит ли он.

В обоих случаях вы должны переписать части from и where, используя joins.

person Ponder Stibbons    schedule 10.04.2017