我希望能够有一种简单的方法来检查查询是否返回任何内容,以便在我输入之前查看记录是否存在。
所以在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)。
答案 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