PLSQL:在if语句错误PLS-00405中使用子查询

时间:2018-09-15 16:05:10

标签: sql oracle if-statement plsql syntax-error

尝试运行此代码时出现错误pls-00405:

MATCH (p:person{username:'abc.com'})-[hc:HAS_RELATION]->(pp:person{username:'xyz.com'}) 
    MERGE (con:ContactInfo{Id:hc.ContactInfoId})
    ON MATCH SET con.Updated=timestamp(),hc.ContactInfoId=ID(con) 
    ON CREATE SET con:PersonContact,con.Created =timestamp(),con.Id=ID(con),hc.ContactInfoId=ID(con) 
    WITH con

对此有一些类似的问题,但找不到此简单代码的解决方案。有没有另一种写方法而不会遇到错误?

4 个答案:

答案 0 :(得分:2)

PL / SQL不支持if语句中的嵌入式SQL。因此,您需要像这样重写代码:

create or replace function validate_kaart_code 
    (P10_KAART_CODE in CADEAUKAART.KAART_CODE%type)
    return boolean
is
    rv boolean;
    l_code CADEAUKAART.KAART_CODE%type;
BEGIN
    begin
        SELECT KAART_CODE into l_code
        FROM CADEAUKAART
        where KAART_CODE =:P10_KAART_CODE 
        and rownum = 1 -- only necessary if KAART_CODE is not unique
        ;
        rv := TRUE;
    exception
        when no_data_found then
            rv := FALSE;
    end;
    RETURN rv;
END;

我试图从您发布的代码段中重建您的全部功能。如果这不是您想要的,并且您无法根据需要进行转换,请提供更多详细信息。

答案 1 :(得分:1)

我将条件移至查询本身,并捕获到NO_DATA_FOUND异常:

BEGIN
    SELECT * FROM CADEAUKAART WHERE kaart_code = :P10_KAART_CODE;
    RETURN TRUE;
EXCEPTION  WHEN NO_DATA_FOUND THEN
    RETURN FALSE;
END;

答案 2 :(得分:1)

另一种方式:

CREATE OR REPLACE FUNCTION IS_KAART_CODE_VALID(pinKAART_CODE IN CADEAUKAART.KAART_CODE%TYPE)
   RETURN BOOLEAN
IS
  nCount  NUMBER;
BEGIN
  SELECT COUNT(*)
    INTO nCount
    FROM CADEAUKAART
    WHERE KAART_CODE = pinKAART_CODE ;

  RETURN CASE
           WHEN nCount > 0 THEN
             TRUE
           ELSE
             FALSE
         END;
END IS_KAART_CODE_VALID;

答案 3 :(得分:0)

您可以尝试使用光标,或者:

DECLARE
  v_flag  boolean := FALSE;  
BEGIN
 FOR c IN ( SELECT KAART_CODE FROM CADEAUKAART )
 LOOP
   IF :P10_KAART_CODE = c.KAART_CODE THEN
     v_flag := TRUE;
     EXIT;
   END IF;
  EXIT WHEN NO_DATA_FOUND;
 END LOOP;
     RETURN v_flag;
END;

不允许使用select语句,您可以列出KAART_CODE返回值的所有成员,例如

IF :P10_KAART_CODE IN ('aAA','BBb','ccC'..) THEN

但不是最好的方法,它很容易列出所有匹配的值。