Oracle存储过程 - CASE v_Variable WHEN' value'或者'价值'然后

时间:2017-01-25 18:46:30

标签: oracle stored-procedures

这里有一些伪代码来解释我要做的事情:

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'条款?

2 个答案:

答案 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中的其他地方,像orand这样的布尔运算符需要完整的比较,例如x = 1 or y = 2。布尔运算符永远不能严格用于操作数,例如x = (1 or 3)。在简单的语法语法中,比较被分解,这迫使选择:它们可以1)仅支持相等(不in<><等;没有布尔值运算符)或2)为运算符提出一种特殊的语法,只适用于简单的case语句(并且可能提出“简单”以外的命名法)。

答案 1 :(得分:2)

您可以使用IFIN声明

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;
/