커서에서 행 수를 찾는 방법
커서의 행 수를 찾고 싶습니다.도움이 될 만한 키워드가 있습니까?사용.COUNT우리는 질문을 써야 합니다.어떤 도움이라도 주시면 대단히 감사하겠습니다.
그cursor_variable.%ROWCOUNT그것이 해결책입니다.하지만 개봉 후 확인하시면 0이 됩니다.전체 행 수를 가져오려면 모든 레코드를 순환해야 합니다.아래의 예:
DECLARE
cur sys_refcursor;
cur_rec YOUR_TABLE%rowtype;
BEGIN
OPEN cur FOR
SELECT * FROM YOUR_TABLE;
dbms_output.put_line(cur%rowcount);--returning 0
LOOP
FETCH cur INTO cur_rec;
EXIT WHEN cur%notfound;
dbms_output.put_line(cur%rowcount);--will return row number beginning with 1
dbms_output.put_line(cur_rec.SOME_COLUMN);
END LOOP;
dbms_output.put_line('Total Rows: ' || cur%rowcount);--here you will get total row count
END;
/
커서를 열고 모든 행을 가져와 카운트해야 합니다.다른 건 안 될 거예요
또한 BULK COLLECT를 사용하여 루프가 필요하지 않도록 할 수 있습니다.
DECLARE
CURSOR c
IS SELECT *
FROM employee;
TYPE emp_tab IS TABLE OF c%ROWTYPE INDEX BY BINARY_INTEGER;
v_emp_tab emp_tab;
BEGIN
OPEN c;
FETCH c BULK COLLECT INTO v_emp_tab;
DBMS_OUTPUT.PUT_LINE(v_emp_tab.COUNT);
CLOSE c;
END;
/
편집: 변경된 직원 %행 유형 - c% 행 유형
다음과 같은 간단한 단일 라인 코드를 사용하여 커서 수를 인쇄할 수 있습니다.
dbms_output.put_line(TO_CHAR(cur%rowcount));
이것은 당신에게 효과가 있을 것입니다.
DECLARE
CURSOR get_data_ IS
SELECT *
FROM table_abc_
WHERE owner = user_; -- your query
counter_ NUMBER:= 0;
BEGIN
FOR data_ IN get_data_ LOOP
counter_ := counter_ + 1;
END LOOP;
dbms_output.put_line (counter_);
END;
DECLARE @STRVALUE NVARCHAR(MAX),
@CREATEDDATE DATETIME,
@STANTANCEVALUE NVARCHAR(MAX),
@COUNT INT=0,
@JOBCODE NVARCHAR(50)='JOB00123654',
@DATE DATETIME=GETDATE(),
@NAME NVARCHAR(50)='Ramkumar',
@JOBID INT;
CREATE TABLE #TempContentSplitValue (ITEMS NVARCHAR(200))
SELECT @JOBID = i.Id FROM JobHeader_TBL i WHERE Id=1201;
IF EXISTS (SELECT 1 FROM JobHeader_TBL WHERE Id=@JOBID)
BEGIN
SELECT @STRVALUE= Description from ContentTemplate_TBL where Id=1
INSERT INTO #TempContentSplitValue SELECT * FROM dbo.split(@STRVALUE, '_')
SET @STRVALUE=''
DECLARE db_contentcursor CURSOR FOR SELECT ITEMS FROM #TempContentSplitValue
OPEN db_contentcursor
FETCH NEXT FROM db_contentcursor
INTO @STANTANCEVALUE
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @STRVALUE += @STANTANCEVALUE + 'JOB00123654'
SET @COUNT += 1
SELECT @COUNT
FETCH NEXT FROM db_contentcursor INTO @STANTANCEVALUE
END
CLOSE db_contentcursor
DEALLOCATE db_contentcursor
DROP TABLE #TempContentSplitValue
SELECT @STRVALUE
END
여기서 저는 25세 이상의 총 고객 수를 계산하려고 합니다.먼저 결과를 커서에 저장합니다.그런 다음 함수 내부 또는 기본 시작 자체의 커서 크기를 계산합니다.
DECLARE
cname customer24.cust_name%type;
count1 integer :=0;
CURSOR MORETHAN is
SELECT cust_name
FROM customer24
where age>25;
BEGIN
OPEN MORETHAN;
LOOP
FETCH MORETHAN into cname;
count1:=count1+1;
EXIT WHEN MORETHAN%notfound;
END LOOP;
-- dbms_output.put_line(count1);
dbms_output.put_line(MORETHAN%ROWCOUNT);
CLOSE MORETHAN;
END;
네트워크를 통해 데이터베이스 서버에 액세스하는 오버헤드 때문에 유용하거나 필요할 수 있는 해결 방법이 있습니다(예: Ajax 호출 사용).
고려 사항:
CURSOR c_data IS
SELECT per_first_name , null my_person_count
FROM person
UNION
SELECT null as per_first_name , count( distinct per_id ) as my_person_count
FROM person
order by my_person_count ;
가져온 첫 번째 행에는 레코드 수가 있습니다.한 개는 가져온 특정 열을 추가해야 하며(*를 사용해도 작동하지 않음) 필터를 추가할 수 있습니다.
사용해 보십시오.
print(len(list(cursor)))
저는 항상 사람들이 결과를 반복해서 본다는 것을 읽습니다.카운트(*)를 사용하지 않는 이유는 무엇입니까?
내 생산 코드의 예:
PROCEDURE DeleteStuff___(paras_ IN Parameters_Type_Rec)
IS
CURSOR findEntries_ IS
select * from MyTable
where order_no = paras_.order_no;
counter_ NUMBER;
CURSOR findEntries_count_ IS
SELECT COUNT(*) from MyTable
where order_no = paras_.order_no;
BEGIN
OPEN findEntries_count_;
FETCH findEntries_count_ INTO counter_;
CLOSE findEntries_count_;
dbms_output.put_line('total records found: '||counter_);
IF (counter_ = 0) THEN
-- log and leave procedure
RETURN;
END IF;
FOR order_rec_ IN findEntries_ LOOP
EXIT WHEN findEntries_%NOTFOUND OR findEntries_%NOTFOUND IS NULL;
-- do stuff - i.e. delete a record.
API_Package.Delete(order_rec_);
END LOOP;
END DeleteStuff___;
만약 질문이 작다면, 그것이 제가 선호하는 방법입니다.이 예에서는 삭제할 항목의 수를 알고 기록하려고 합니다.
p.s. 세 개의 밑줄은 무시합니다.IFS에서 이것은 개인 절차 또는 기능을 원할 때 사용됩니다.
시작할 때 커서 수를 지정할 수 없습니다.이를 위해 전체 커서를 가져와야 합니다. 이것이 커서 카운트를 가져오는 방법입니다.
declare
cursor c2 is select * from dept;
var c2%rowtype;
i number :=0;
begin
open c2;
loop
fetch c2 into var;
exit when c2%NOTFOUND;
i: = i+1;
end loop;
close c2;
dbms_output.put_line('total records in cursor'||i);
end;
사용할 수 있습니다.%ROWCOUNT커서의 속성입니다.
예:
DECLARE
CURSOR lcCursor IS
SELECT *
FROM DUAL;
BEGIN
OPEN lcCursor ;
DBMS_OUTPUT.PUT_LINE(lcCursor%ROWCOUNT);
CLOSE lcCursor ;
END;
언급URL : https://stackoverflow.com/questions/4934134/how-to-find-number-of-rows-in-cursor
'codememo' 카테고리의 다른 글
| 밀도로 채색된 산점도를 만들려면 어떻게 해야 합니까? (0) | 2023.07.22 |
|---|---|
| django-rest-framework serializer를 사용하여 외부 키 값을 검색하는 중 (0) | 2023.07.22 |
| 반복을 사용하지 않고 배열 반전 (0) | 2023.07.22 |
| 장고에서 언제 새로운 앱(시작 앱 포함)을 만들 수 있습니까? (0) | 2023.07.22 |
| 데이터 볼륨을 사용하는 MariaDB Docker 컨테이너 - 오류 2002, 소켓을 통해 연결할 수 없음 (0) | 2023.07.22 |