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;