簡體   English   中英

在Oracle函數中編寫IF EXISTS查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM