ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 371|回复: 29

[PL/SQL] 存储过程中执行存储过程

[复制链接]
论坛徽章:
1
优秀写手
日期:2014-07-09 06:00:13
发表于 2017-1-11 14:12 | 显示全部楼层 |阅读模式
存储过程中动态生成的语句,通过execute immediate执行但提示“无效SQL语句”,但语句拿出来执行又正常的。

这是生成的SQL:
exec dbms_stats.gather_table_stats(ownname => 'TEST',tabname => 'NIVW',estimate_percent => 20,cascade => TRUE,force => TRUE);
论坛徽章:
122
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2017-1-11 14:20 | 显示全部楼层
你动态是如何写的?

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
472
版主9段
日期:2013-12-30 02:21:032014年新春福章
日期:2014-03-07 12:43:10马上有车
日期:2014-03-27 15:59:39马上有车
日期:2014-04-08 17:57:38技术图书徽章
日期:2014-04-21 10:26:402014年世界杯参赛球队: 伊朗
日期:2014-05-23 10:41:312014年世界杯参赛球队: 比利时
日期:2014-06-17 12:09:43itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-09-29 01:14:14马上加薪
日期:2014-02-19 11:55:14
发表于 2017-1-11 14:23 | 显示全部楼层
去掉exec就行了

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-07-09 06:00:13
 楼主| 发表于 2017-1-11 14:24 | 显示全部楼层

  1.   cursor cur_gather_tab_statistics is
  2.      select 'exec dbms_stats.gather_table_stats(ownname => ''' || owner || ''',tabname => ''' || segment_name ||
  3.        ''',estimate_percent => 20,cascade => TRUE,force => TRUE);'
  4.        from dba_segments
  5.        where segment_type = 'TABLE'
  6.        and owner in ('TEST');

  7.   open cur_gather_tab_statistics;
  8.   fetch cur_gather_tab_statistics into vSqlStatement;
  9.   while cur_gather_tab_statistics%found
  10.     loop
  11.       execute immediate vSqlStatement;
  12.       fetch cur_gather_tab_statistics into vSqlStatement;
  13.     end loop;
  14.   close cur_gather_tab_statistics;
复制代码

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
472
版主9段
日期:2013-12-30 02:21:032014年新春福章
日期:2014-03-07 12:43:10马上有车
日期:2014-03-27 15:59:39马上有车
日期:2014-04-08 17:57:38技术图书徽章
日期:2014-04-21 10:26:402014年世界杯参赛球队: 伊朗
日期:2014-05-23 10:41:312014年世界杯参赛球队: 比利时
日期:2014-06-17 12:09:43itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-09-29 01:14:14马上加薪
日期:2014-02-19 11:55:14
发表于 2017-1-11 14:30 | 显示全部楼层
  1. cursor cur_gather_tab_statistics is
  2.      select 'dbms_stats.gather_table_stats(ownname => ''' || owner || ''',tabname => ''' || segment_name ||
  3.        ''',estimate_percent => 20,cascade => TRUE,force => TRUE);'
  4.        from dba_segments
  5.        where segment_type = 'TABLE'
  6.        and owner in ('TEST');

  7.   open cur_gather_tab_statistics;
  8.   fetch cur_gather_tab_statistics into vSqlStatement;
  9.   while cur_gather_tab_statistics%found
  10.     loop
  11.       execute immediate vSqlStatement;
  12.       fetch cur_gather_tab_statistics into vSqlStatement;
  13.     end loop;
  14.   close cur_gather_tab_statistics;
复制代码



try this

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-07-09 06:00:13
 楼主| 发表于 2017-1-11 14:34 | 显示全部楼层

去除 exec 也是一样的错误

使用道具 举报

回复
论坛徽章:
122
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2017-1-11 14:39 | 显示全部楼层



这样的需求用静态即可, 不要随便用动态, 除非用该方法是唯一的方法

begin
    for rec in (select owner, segment_name from dba_segments where segment_type = 'TABLE' and owner in ('TEST')) loop
   
        dbms_stats.gather_table_stats(ownname => rec.owner,tabname => rec.segment_name,estimate_percent => 20,cascade => TRUE,force => TRUE);
   
    end loop;
end;



使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
472
版主9段
日期:2013-12-30 02:21:032014年新春福章
日期:2014-03-07 12:43:10马上有车
日期:2014-03-27 15:59:39马上有车
日期:2014-04-08 17:57:38技术图书徽章
日期:2014-04-21 10:26:402014年世界杯参赛球队: 伊朗
日期:2014-05-23 10:41:312014年世界杯参赛球队: 比利时
日期:2014-06-17 12:09:43itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-09-29 01:14:14马上加薪
日期:2014-02-19 11:55:14
发表于 2017-1-11 14:43 | 显示全部楼层
aniven 发表于 2017-1-11 14:34
去除 exec 也是一样的错误

错误是啥?
不过看7楼的吧,我们自己写代码也是7楼那样就行

查了下文档,The EXECUTE IMMEDIATE statement is the means by which native dynamic SQL processes most dynamic SQL statements.

说明只能针对SQL使用,而不能针对PL/SQL使用

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-07-09 06:00:13
 楼主| 发表于 2017-1-11 14:53 | 显示全部楼层
本帖最后由 aniven 于 2017-1-11 14:56 编辑

SQL> exec proc_oraperf;
begin proc_oraperf; end;
ORA-00900: 无效 SQL 语句
ORA-06512: 在 "SYS.PROC_ORAPERF", line 34
ORA-06512: 在 line 1

这个过程是专业的数据维护公司DBA写的,说定期整理数据,今天才发现根本没执行成功过... 前面一段的语句中也是因为 execute immediate 后面的语句中有分号(;)导致执行失败。
我想假如非要用这种方式写,该怎么改?貌似在SQL中调用过程应该用 call,但是 call 的话不知道怎么填过程dbms_stats.gather_table_stats参数,因为这个过程很多参数有些是默认值可以不赋值


oracle这点真是让人有点懵B,过程可以用 call 又可以用 exec,还可以加 BEGIN ... END,有的时候要加分号;不然语句等于没结束。有的时候加分号报错(比如 execute immediate 'alter table ....'),有的时候还可以加斜杠 /,有没有文章推荐看看?

使用道具 举报

回复
论坛徽章:
23
ITPUB官方微博粉丝徽章
日期:2011-08-17 10:35:362012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:312013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:42:022015年新春福章
日期:2015-03-06 11:57:312016猴年福章
日期:2016-02-23 09:58:342016猴年福章
日期:2016-02-18 09:31:30
发表于 2017-1-11 15:21 | 显示全部楼层
是不是没有权限执行dbms_stats这个包啊,我记得存储过程中调用一些ORACLE内置的包需要给一些对应的执行权限才可以

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

2017中国数据库技术大会,只等你来!

2017第八届中国数据库技术大会于2017年5月11-13日如约而至。本届大会以“数据驱动•价值发现”为主题,汇集来自互联网、电子商务、金融、电信、政府、行业协会等20多个领域的120多位技术专家,共同探讨Oracle、MySQL、NoSQL、云端数据库、智能数据平台、区块链、数据可视化、深度学习等领域的前瞻性热点话题与技术。
----------------------------------------
新年特惠 !6.5折专享购票开启中,只等你来。
截止时间:2017-2.16

购票入口>>
TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表