カーソルの行数を知りたいのですが。役立つキーワードはありますか? COUNT
を使用して、クエリを作成する必要があります。どんな助けでも大歓迎です。
カーソルの%ROWCOUNT
属性を使用できます。
例えば:
DECLARE
CURSOR lcCursor IS
SELECT *
FROM DUAL;
BEGIN
OPEN lcCursor ;
DBMS_OUTPUT.PUT_LINE(lcCursor%ROWCOUNT);
CLOSE lcCursor ;
END;
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を使用して、LOOPが不要になるようにすることもできます。
DECLARE
CURSOR c
IS SELECT *
FROM employee;
TYPE emp_tab IS TABLE OF employee%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;
/
次の単純な1行のコードを使用して、カーソル数を出力できます。
dbms_output.put_line(TO_CHAR(cur%rowcount));
ネットワーク経由でデータベースサーバーにアクセスするオーバーヘッドのために役立つ/必要になる可能性のある回避策があります(たとえば、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 ;
フェッチされた最初の行には、レコードの数が含まれます。フェッチされた特定の列を追加する必要があり(*の使用は機能しません)、フィルターを追加できます。
ここでは、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;
これはあなたのために働くはずです
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