尝试运行此代码时出现错误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
对此有一些类似的问题,但找不到此简单代码的解决方案。有没有另一种写方法而不会遇到错误?
答案 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
但不是最好的方法,它很容易列出所有匹配的值。