oracle - 我怎样才能正确处理这个存储程序?
问题描述
我有一列nosologico
可以有这个值 ps_1111 或 amb_1111 或 11111。我想捕获这个值。ps:一次执行的noslogico可以有多个值。我不知道我们是否需要在那里做一个额外的条件??所以我做了这个存储过程,但我不知道如何说 noslogico 是否有 %ps% 并在第一个条件等情况下进行。
create or replace PROCEDURE G_TICKETS_Test(USERIDRICHIEDENTEP IN VARCHAR2, result_cursor OUT SYS_REFCURSOR)
IS
rc SYS_REFCURSOR;
BEGIN
OPEN rc FOR SELECT NOSOLOGICO from TICKET_NOTIFICE
if (NOSOLOGICO= NOSOLOGICO like %PS%) then
OPEN rc FOR SELECT DISTINCT t.ID, a.NOME, a.COGNOME, t.OPERAZIONE
FROM TICKET_NOTIFICE t, ANAGRAFICA a ,PS_METADATA M
WHERE t.USERIDRICHIEDENTE=USERIDRICHIEDENTEP and t.stato = '1' AND t.NOTIFICATION='0' AND t.NOSOLOGICO=M.EPISODIOPSNUM AND M.IDANAGRAFICA=a.ID ;
elsif (NOSOLOGICO= NOSOLOGICO like %AMB%) then
OPEN rc FOR SELECT DISTINCT t.ID, a.NOME, a.COGNOME, t.OPERAZIONE
FROM TICKET_NOTIFICE t, ANAGRAFICA a ,AMB_IMPEGNATIVE B,AMB_METADATA M
WHERE t.USERIDRICHIEDENTE=USERIDRICHIEDENTEP and t.stato = '1' AND t.NOTIFICATION='0' AND REGEXP_SUBSTR (T.NOSOLOGICO, '[^AMB_]+$', 1, 1)=C.ID_AMB_METADATI AND C.ID_AMB_METADATI=D.ID_AMB_METADATI AND D.IDASSISTITO=a.IDASSISTITO;
else
OPEN rc FOR SELECT DISTINCT t.ID, a.NOME, a.COGNOME, t.OPERAZIONE
FROM TICKET_NOTIFICE t, RICOVERO r, ANAGRAFICA a
WHERE t.USERIDRICHIEDENTE=USERIDRICHIEDENTEP and t.stato = '1' AND t.NOTIFICATION='0' AND t.NOSOLOGICO=r.NOSOLOGICO AND r.IDANAGRAFICA=a.ID ;
END IF;
result_cursor := rc;
END;
解决方案
我相信您有一些条件可以返回单行NOSOLOGICO
from TICKET_NOTIFICE
。如果是这种情况,您可以使用标量变量并使用IF
条件。
与往常一样,我建议您使用显式JOIN
语法而不是
,
连接语法。
CREATE OR replace PROCEDURE g_tickets_test (useridrichiedentep IN VARCHAR2,
result_cursor OUT SYS_REFCURSOR
)
IS
v_nosologico ticket_notifice.nosologico%TYPE;
BEGIN
SELECT nosologico
INTO v_nosologico
FROM ticket_notifice n
WHERE n.useridrichiedente = useridrichiedentep ;
IF ( v_nosologico LIKE '%PS%' ) THEN
OPEN result_cursor FOR
SELECT DISTINCT t.id,
a.nome,
a.cognome,
t.operazione
FROM ticket_notifice t,
anagrafica a,
ps_metadata m
WHERE t.useridrichiedente = useridrichiedentep
AND t.stato = '1'
AND t.notification = '0'
AND t.nosologico = m.episodiopsnum
AND m.idanagrafica = a.id;
ELSIF ( v_nosologico LIKE '%AMB%' ) THEN
OPEN result_cursor FOR
SELECT DISTINCT t.id,
a.nome,
a.cognome,
t.operazione
FROM ticket_notifice t,
anagrafica a,
amb_impegnative b,
amb_metadata m
WHERE t.useridrichiedente = useridrichiedentep
AND t.stato = '1'
AND t.notification = '0'
AND regexp_substr(t.nosologico, '[^AMB_]+$', 1, 1) =
c.id_amb_metadati
AND c .id_amb_metadati = d.id_amb_metadati
AND d.idassistito = a.idassistito;
ELSE
OPEN result_cursor FOR
SELECT DISTINCT t.id,
a.nome,
a.cognome,
t.operazione
FROM ticket_notifice t,
ricovero r,
anagrafica a
WHERE t.useridrichiedente = useridrichiedentep
AND t.stato = '1'
AND t.notification = '0'
AND regexp_substr(t.nosologico, '[^PS_]+$', 1, 1) = r.nosologico
AND r.idanagrafica = a.id;
END IF;
END;
/
推荐阅读
- java - 静态内部类可以扩展其外部类吗?
- spring-boot - 使用 jdbc 模板在 api 中关闭连接
- twitter-bootstrap - 使用引导程序内联两个元素
- javascript - 需要视频在按键时静音/取消静音(无按钮)
- ruby-on-rails-5 - Has_many :通过使用 3 个模型的关联
- environment-variables - 使用 CLion,如何为 cmake 构建设置环境变量?
- vuetify.js - 使用 VueCLI 3 编译手写笔
- python-3.x - 使用 spacy 生成文本特征会消耗太多时间
- php - 如何滚动到硒中的特定元素?
- java - 为什么我的可运行接口循环我的队列在这里继续