游标选择语句 其中条件根据条件更改



我在过程中使用游标,这里我没有使用批量收集,因为我对从游标获取的记录进行了大量计算。

在光标的选择语句中,子句根据条件变化,我正在尝试使用下面的代码,但它给了我错误:

错误(19,12(: PLS-00103: 预期出现以下情况之一时遇到符号"c_recs":= 。( @ % ;

create or replace PROCEDURE        "test" 
(fromdate_in               IN varchar2,
todate_in               IN varchar2,
atype_in                IN number
)
is
begin
if atype_in = 01 then  
cursor c_recs IS SELECT cname FROM A_AUD AA WHERE AA.atime BETWEEN to_date( '' || fromdate_in || '' ,'DD/MM/RRRR')
AND to_date('' || todate_in || '','DD/MM/RRRR') AND AA.CTYPE IN ('RAlert');
elsif  atype_in = 02
cursor c_auditrecs IS  SELECT cname FROM A_AUD AA WHERE AA.atime BETWEEN to_date( '' || fromdate_in || '' ,'DD/MM/RRRR')
AND to_date('' || todate_in || '','DD/MM/RRRR') AND AA.CTYPE IN ('DAlert');
end if;
end

begin
--more logic
FOR rec IN c_recs LOOP
---calculations
END LOOP;
END test;

我不想从网络使用SYS_REFCURSOR,我读到游标比参考游标略好。

更好和有效的选择是在没有任何 CURSOR 的单个语句中执行此操作。但是,这确实取决于您要做什么。如果必须基于游标记录执行 dmls,最好在单个语句中执行。

如果你确实想在循环中处理某些东西,请使用隐式游标循环,它等效于显式游标(有时性能更好(。

选择查询也可以使用条件逻辑而不是 IF/ELSE 来简化。

CREATE OR REPLACE PROCEDURE "test" (
fromdate_in   IN VARCHAR2,
todate_in     IN VARCHAR2,
atype_in
in NUMBER
) is begin 
for cur in (
SELECT cname
FROM a_aud aa
WHERE aa.time BETWEEN TO_DATE(fromdate_in,'dd/mm/rrrr') 
AND TO_DATE(todate_in,'dd/mm/rrrr') AND (
(
atype_in = '01' AND aa.ctype = 'RAlert'
) OR (
atype_in = '02' AND aa.ctype = 'DAlert'
)
)
) loop
---calculations
do_something_with(cur.cname)
end loop;
end;  
/

我还建议您将参数类型作为日期,并直接从调用块传递变量,而不是在 sql/cursor 中转换它们。这将避免TO_DATE转换。

游标声明中的CASE解决了这个问题:

DECLARE
CURSOR c_recs
IS
SELECT cname
FROM a_aud aa
WHERE     aa.time BETWEEN TO_DATE (fromdate_in, 'dd/mm/rrrr')
AND TO_DATE (todate_in, 'dd/mm/rrrr')
AND aa.ctype =
CASE
WHEN atype_in = '01' THEN 'RAlert'
WHEN atype_in = '02' THEN 'DAlert'
END;
BEGIN
FOR rec IN c_recs
LOOP
NULL;
END LOOP;
END;

我无法评论您的拒绝声明。

最新更新