У меня есть хранимая процедура, в которой я объединяю два запроса для получения результатов. Но я получаю эту ошибку:
Ошибка (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;
@marc_s: За исключением двух столбцов, остальные 3 в первом операторе выбора создаются вручную и недоступны во втором операторе выбора. Как мы можем его обновить?
Если у вас на самом деле нет данных для возврата из второго оператора, вам нужно будет вернуть некоторые совместимые с типами данных литералы (и, возможно, просто NULL
) из второго оператора, чтобы получить такое же количество столбцов.
ок, можешь помочь мне с примером?
Ошибка связана с тем, что order by
находится в первой ветви союза. Этого не может быть. Вы заказываете объединенный набор результатов union
, а не отдельные ветки и используете столбцы, включенные в набор результатов (т. е. req_id
, а не job_progress_id
). Но тогда вам также нужно добавить пять столбцов во вторую ветку, что может быть просто ,null,null,null,null,null
, хотя вам может понадобиться пустышка req_id
, чтобы вы могли упорядочить ее.
Как уже отмечалось, оба (фактически все) объединенные выборки должны иметь соответствующий список столбцов (как по числу, так и по типу данных).
В вашем случае это будет что-то вроде
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 - ты рассматриваешь rj_span_id
как строку, так почему ты тогда делаешь to_char()
для этого? Есть ли в ваших колонках nvarchar2
вместо varchar2
? Если нет, то, возможно, проверьте, совпадают ли наборы символов в удаленной и локальной БД - хотя я думаю, что это будет прозрачно переведено.
спасибо, понял, нужно использовать TO_CHAR
во втором операторе выбора
привет, пожалуйста, помогите с этим. это почти то же самое stackoverflow.com/questions/78554195/…
Если вы хотите объединить два набора результатов запроса с помощью
UNION ALL
, они должны возвращать одинаковое количество столбцов и с одним и тем же типом данных для каждого столбца.