Oracle-10g

在 FOR 循環中引用 PL/SQL 變數

  • March 25, 2011

我編寫了一個 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;
/

引用自:https://dba.stackexchange.com/questions/1907