对每张表的记录数,做一下统计,排排序,这么个脚本,其实涉及到PL/SQL的两样很基本的东西,比如 :
1.DYNAMIC SQL的使用语法;
2.SINGLE QUATION MARK的使用;
/*
select table_name
from user_tables
*/
set serveroutput on ;
declare
cursor tabCursor is (select table_name from user_tables) ;
tabName varchar2(200) ;
nRows number(9) ;
tmpSQL varchar2(2000) ;
begin
for very_row in tabCursor
loop
tabName := very_row.table_name ;
tmpSQL := ' insert into tabrows( table_name ) values( '''
||tabName||''') ' ;
Execute Immediate tmpSQL ;
tmpSQL := ' SELECT COUNT(*) AS RS from '||tabName ;
Execute Immediate tmpSQL INTO nRows ;
-- dbms_output.put_line ('nRows : ' || to_char(nRows) ) ;
tmpSQL := ' update tabRows set nrows= :nRS where table_name= :cTab ';
Execute Immediate tmpSQL using nRows,tabName ;
end loop ;
commit ;
end ;
个人理解:
1. EXECUTE IMMEDIATE使用有三种参数模式:
1.1 EXECUTE IMMEDIATE INTO variable ,带出单条SQL COMMAND的执行结果;而不使用SQL里嵌入INTO语句;
1.2 EXECUTE IMMEDIATE RETURING INTO variable ,带出SQL COMMAND有RETURNING子句的结果;
1.3 EXECUTE IMMEDIATE USING bindVariables: 将绑定参数的值带进SQL COMMAND中执行;
具体的解释,我参考了PL/SQL USER GUIDE AND REFERENCE中DYNAMIC SQL的用法,看来ORACLE的文档确实要常看,知道你可以很清楚的知道你要的东西在哪个CATALOG中;
2. SINGLE QUOTATION MARK的使用:
单引号用来引用变量值,也可以用来转义,当一条语句开头就是‘ 时候,你在该语句中还要引用单引号,必须将单引号转义出来,用法:''表示一个转义的单引号;
补充: for very_row in tabCursor,这条语句隐式的打开了游标;