codememo

커서에서 행 수를 찾는 방법

tipmemo 2023. 7. 22. 10:05
반응형

커서에서 행 수를 찾는 방법

커서의 행 수를 찾고 싶습니다.도움이 될 만한 키워드가 있습니까?사용.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

반응형