这里有一些伪代码来解释我要做的事情:
CREATE OR REPLACE PROCEDURE sproc
(
v_input IN VARCHAR2 DEFAULT NULL
, refCursor OUT SYS_REFCURSOR
)
AS
CASE v_input
WHEN 'A' THEN
OPEN refCursor FOR
SELECT ... FROM ...;
WHEN 'B' OR 'C'
OPEN refCursor FOR
SELECT ... FROM ...;
END CASE;
END sproc;
我怎样才能做到这一点'什么时候' B'或者' C'条款?
答案 0 :(得分:3)
您只能使用该语法为每个when
使用一个条件。但是,如果在when
中包含条件变量,则可以指定更多值:
CASE
WHEN v_input = 'A' THEN
OPEN refCursor FOR
SELECT ... FROM ...;
WHEN v_input IN ('B','C')
OPEN refCursor FOR
SELECT ... FROM ...;
END CASE;
在简单的case语句和搜索的case语句之间的区别(由xQbert指出)在SQL-92(或更高版本)标准中指定。虽然可以通过足够的工作找到实际的推理,但我猜想是这样的:
我认为这是关于一致性:SQL中的其他地方,像or
和and
这样的布尔运算符需要完整的比较,例如x = 1 or y = 2
。布尔运算符永远不能严格用于操作数,例如x = (1 or 3)
。在简单的语法语法中,比较被分解,这迫使选择:它们可以1)仅支持相等(不in
,<>
,<
等;没有布尔值运算符)或2)为运算符提出一种特殊的语法,只适用于简单的case语句(并且可能提出“简单”以外的命名法)。
答案 1 :(得分:2)
您可以使用IF
和IN
声明
create or replace procedure sproc(
v_input in varchar2 default null ,
refcursor out sys_refcursor )
as
begin
if v_input = 'A' then
open refcursor for select ... from ...;
elsif v_input in ('B','C') then
open refcursor for select ... from ...;
end if;
end sproc;
/