Хранимая процедура Oracle не выполняется и выдает ошибку

У меня есть хранимая процедура, в которой я объединяю два запроса для получения результатов. Но я получаю эту ошибку:

Ошибка (331,2): PL/SQL: ORA-00933: команда SQL завершилась неправильно.

Это запрос:

SELECT 
    jb.span_id,
    jb.maintenancezonecode,
    jbp.job_progress_id AS req_id,
    jb.reofferflag,
    modified_by AS last_update_by,
    sm.status_name,
    TO_DATE(SYSDATE) - TO_DATE(jbp.ums_group_ass_to_date) AS pending_days
FROM   
    tbl_fiber_inv_jobs jb
INNER JOIN
    tbl_fiber_inv_job_progress jbp ON jb.job_id = jbp.job_id
INNER JOIN
    tbl_fiber_inv_status_master sm ON jbp.status_id = sm.status_id
WHERE  
    jb.maintenancezonecode = pmaintzonecode
    AND ums_group_ass_to_name = pusertype
    AND jb.span_type = pspantype
    AND jbp.job_progress_flag = 1
ORDER BY 
    jbp.job_progress_id DESC

UNION ALL
  
SELECT
    TO_CHAR(TRIM(rj_span_id)) AS SPAN_ID, 
    TO_CHAR(RJ_MAINTENANCE_ZONE_CODE) AS MAINT_ZONE_CODE
FROM 
    NE.MV_SPAN@ne
WHERE
    LENGTH(TRIM(rj_span_id)) = 21
    AND Regexp_like (TRIM(rj_span_id),
                     'SP(N|Q|R|S).*+_(AC|BN|BS|DN|DP|ID|LA|MS|MT|MU|OG|OL|PG|RC|RG|RT|VF|VT|YH)$', 'i')
    AND NOT Regexp_like (Nvl (rj_intracity_link_id, '-'), '_(9)', 'i')
    AND inventory_status_code = 'IPL'
    AND rj_maintenance_zone_code = pmaintzonecode;

Если вы хотите объединить два набора результатов запроса с помощью UNION ALL , они должны возвращать одинаковое количество столбцов и с одним и тем же типом данных для каждого столбца.

marc_s 22.05.2024 08:30

@marc_s: За исключением двух столбцов, остальные 3 в первом операторе выбора создаются вручную и недоступны во втором операторе выбора. Как мы можем его обновить?

hud 22.05.2024 08:35

Если у вас на самом деле нет данных для возврата из второго оператора, вам нужно будет вернуть некоторые совместимые с типами данных литералы (и, возможно, просто NULL) из второго оператора, чтобы получить такое же количество столбцов.

marc_s 22.05.2024 08:39

ок, можешь помочь мне с примером?

hud 22.05.2024 08:58

Ошибка связана с тем, что order by находится в первой ветви союза. Этого не может быть. Вы заказываете объединенный набор результатов union, а не отдельные ветки и используете столбцы, включенные в набор результатов (т. е. req_id, а не job_progress_id). Но тогда вам также нужно добавить пять столбцов во вторую ветку, что может быть просто ,null,null,null,null,null, хотя вам может понадобиться пустышка req_id, чтобы вы могли упорядочить ее.

Alex Poole 22.05.2024 09:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как уже отмечалось, оба (фактически все) объединенные выборки должны иметь соответствующий список столбцов (как по числу, так и по типу данных).

В вашем случае это будет что-то вроде

SELECT jb.span_id,
       jb.maintenancezonecode,
       jbp.job_progress_id AS req_id,
       jb.reofferflag,
       modified_by AS last_update_by,
       sm.status_name,
       TO_DATE (SYSDATE) - TO_DATE (jbp.ums_group_ass_to_date) AS pending_days
  FROM tbl_fiber_inv_jobs  jb
       INNER JOIN tbl_fiber_inv_job_progress jbp ON jb.job_id = jbp.job_id
       INNER JOIN tbl_fiber_inv_status_master sm ON jbp.status_id = sm.status_id
 WHERE     jb.maintenancezonecode = pmaintzonecode
       AND ums_group_ass_to_name = pusertype
       AND jb.span_type = pspantype
       AND jbp.job_progress_flag = 1
-- ORDER BY jbp.job_progress_id DESC
UNION ALL
SELECT TO_CHAR (TRIM (rj_span_id)) AS SPAN_ID,
       TO_CHAR (RJ_MAINTENANCE_ZONE_CODE) AS MAINT_ZONE_CODE,
       NULL AS req_id,
       NULL AS reofferflag,
       NULL AS last_update_by,
       NULL AS status_name,
       NULL AS pending_Days
  FROM NE.MV_SPAN@ne
 WHERE     LENGTH (TRIM (rj_span_id)) = 21
       AND REGEXP_LIKE (
              TRIM (rj_span_id),
              'SP(N|Q|R|S).*+_(AC|BN|BS|DN|DP|ID|LA|MS|MT|MU|OG|OL|PG|RC|RG|RT|VF|VT|YH)$',
              'i')
       AND NOT REGEXP_LIKE (NVL (rj_intracity_link_id, '-'), '_(9)', 'i')
       AND inventory_status_code = 'IPL'
       AND rj_maintenance_zone_code = pmaintzonecode
ORDER BY 3;

Обратите внимание, что вам также необходимо удалить order by из первого запроса (я закомментировал его) и применить сортировку ко всему набору результатов в конце оператора.

получаю ошибку как ORA-12704: character set mismatch

hud 22.05.2024 09:13

Запрос, который я опубликовал, совпадает по количеству столбцов. Я не знаю типов данных (поскольку у меня нет ваших таблиц), поэтому - вы проверяли, совпадают ли они? Если нет, сделайте это.

Littlefoot 22.05.2024 09:23

даже после сохранения двух столбцов я получаю ту же ошибку... почему? теперь на этот раз тип данных тоже тот же.

hud 22.05.2024 11:07

@hud - ты рассматриваешь rj_span_id как строку, так почему ты тогда делаешь to_char() для этого? Есть ли в ваших колонках nvarchar2 вместо varchar2? Если нет, то, возможно, проверьте, совпадают ли наборы символов в удаленной и локальной БД - хотя я думаю, что это будет прозрачно переведено.

Alex Poole 22.05.2024 11:13

спасибо, понял, нужно использовать TO_CHAR во втором операторе выбора

hud 22.05.2024 12:06

привет, пожалуйста, помогите с этим. это почти то же самое stackoverflow.com/questions/78554195/…

hud 30.05.2024 15:18

Другие вопросы по теме

Как использовать оператор IF и локальные переменные в хранимых процедурах
Не удалось найти хранимую процедуру при вызове с веб-сайта C#
Проблема ответа протокола TDS SQL Server при вызове хранимой процедуры
Процедура Mysql выполняется несколько раз
Удаление данных из дочерних таблиц с помощью хранимой процедуры
Неизвестная системная переменная при вызове процедуры в SingleStore
Проблема с группировкой и ранжированием: на основе показанной таблицы скрипт или хранимая процедура должны возвращать рейтинг на основе предоставленных правил
Лучшая стратегия pl/sql для возврата одной выходной строки объединенного списка внутри списка
Как вызвать хранимую процедуру в Entity Framework Core 7.0, которая возвращает набор результатов, который не является реальной таблицей в базе данных?
Хранимая процедура Snowflake JavaScript возвращает успех, несмотря на ожидаемый сбой