我编写了一个 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
Run Code Online (Sandbox Code Playgroud)
脚本是:
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;
Run Code Online (Sandbox Code Playgroud)
表名是 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;
/
Run Code Online (Sandbox Code Playgroud)