Oracle IF语句包含SELECT语句

Oracle IF语句包含SELECT语句,oracle,plsql,Oracle,Plsql,运行此操作时: create or replace FUNCTION GET_FUNCTION(STATUS_ID IN VARCHAR2) RETURN VARCHAR2 IS STATUS_NAME VARCHAR2(255); BEGIN IF NVL(STATUS_ID) THEN STATUS_NAME:=''; ELSIF STATUS_ID LIKE '0' THEN STATUS_NAM

运行此操作时:

    create or replace FUNCTION GET_FUNCTION(STATUS_ID IN VARCHAR2) 
    RETURN VARCHAR2
    IS STATUS_NAME VARCHAR2(255);
    BEGIN 
    IF NVL(STATUS_ID) THEN
          STATUS_NAME:='';
    ELSIF  STATUS_ID LIKE '0' THEN
          STATUS_NAME:='UNASSIGNED'
    ELSE
          SELECT TABLE_A.NAME INTO STATUS_NAME FROM TABLE_A where
    TABLE_A.ID=STATUS_ID;
    END IF;

    RETURN(STATUS_NAME);
    end;
我得到以下错误:

Error(9,4): PLS-00103: Encountered the symbol "ELSE" when expecting one of the following:     
* & = - + ; < / > at in is mod remainder not rem    <an exponent (**)> <> or != or ~= >= <= <> and or like like2    like4 likec between || multiset member submultiset 
The symbol ";" was substituted for "ELSE" to continue. 
错误(9,4):PLS-00103:在预期以下情况之一时遇到符号“ELSE”:

* & = - + ; < / > at in是mod余数而不是rem或!=或者~=>=您需要在每个要执行的语句后添加分号(代码中的第8行-我添加了注释):


我认为这是一个更好的选择

CREATE OR REPLACE FUNCTION GET_FUNCTION(STATUS_ID IN VARCHAR2) 
RETURN VARCHAR2
IS 
  cursor c_tab (B_STATUS_ID IN TABLE_A.ID%TYPE)
  is
  SELECT TABLE_A.NAME 
  FROM TABLE_A 
  WHERE TABLE_A.ID = B_STATUS_ID;

  STATUS_NAME VARCHAR2(255);
BEGIN 
IF NVL(STATUS_ID, -1) = -1 THEN
-- IF STATUS_ID IS NULL THEN  ==> This one is also possible!
      STATUS_NAME := '';
ELSIF STATUS_ID = '0' THEN
      STATUS_NAME := 'UNASSIGNED';
ELSE
      OPEN C_TAB (STATUS_ID);
      FETCH C_TAB INTO STATUS_NAME;
      CLOSE C_TAB;
END IF;

RETURN STATUS_NAME;
END;

您可以对此使用
CASEWHEN
。不相关,但是:
STATUS\u ID像“0”
没有意义。这与
STATUS\u ID='0'
我是sql新手,请告诉我当在Google上搜索“oracle sql case when”太难时,如何处理case?正如@wieseman指出的,您当前的错误是您没有;(分号)在分配给
ELSIF
中的
STATUS\u NAME
之后,就在
ELSE
之前。一旦修复,您将收到另一条语法错误消息,关于
NVL()
;该函数需要两个参数,而您只给了它一个参数。如果STATUS\u ID为NULL,您的意思可能是
?而且,
STATUS\u ID如'0'
STATUS\u ID='0'
相同(但效率较低)。这个函数应该做什么?
create or replace FUNCTION GET_FUNCTION(STATUS_ID IN VARCHAR2) 
RETURN VARCHAR2
IS STATUS_NAME VARCHAR2(255);
BEGIN 
IF NVL(STATUS_ID) THEN
      STATUS_NAME:='';
ELSIF  STATUS_ID LIKE '0' THEN
      STATUS_NAME:='UNASSIGNED'; /* HERE HAS TO BE A SEMICOLON TOO */
ELSE
      SELECT TABLE_A.NAME INTO STATUS_NAME FROM TABLE_A where
TABLE_A.ID=STATUS_ID;
END IF;

RETURN(STATUS_NAME);
end;
CREATE OR REPLACE FUNCTION GET_FUNCTION(STATUS_ID IN VARCHAR2) 
RETURN VARCHAR2
IS 
  cursor c_tab (B_STATUS_ID IN TABLE_A.ID%TYPE)
  is
  SELECT TABLE_A.NAME 
  FROM TABLE_A 
  WHERE TABLE_A.ID = B_STATUS_ID;

  STATUS_NAME VARCHAR2(255);
BEGIN 
IF NVL(STATUS_ID, -1) = -1 THEN
-- IF STATUS_ID IS NULL THEN  ==> This one is also possible!
      STATUS_NAME := '';
ELSIF STATUS_ID = '0' THEN
      STATUS_NAME := 'UNASSIGNED';
ELSE
      OPEN C_TAB (STATUS_ID);
      FETCH C_TAB INTO STATUS_NAME;
      CLOSE C_TAB;
END IF;

RETURN STATUS_NAME;
END;