[英]Writing an IF EXISTS Query in an Oracle Function
我希望能夠有一種簡單的方法來檢查查詢是否返回任何內容,以嘗試在輸入記錄之前查看記錄是否存在。
因此,在MS-SQL中,我將執行以下操作:
IF NOT EXISTS (SELECT * FROM MYTABLE WHERE MYCOLUMN = 'THISVALUE')
BEGIN
//Insert field
END
簡單。
這在Oracle中不起作用,我發現最好的替代方法是更冗長的:
SELECT COUNT(*) INTO TEMPVAR
FROM MYTABLE
WHERE MYCOLUMN = ‘THISVALUE’
IF TEMPVAR = 0
BEGIN
//Insert field
END
所以我想把它放到一個函數中,這樣我可以做:
IF myPackage.Exists(SELECT * FROM MYTABLE WHERE MYCOLUMN = 'THISVALUE')
BEGIN
//Insert field
END
但是這里就是我被困住的地方。 當查詢必須是通用查詢時,如何在case語句中執行查詢? 我正在立即執行,但沒有運氣。
CASE
WHEN (EXECUTE IMMEDIATE queryString)
THEN 1
ELSE 0
END AS MYVAR
(然后返回該var)。
您可以將變量EXECUTE IMMEDIATE INTO
並在條件語句中使用它。
下面的示例使一個函數的輸入為SELECT COUNT(*)
類型的查詢字符串,並且如果計數> 0,則輸出為TRUE
。
首先創建一個測試表:
CREATE TABLE MYTABLE(X NUMBER);
INSERT INTO MYTABLE VALUES (1);
然后創建包:
CREATE PACKAGE MYPACKAGE AS
FUNCTION DOES_IT_EXIST(QUERY_STRING IN VARCHAR2) RETURN BOOLEAN;
END MYPACKAGE;
/
CREATE PACKAGE BODY MYPACKAGE AS
FUNCTION DOES_IT_EXIST(QUERY_STRING IN VARCHAR2) RETURN BOOLEAN
IS
V_ITEM_COUNT NUMBER;
BEGIN
EXECUTE IMMEDIATE QUERY_STRING INTO V_ITEM_COUNT;
RETURN (V_ITEM_COUNT > 0);
END;
END MYPACKAGE;
/
然后測試一下:
BEGIN
IF (MYPACKAGE.DOES_IT_EXIST('SELECT COUNT(*) FROM MYTABLE WHERE X = 1'))
THEN
DBMS_OUTPUT.PUT_LINE('1 EXISTS');
ELSE
DBMS_OUTPUT.PUT_LINE('1 does not exist');
END IF;
CASE WHEN (MYPACKAGE.DOES_IT_EXIST('SELECT COUNT(*) FROM MYTABLE WHERE X = 99'))
THEN
DBMS_OUTPUT.PUT_LINE('99 EXISTS');
ELSE
DBMS_OUTPUT.PUT_LINE('99 does not exist');
END CASE;
END;
/
1 EXISTS
99 does not exist
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.