日期:2014-05-17  浏览次数:20943 次

帮忙解释一下这个游标定义的意思
CURSOR C1 IS
SELECT 'ANALYZE TABLE ' ||u.table_name||' COMPUTE STATISTICS ' FROM User_Tables u WHERE u.table_name IN (……);

BEGIN
OPEN c1;
FETCH c1 INTO v_sql;
WHILE c1%FOUND
LOOP
EXECUTE IMMEDIATE v_sql;
FETCH c1 INTO v_sql;
END LOOP;
CLOSE c1;

----------------------------------------
如果我把定义游标的那一句单独拿出来执行,即:select analyze table u.table_name compute statistics from user_tables u where u.table_name= 'TABLENAME';
则会报错,它怎么可以在pl/sql中执行呢?貌似这样的写法也是不对的吧?

------解决方案--------------------
你拿出来的引号呢? 被你“吃”了么?
这个过程的目的是,拼接 sql,然后动态执行 EXECUTE IMMEDIATE v_sql;


仔细想想。
------解决方案--------------------
SQL code

ANALYZE TABLE table_name COMPUTE STATISTICS;
--这句话是手动分析表,获得分析信息,但是数据库中有很多个表,如果手动写就得为每个表都写一个sql,
--而每个sql只有表名不同,因此为了一次性获得语句,可以利用user_tables 这个视图中的 table_name字段
--把sql都拼出来,这就是游标的作用

--然后在下面动态执行拼出来的sql。
--你拿出来的sql 不对
select 'analyze table '|| u.table_name ||' compute statistics' from user_tables u where u.table_name= 'TABLENAME'

------解决方案--------------------
把IS后面的select语句整个拿出来(包括引号),那该语句是可执行的。
游标的作用是为了访问查询结果集中的多条记录。
------解决方案--------------------
探讨
也就是说有些pl/sql块中的动态语句是可以自己先“拼装”出来执行看下,有些则不行?

------解决方案--------------------
to forgetsam:
还是有点不明白。
看你的意思是说游标里已经拼好了,用到它时就直接是ANALYZE TABLE tb1 COMPUTE STATISTICS
就像最普通的:
cursor cur_stu is
select stuno,stuname from student order by stuno;
当用到cur_stu时实际就只剩下学号跟姓名了。
但我不明白的是像游标定义里的一般也都是可以直接先拿出来执行的啊,就像可以把
select stuno,stuname from student order by stuno这句拿出来一样。
---对,你说了,直接,所以,你别给人家解析

还有select 'ABC' from dual 这个很好理解,但是现在这个游标里定义的并不是from dual表啊,如果它是select 'ANALYZE TABLE tb1 COMPUTE STATISTICS' from dual,那就不能实现分析多个表了

---别想偏了,什么叫多?你现在还没看懂一,

select 'ANALYZE TABLE tb1 COMPUTE STATISTICS' from dual 那就不能实现分析多个表了

--很好,你现在接近了
select 'ANALYZE TABLE tb1 COMPUTE STATISTICS' from user_tables 是不是能分析多次表了?

select 'ANALYZE TABLE '||table_name||' COMPUTE STATISTICS' from user_tables
知道什么意思了吧