Oracle-10g
在 FOR 循環中引用 PL/SQL 變數
我編寫了一個 PL/SQL 腳本來查找表中長列的大小。只是為了使腳本通用,我將表名和列名作為變數傳遞,但我收到一條錯誤消息,指出表或視圖不存在。詳情如下:
ORA-06550: line 8, column 34: PL/SQL: ORA-00942: table or view does not exist ORA-06550: line 8, column 11: PL/SQL: SQL Statement ignored ORA-06550: line 9, column 42: PLS-00364: loop index variable 'J' use is invalid ORA-06550: line 9, column 3: PL/SQL: Statement ignored
腳本是:
declare a number := 0; x number := 0; i number := 0; tablename varchar2(100):= 'FILES'; columnname varchar2(100):= 'FILESIZE'; begin for j in (select columnname from tablename) loop a:=UTL_RAW.LENGTH (UTL_RAW.CAST_TO_RAW(j.columnname)); i := i+1; dbms_output.put_line(i); x:= x + a; end loop; dbms_output.put_line(x); end;
表名是 FILES。列名是 FILESIZES。
你能建議我做錯了什麼嗎?我該怎麼做才能找到長列的大小?
謝謝。
您腳本中的錯誤是腳本現在需要一個名為 tablename 的表,其中包含一個名為 columnname 的列。在這種情況下,您不知道表名和列名,因此您應該使用動態 sql 來執行它。除此之外,如果可能的話,忘記 LONG 並實現 lobs。
有關文件,請參閱http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/dynamic.htm#i13057
範常式式碼稍作修改以滿足您的需求:
decLARE TYPE EmpCurTyp IS REF CURSOR; v_emp_cursor EmpCurTyp; v_stmt_str VARCHAR2(200); z long; x number := 0; a number; tablename varchar2(100):= 'dba_views'; columnname varchar2(100):= 'text'; BEGIN -- Dynamic SQL statement v_stmt_str := 'SELECT '||columnname||' from '||tablename; -- Open cursor OPEN v_emp_cursor FOR v_stmt_str; -- Fetch rows from result set one at a time: LOOP FETCH v_emp_cursor INTO z; EXIT WHEN v_emp_cursor%NOTFOUND; a:=UTL_RAW.LENGTH (UTL_RAW.CAST_TO_RAW(z)); x:= x+a; END LOOP; -- Close cursor: CLOSE v_emp_cursor; dbms_output.put_line (x); END; /