在Oracle函数中编写IF EXISTS查询

时间:2017-04-20 18:33:49

标签: oracle plsql

我希望能够有一种简单的方法来检查查询是否返回任何内容,以便在我输入之前查看记录是否存在。

所以在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语句中执行查询?我正在使用EXECUTE IMMEDIATE但没有运气。

CASE
WHEN (EXECUTE IMMEDIATE queryString)
THEN 1
ELSE 0
END AS MYVAR

(然后返回该var)。

1 个答案:

答案 0 :(得分:1)

您可以EXECUTE IMMEDIATE INTO变量并在条件语句中使用它。

下面的示例是一个函数,其输入是SELECT COUNT(*)类型的查询字符串,如果计数是>则输出为TRUE。 0.

首先创建一个测试表:

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