2016-08-09 11 views
0

SQL文から返される行数を数えようとしています。この文はpl/sqlのカーソルから行数をカウントする

私のコードは、この

DECLARE 

v_counter int := 0 ; 

select count(*) into v_counter from (
cursor get_sth is select * from table1 where condit..) ; 


BEGIN 

DBMS_OUTPUT.PUT_LINE (v_counter); 


END ; 
/

のようなものですカーソルであり、それは私がカーソル結果の行数をカウントする任意の他の解決策はあり

動作しません、私は

感謝ヘルパー

+2

なぜ条件を直接満たすテーブル内の行を数えていないのですか?なぜサブクエリ/カーソルが試行されるのですか? (また、「うまくいきません」というのは役に立たない;あなたが得たエラーや間違った結果を含めてください)。 –

答えて

2

をフェッチする必要がある場合それはに基づいている、あなたはその結果をループカウントを取得することができます:

set serveroutput on 
declare 
    v_counter pls_integer := 0; 
    cursor get_sth is select * from all_tables where owner = user; -- your query 
begin 
    for sth in get_sth loop 
    v_counter := v_counter + 1; 
    end loop; 
    dbms_output.put_line (v_counter); 
end; 
/

カーソルループがないこれ、それらをフェッチすることなく、結果セットの行数をカウントすることはできません。 (@ MarcinWroblewskiは、明示的なフェッチを使って別の方法を示しています)。どちらの方法でも、カーソルはプロセスによって消費されます。 の後に返されたデータを何か処理する場合は、を数えた後に、再度実行してカーソルを再フェッチする必要があります。

1

程度のnoob本当によ
DECLARE 
    v_counter INT := 0; 
BEGIN 
    SELECT COUNT(*) INTO v_counter FROM table1 WHERE condit..; 
    dbms_output.put_line(v_counter); 
END; 
/

あなたはすでにカーソルを持っており、ちょうどそれが返すレコードの数を知りたい、あなたの目的は、既存のカーソル定義を再利用し、クエリを繰り返す必要がないことであるならば、あなたはそれらをすべて

DECLARE 
    CURSOR get_sth IS 
      SELECT * FROM table1 WHERE condit..; 
    sth  get_sth%ROWTYPE; 
    v_counter NUMBER; 
BEGIN 
    OPEN get_sth; 
    LOOP 
      FETCH get_sth 
       INTO sth; 
      EXIT WHEN get_sth%NOTFOUND; 
    END LOOP; 
    v_counter := get_sth%ROWCOUNT; 
    dbms_output.put_line(v_counter); 
    CLOSE get_sth; 
END; 
/
+0

それは動作しますが、上記のコードを実装せずにカーソルから行数を取得することでコードを最適化しようとしています – networker

+0

@networker - '最適化する'という意味はどうですか?同じクエリを2回実行して、既存のカーソル宣言を再利用したいのですか?これがあなたの問題を本当に解決しない場合は、あなたがしようとしていることを説明するために質問を編集することが役に立ちます。 (あなたがティを受け入れたにもかかわらず、そう...) –

関連する問題