Oracle 如何获取ROWTYPE变量中的行数
我有两个表Table1和DTTable2,它们有相同的列。我需要检查其中一个表中是否有特定的id,并从哪个表返回数据行。 我有以下PL/SQL代码:Oracle 如何获取ROWTYPE变量中的行数,oracle,plsql,Oracle,Plsql,我有两个表Table1和DTTable2,它们有相同的列。我需要检查其中一个表中是否有特定的id,并从哪个表返回数据行。 我有以下PL/SQL代码: v_result Table1%ROWTYPE; BEGIN SELECT a.* INTO v_result FROM Table1 a WHERE a.id = 123; EXCEPTION WHEN NO_DATA_FOUND THEN -- when reco
v_result Table1%ROWTYPE;
BEGIN
SELECT a.*
INTO v_result
FROM Table1 a
WHERE a.id = 123;
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_结果中的行数
对于游标,我可以使用ROWCOUNT,但v_结果不是游标
我还尝试使用count属性,但它出错了
我将代码更改为:
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;
并得到一个错误必须声明组件“count”
我做错了什么?记录变量中只能使用一行。如果要存储和计数多行,可以定义一个记录集合,并使用
批量收集到
一次加载所有记录,而不会引发未找到数据
。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;
/
输出为
如果您的目的是简单地检查一行是否存在,那么更简单有效的方法是使用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
..
..
您只能存储一行这样的变量。那么,如果没有引发异常,我如何确定是否不会返回任何内容?请检查我的答案,如果它对您有效,请接受/投票,这样也会帮助其他人寻找答案。请阅读:如果我使用我的原始代码,我怎么才能知道返回的那一行是空的?@CodingDuchess:这就是这个答案。你不明白哪一部分
如果v_result1.count=0,那么
就是这样做的,我不打算更改原始查询。在这种情况下,v_result.count给了我一个error@CodingDuchess:原始查询中没有任何更改,只是无法在记录变量中存储多行,因此我使用了一个集合来使用批量收集存储加载的数据。你的意思是你根本不能更改代码吗?那我们帮不了你什么忙。
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
..
..