关于DDL的动态sql语句问题,请高手帮忙了!

yhb72 2005-04-30 01:33:21
通过一个游标获取所有失效package名字,然而通过pl/sql脚本写的alter pakcage语句中不识别变量,想通过动态sql语句实现alter package p_name compile.其中p_name是cursor中所有失效package名字,做一个循环嵌入。但是研究了一个晚上发现DDL的动态sql中好像也必须使用明文常量,不能使用变量,不知道是否如此?请高手赐教,能给些实例脚本最好,先谢过了!
...全文
154 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhb72 2005-05-01
  • 打赏
  • 举报
回复
搞定了,犯了一个小错误,sql后面跟了一个“;”。结贴了。
LGQDUCKY 2005-04-30
  • 打赏
  • 举报
回复
根据你的情况!!看看我写的过程你参考下

DECLARE
T_OWNER VARCHAR2(10);
T_OBJECT_NAME VARCHAR2(30);
T_OBJECT_TYPE VARCHAR2(20);
C_SQL NUMBER;
S_SQL VARCHAR2(500);
RET NUMBER;
v_n int;
CURSOR C_CONS IS
SELECT OWNER,OBJECT_NAME,OBJECT_TYPE
FROM ALL_OBJECTS
WHERE STATUS ='INVALID' AND OBJECT_TYPE<>'TABLE' and (owner not in ('SYS','SYSTEM'))
order by owner,object_type,object_name;
BEGIN
/*注意运行3次编译,因第一次编译又可能先后排序导致其他函数失效*/
for v_n in 1..3 loop
C_SQL := DBMS_SQL.OPEN_CURSOR;
OPEN C_CONS;
LOOP
BEGIN
FETCH C_CONS INTO T_OWNER,T_OBJECT_NAME,T_OBJECT_TYPE;
EXIT WHEN C_CONS%NOTFOUND;
IF T_OBJECT_TYPE = 'PACKAGE BODY' THEN
S_SQL :='ALTER PACKAGE '||T_OWNER||'.'||T_OBJECT_NAME||' COMPILE BODY';
else
S_SQL :='ALTER '||T_OBJECT_TYPE||' '||T_OWNER||'.'||T_OBJECT_NAME||' COMPILE';
END IF;
dbms_output.put_line('正在进行第'||to_char(v_n)||'次编译:'||s_sql||' ...');
DBMS_SQL.PARSE( C_SQL, S_SQL, DBMS_SQL.v7 ) ;
ret := DBMS_SQL.EXECUTE( C_SQL ) ;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END LOOP;
CLOSE C_CONS;
DBMS_SQL.CLOSE_CURSOR(C_SQL);
end loop;
END;
/
dinya2003 2005-04-30
  • 打赏
  • 举报
回复
你在过程中定义一个变量,然后将查询到的失效的包名使用游标.循环传递给变量使用.

关于动态SQL的用法,可以看这里>

http://blog.csdn.net/dinya2003/archive/2004/11/30/198820.aspx
yhb72 2005-04-30
  • 打赏
  • 举报
回复
谢谢楼上的两位兄弟!

to LGQDUCKY(飘):我用你的脚本跑了一下,但是好像关键的:
DBMS_SQL.PARSE( C_SQL, S_SQL, DBMS_SQL.v7 ) ;
RET := DBMS_SQL.EXECUTE( C_SQL ) ;
并没有执行啊?

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧