今、あるオブジェクトが実際に使っているブロック数を調べるsqlを書いています。
まず、実際に割り当てられているブロック数を調べる。(結果は8とする)
SQL
1SELECT blocks FROM dba_segments WHERE owner='TERATAIL' 2AND segment_name='SAMPLE' AND segment_type='TABLE'
次に実際に使われているブロック数を調べる。(結果は4とする)
SQL
1SELECT count(*) FROM 2(SELECT DISTINCT dbms_rowid.rowid_relative_fno(ROWID) file_id, 3 dbms_rowid.rowid_object(ROWID) data_object, dbms_rowid.rowid_block_number(ROWID) block_nr 4 FROM TERATEIL.SAMPLE);
この場合、実際に使われているブロック数は4ですが、これを動的sqlを使って4という数字を得たいと考えています。
SQL
1set serveroutput on 2CREATE OR REPLACE PROCEDURE empty_blocks(p_owner VARCHAR2, p_table VARCHAR2) IS 3DECLARE 4 v_str VARCHAR2(2000); 5 v_blocks TERATEIL.SAMPLE.blocks%TYPE; 6 BEGIN 7 v_str := 'SELECT blocks FROM dba_segments WHERE owner= :x 8 AND segment_name= :y AND segment_type='TABLE''; 9 EXECUTE IMMEDIATE v_str INTO v_blocks USING p_owner, p_table; 10 dbms_output.put_line(v_blocks); 11EXCEPTION 12 WHEN OTHERS THEN dbms_output.put_line(sqlcode||' -- '||sqlerrm); 13END; 14/ 15execute empty_blocks('TERATAIL', 'SAMPLE'); 16
ひとまず、ここまではコードを書いたのですが、ここから先が全く思いつきません。何かアドバイスを宜しくお願いします。
PL/SQL
1set serveroutput on 2execute empty_blocks('TERATEIL', 'SAMPLE'); 3CREATE OR REPLACE PROCEDURE empty_blocks(p_owner VARCHAR2, p_table VARCHAR2) IS 4DECLARE 5 v_str VARCHAR2(2000); 6 v_num NUMBER; 7 v_block NUMBER; 8BEGIN 9 10 SELECT blocks into v_block FROM dba_segments WHERE owner= p_owner 11 AND segment_name = p_owner AND segment_type='TABLE'; 12 13 14 v_str := 'SELECT count(*) FROM' 15 ||' (SELECT DISTINCT dbms_rowid.rowid_relative_fno(ROWID) file_id,' 16 ||' dbms_rowid.rowid_object(ROWID) data_object, dbms_rowid.rowid_block_number(ROWID) block_nr FROM ' 17 || p_owner 18 || '.' 19 || p_table 20 || ')'; 21 22 EXECUTE IMMEDIATE v_str INTO v_num; 23 24 25 dbms_output.put_line(v_block - v_num); 26END; 27/
エラーメッセージ
PLS-00905: object TEST.EMPTY_BLOCKS is invalid
ORA-06550: 行1、列126:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
回答2件
あなたの回答
tips
プレビュー