我有两个表Table1和dTable2,它们具有相同的列。我需要检查特定的ID是否在其中之一中,并从任何一个表返回数据行。 我有以下PL / SQL代码:
v_result Table1%ROWTYPE;
BEGIN
SELECT a.*
INTO v_result
FROM Table1 a
WHERE a.id = 123;
if v_result.count =0 then
SELECT b.*
INTO v_result
FROM Table2 b
WHERE b.id = 123;
end if;
EXCEPTION
WHEN NO_DATA_FOUND THEN -- when record not found
SELECT b.*
INTO v_result
FROM Table2 b
WHERE b.id = 123;
END;
问题在于不会引发异常,因此v_result不返回任何数据。如何检查v_result的行数?
对于游标,我可以使用ROWCOUNT,但v_result不是游标。
我也尝试使用count属性,但是它出错了。
我将代码更改为:
component 'count' must be declared
出现错误k
我在做什么错了?
答案 0 :(得分:1)
在记录变量中只能使用一行。如果要存储和计数多行,则可以定义一组记录,并使用BULK COLLECT INTO
一次加载所有记录,而不会引发NO_DATA_FOUND
。 count
函数可用于集合。
DECLARE
TYPE type_tab1 IS TABLE OF Table1%ROWTYPE;
TYPE type_tab2 IS TABLE OF Table2%ROWTYPE;
v_result1 type_tab1;
v_result2 type_tab2;
BEGIN
SELECT a.*
BULK COLLECT INTO v_result1
FROM Table1 a
WHERE a.id = 123;
if v_result1.count = 0 then
SELECT b.* BULK COLLECT
INTO v_result2
FROM Table2 b
WHERE b.id = 123;
end if;
DBMS_OUTPUT.PUT_LINE('v_result1 ='|| v_result1.count);
DBMS_OUTPUT.PUT_LINE('v_result2 ='|| v_result2.count);
END;
/
的输出
v_result1 =0
v_result2 =1
如果您只是想检查一行是否存在,那么一种更简单有效的方法是使用EXISTS
SELECT
CASE WHEN
EXISTS (
SELECT 1
FROM table1
WHERE id = 123
) THEN 1
ELSE 0
END
INTO v_count
FROM dual;
IF v_count = 0
THEN
..
..