存储过程动态执行sql提示ORA-14552 在查询或 DML 中无法执行 DDL

RUA好多鱼~ 2016-08-03 04:29:39
项目中有个统计需要针对一个多行两列的查询结果进行计算 我这里是想用存储过程 把查询结果作为一个表 然后对这个表进行操作
但是在建立这个表的时候报了14552这个错 下面是我的存储过程
create or replace procedure MOVE_AVERAGE is
v_data number;
begin
select COUNT(*) into v_data from user_tables where table_name='DATA_TEMP';
IF v_data>0 THEN
execute immediate 'DROP TABLE DATA_TEMP';
END IF;
execute immediate 'create table DATA_TEMP as (select ROWNUM rn,X.Week,X.num+Y.num result from (SELECT A.week,count(B.patient) num FROM (select level week from dual connect by level<=52) A left join (SELECT e.patient_name patient,to_char(e.add_time,''iw'') week from cydes_epiinv_hfm e where (e.delete_status<>''1'' or e.delete_status is null) and e.add_time>=to_date((to_char(sysdate,''yyyy'')-2)||''-01-01'',''yyyy-MM-dd'') and e.add_time<=to_date((to_char(sysdate,''yyyy'')-2)||''-12-31'',''yyyy-MM-dd'')) B on A.Week=B.week group by A.week order by A.week) X,(SELECT A.week,count(B.patient) num FROM (select level week from dual connect by level<=52) A left join (SELECT e.patient_name patient,to_char(e.add_time,''iw'') week from cydes_epiinv_hfm e where (e.delete_status<>''1'' or e.delete_status is null) and e.add_time>=to_date(to_char(sysdate,''yyyy'')||''-01-01'',''yyyy-MM-dd'') and e.add_time<=to_date(to_char(sysdate,''yyyy'')||''-12-31'',''yyyy-MM-dd'')) B on A.Week=B.week group by A.week order by A.week) Y WHERE X.week=Y.week)';
end MOVE_AVERAGE;
因为这个统计只能用oracle来处理数据不能经过java后台所以 我通过一个函数来调用 函数下面这个:
create or replace function CAL_MOVE_AVERAGE return varchar2 is
begin
MOVE_AVERAGE();
return 'DATA_TEMP';
end CAL_MOVE_AVERAGE;
然后我调用函数SELECT CAL_MOVE_AVERAGE() FROM DUAL的时候就报了这个不能再查询或DML中执行DDL的错误
请问这个是怎么回事,对数据库这方面不太懂,以前都是用java来处理数据,请大神们指点,第一次发帖也不知道板块对不对
...全文
758 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
RUA好多鱼~ 2016-08-04
  • 打赏
  • 举报
回复
create or replace procedure MOVE_AVERAGE is begin execute immediate 'delete from DATA_TEMP'; commit; execute immediate 'insert into DATA_TEMP (select ROWNUM rn,X.Week,X.num+Y.num result from ( SELECT A.week,count(B.patient) num FROM ( select level week from dual connect by level<=52) A left join ( SELECT e.patient_name patient,to_char(e.add_time,''iw'') week from cydes_epiinv_hfm e where (e.delete_status<>''1'' or e.delete_status is null) and e.add_time>=to_date((to_char(sysdate,''yyyy'')-2)||''-01-01'',''yyyy-MM-dd'') and e.add_time<=to_date((to_char(sysdate,''yyyy'')-2)||''-12-31'',''yyyy-MM-dd'')) B on A.Week=B.week group by A.week order by A.week) X, ( SELECT A.week,count(B.patient) num FROM ( select level week from dual connect by level<=52) A left join ( SELECT e.patient_name patient,to_char(e.add_time,''iw'') week from cydes_epiinv_hfm e where (e.delete_status<>''1'' or e.delete_status is null) and e.add_time>=to_date(to_char(sysdate,''yyyy'')||''-01-01'',''yyyy-MM-dd'') and e.add_time<=to_date(to_char(sysdate,''yyyy'')||''-12-31'',''yyyy-MM-dd'')) B on A.Week=B.week group by A.week order by A.week) Y WHERE X.week=Y.week)'; commit; end MOVE_AVERAGE; 这个是修改后的存储过程,经过楼上大神的指点已经可以执行了,我的调用存储过程的方式不对,不应该作为一个函数去调用 这是调用方法 begin MOVE_AVERAGE; end; 第一次发帖,问了点小白的问题,感谢大神们的热心指点
RUA好多鱼~ 2016-08-04
  • 打赏
  • 举报
回复
关键是不能走后台,要直接在数据库中得到查询结果,我们现在是用一个叫人大金仓的平台做一个周报,周报里有一个统计表是这样的,但是那个平台是直连数据库的,不能走我们自己的后台,所以没办法,走后台的话就很容易了
js14982 2016-08-03
  • 打赏
  • 举报
回复
我觉得不能这么玩,想其他办法吧,java中只支持调用oracle查询么?
RUA好多鱼~ 2016-08-03
  • 打赏
  • 举报
回复
create or replace procedure MOVE_AVERAGE is begin execute immediate 'delete from DATA_TEMP'; execute immediate 'insert into DATA_TEMP select X.Week,X.num+Y.num result from (SELECT A.week,count(B.patient) num FROM (select level week from dual connect by level<=52) A left join (SELECT e.patient_name patient,to_char(e.add_time,''iw'') week from cydes_epiinv_hfm e where (e.delete_status<>''1'' or e.delete_status is null) and e.add_time>=to_date((to_char(sysdate,''yyyy'')-2)||''-01-01'',''yyyy-MM-dd'') and e.add_time<=to_date((to_char(sysdate,''yyyy'')-2)||''-12-31'',''yyyy-MM-dd'')) B on A.Week=B.week group by A.week order by A.week) X,(SELECT A.week,count(B.patient) num FROM (select level week from dual connect by level<=52) A left join (SELECT e.patient_name patient,to_char(e.add_time,''iw'') week from cydes_epiinv_hfm e where (e.delete_status<>''1'' or e.delete_status is null) and e.add_time>=to_date(to_char(sysdate,''yyyy'')||''-01-01'',''yyyy-MM-dd'') and e.add_time<=to_date(to_char(sysdate,''yyyy'')||''-12-31'',''yyyy-MM-dd'')) B on A.Week=B.week group by A.week order by A.week) Y WHERE X.week=Y.week)'; end MOVE_AVERAGE; 我改成dml操作的了,在delete语句那就报了14551,无法再查询中执行DML操作,
RUA好多鱼~ 2016-08-03
  • 打赏
  • 举报
回复
恩恩 我正在改 多谢指点
RUA好多鱼~ 2016-08-03
  • 打赏
  • 举报
回复
啊?没问题啊,函数里也没写啥,只是用函数来调用它而已,难道用函数调用存储过程会有这样的问题?我正在按2楼大哥说的尝试一下,还没改完,改一改试试
js14982 2016-08-03
  • 打赏
  • 举报
回复
把drop table和create table改成delete和insert into试试吧,提示的是不能用DDL语句。 DDL:drop ,alter,create,truncate... DML:insert into ,delete,update...
js14982 2016-08-03
  • 打赏
  • 举报
回复
你的存储过程没问题,是函数或者函数调用的问题吧。
RUA好多鱼~ 2016-08-03
  • 打赏
  • 举报
回复
哦哦 应该是2楼大哥说的问题 现在drop也报错,我去改一下那两个sql试试
RUA好多鱼~ 2016-08-03
  • 打赏
  • 举报
回复
我在pl、sql里单独执行了一下那个建表语句,没问题啊,成功了
卖水果的net 2016-08-03
  • 打赏
  • 举报
回复
execute immediate 'create table 把这个建表语句,打印出来,在 plsql 中执行一下,看看有什么问题; 如果你们看不出来有什么问题,可以把语句贴上来;
RUA好多鱼~ 2016-08-03
  • 打赏
  • 举报
回复
你是说,create 这样的语句是不能用这种动态执行的么,那drop这里为什么不会报错
RUA好多鱼~ 2016-08-03
  • 打赏
  • 举报
回复
没写过存储过程,感觉直接create table as这样写起来简单,但是DROP这里执行的时候没错啊,我这个报错是在if循环 下面 那个execute immediate create table那里报的错,不知道是哪里出了问题
ghx287524027 2016-08-03
  • 打赏
  • 举报
回复
execute immediate 后面只能是 DML 操作。你为什么每次要 drop table呢,直接delete掉数据,然后执行 execute immediate insert不行吗?
在本地自己的操作系统上,完全模拟生产环境,让学员跟着视频一步一步搭建一套在RHEL7操作系统上面的oracle19c的rac环境。同时学员还会学会DNS服务器,DNS客户端,NTP服务器,NTP客户端等操作系统知识。让学员在短时间内,oracle和操作系统知识,有一定的提升。让学员可以独自轻松安装一套oracle rac环境。一课程主题 模拟生产环境,用多路径共享存储,用虚拟软件安装一套RHEL7.5+oracle19c+rac+打补丁二课程特色 完成模拟生产环境,用openfiler软件模拟生产惠普的3par存储,用2个虚拟网卡模拟数据库服务器的2个HBA卡。课程以实践为主,从头到尾一步一步教学员怎样操作,实践性强模拟生产需求,完全可以把这套环境拿到生产环境安装三课程内容 1.课程结束成果演示    1.1 用workstation,安装一套rhel7+oracle19c+rac+multipath+共享存储+DNS服务器+DNS客户端+NTP服务器+NTP客户端的生产环境    1.2 怎样打oracle19c的rac补丁(包括GI补丁,oracle补丁,数据库补丁,OJVM补丁,bug补丁)2.安装openfiler软件,模拟共享存储+配置多路径访问    2.1安装openfiler软件   2.2配置openfiler软件(配置2个虚拟网卡,模拟服务器的2个HBA卡)   2.3创建ocr磁盘   2.4创建mgmt磁盘   2.5创建数据文件磁盘   2.6创建归档日志磁盘3.安装2台数据库服务器    3.1安装2台数据库服务器RHEL7.5   3.2配置服务器双网卡绑定+配置服务器心跳线4.安装多路径软件识别共享存储的磁盘     4.1安装服务器本地yum源    4.2安装iscsi软件,配置多路径配置文件,识别共享存储的磁盘    4.3识别ocr磁盘    4.4识别mgmt磁盘    4.5识别数据文件磁盘    4.6识别归档日志磁盘5.oracle19c的rac环境系统参数官方说明     5.1如何配置oracle19c的rac的系统参数(我们参考官方说明)    5.2oracle19c+rac环境Best Practices 官方说明文档6.安装oracle19c+rac之前的准备工作     6.1修改/etc/hosts文件    6.2配置DNS服务器+DNS客户端+NTP服务器+NTP客户端    6.3创建用户和组    6.4创建目录    6.5修改用户环境变量    6.6安装相关软件包    6.7配置ssh互信    6.9禁用服务器透明大页7.安装oracle+19c+rac软件    7.1安装GI软件   7.2创建ASM磁盘,主要是数据文件磁盘和归档日志磁盘   7.3安装数据库软件   7.4创建数据库实例   7.5日常常用维护集群命令(启停数据库,启停集群,查看监听,教同学们怎样不死记命令,而且命令还正确)8.打补丁   8.1打GI和ORACLE的操作系统补丁  8.2打OJVM补丁  8.3打ORA600的bug补丁9.课程总结和成果演示  9.1课程总结和成果演示 四学习必要工具 安装workstation软件  官网下载openfiler,rhel7.5软件下载oracle软件(包括19.3的rac安装包,19.4的补丁)以上软件我都已经在视频里面做了下载地址说明五课程纠错1)rac的私有ip应该是不同的网段,我在视频设置错误。Ensure all private Ethernet interfaces are set to different subnets on each node. If different subnets are not used and connectivity is lost, this can cause a node reboot within the cluster2)配置好multipath,以及多路径的别名后,还要增加如下配置文件。[root@hellorac1 rules.d]# cat /etc/udev/rules.d/99-persistent.rulesENV==data, OWNER:=grid, GROUP:=asmadmin, MODE:=660上面的配置文件增加成功后,运行如下命令:#udevadm control --reload-rules#/sbin/udevadm trigger --type=devices --action=change执行完成之后,会发现/dev/dm*相应的磁盘权限变成grid.asmadmin. 视频只运行了udevadm control --reload-rules。3)安装GI部分1和部分2,先看部分2,再看部分1.特此纠正上面的3个错误。谢谢大家的支持和厚爱。
本系列课程分为,0-理论知识部分    0.1-oca_ocp_ocm相关知识内容(uploading)1-安装部分     1.1单实例命令行安装     1.2单实例图形安装     1.3rac安装     1.4rac(pdb架构)+dg 单实例安装(用rman的duplicate和rman备份2种方式搭建dg)     1.5rac(pdb架构)+rac dg2-迁移部分    2.1单实例之间的迁移    2.2单实迁移到rac    2.3rac迁移到单实例    2.4rac和rac之间的迁移。    2.5关于xtts的迁移方法的使用3-恢复部分   3.1单实例本地恢复   3.2rac本地恢复4-数据库升级部分   4.1 19.3升级到19.13   4.2 12.1.0.2升级到19.3   4.3 12.2.0.1升级到19.3   4.4 19.3的rac升级到19.135-数据库优化部分    5.1如何看懂执行计划    5.2 hash, nest loop,  merge的执行计划各自适用于那种场景?    5.3为什么要用直方图,19c的直方图有frency, balance,  top-frenkency, hybrid?允许最大的bucket是多少?6-数据库asm磁盘操作部分   6-1如何用一条命令迁移rac存储。   6-2如何用笨方法迁移rac存储。   6-3目前asm磁盘是external冗余级别,如何修改为normal的冗余级别。7-数据库工具部分   7.1oem如何进行安装,如何进行纳管数据库,如何使用   7.2如何用oem监控数据库 8-综合实战。   a库是11.2.0.3的单实例数据库,容量有20T。   b库是19.13的rac环境的pdb数据库,容量只有21T.   如何把a库的数据迁移到b库的pdb数据库?   这个综合实战非常考验大家,基本上囊括了数据库复制安装,数据库dg,数据库升级的方方面面。   大家可以自己先想想怎么实现。一课程主题手把手带大家进行实操,在实操提升自己手把手带大家学习orace 19的ocm课程,学完本课程,至少具有3-5年oracle数据库水平。文档和视频is uploading. 二课程特色 学oracle,找阿伟阿伟出品,必属精品从实战出发,贴近实战,自己实战,实战为王,在实战提升自己授人以鱼不如授人以渔通过此系列课程可以提高3-5年oracle水平交个朋友,物有所值,诚意满满走心课程,把自己在运维的坑,提炼知识后,实战给大家 三课程内容 0.理论知识部分(上传。。。)   0.1数据库监听(动态监听,静态监听,多个ip同时监听1521,一个ip监听多个service_name)   0.2rman 命令的set rename datafile和 alter database  rename datafile 有啥区别?   0.3    ............1.数据库单实例安装  1.0 安装检查    1.0.1安装包检查    1.0.2修改系统参数    1.0.3数据库用户创建    1.0.4创建目录    1.0.5上传安装软件包    1.0.6修改oracle用户环境变量  1.1 rhel7系统图形安装oracle 19c单实例数据库  1.2 rhel7系统命令行安装       1.2.0命令行安装数据库软件       1.2.1命令行创建non cdb数据库实例       1.2.2命令行创建 cdb数据库实例2.rac数据库安装    1.课程结束成果演示          1.1 用workstation,安装一套rhel7+oracle19c+rac+multipath+共享存储+DNS服务器+DNS客户端+NTP服务器+NTP客户端的生产环境          1.2 怎样打oracle19c的rac补丁(包括GI补丁,oracle补丁,数据库补丁,OJVM补丁,bug补丁)     2.安装openfiler软件,模拟共享存储+配置多路径访问       2.1安装openfiler软件       2.2配置openfiler软件(配置2个虚拟网卡,模拟服务器的2个HBA卡)        2.3创建ocr磁盘       2.4创建mgmt磁盘       2.5创建数据文件磁盘       2.6创建归档日志磁盘     3.安装2台数据库服务器       3.1安装2台数据库服务器RHEL7.5       3.2配置服务器双网卡绑定+配置服务器心跳线     4.安装多路径软件识别共享存储的磁盘        4.1安装服务器本地yum源        4.2安装iscsi软件,配置多路径配置文件,识别共享存储的磁盘        4.3识别ocr磁盘        4.4识别mgmt磁盘        4.5识别数据文件磁盘        4.6识别归档日志磁盘     5.oracle19c的rac环境系统参数官方说明        5.1如何配置oracle19c的rac的系统参数(我们参考官方说明)        5.2oracle19c+rac环境Best Practices 官方说明文档     6.安装oracle19c+rac之前的准备工作        6.1修改/etc/hosts文件        6.2配置DNS服务器+DNS客户端+NTP服务器+NTP客户端        6.3创建用户和组        6.4创建目录        6.5修改用户环境变量        6.6安装相关软件包        6.7配置ssh互信        6.9禁用服务器透明大页     7.安装oracle+19c+rac软件       7.1安装GI软件       7.2创建ASM磁盘,主要是数据文件磁盘和归档日志磁盘       7.3安装数据库软件       7.4创建数据库实例       7.5日常常用维护集群命令(启停数据库,启停集群,查看监听,教同学们怎样不死记命令,而且命令还正确)     8.打补丁     8.1打GI和ORACLE的操作系统补丁      8.2打OJVM补丁      8.3打ORA600的bug补丁     9.课程总结和成果演示     9.1课程总结和成果演示3.rac+dg(单实例)数据库安装(pdb架构)     3.1.1dg知识点讲解     3.1.2配置dg监听,密码文件,参数文件。     3.1.2通过rman的duplicate命令进行dg搭建1。     3.1.3通过rman的duplicate命令进行dg搭建2     3.1.4进行数据库切换需要的配置。     3.1.5数据库正常switch over     3.1.6数据库如何fail over     3.1.7dg库failover以后通过闪回快速恢复dg     3.1.8dg库failover以后通过新主库的控制文件快速恢复dg     3.1.9备库归档缺失如何进行解决。     3.1.10recover database和recover standby database是否可以在dg使用?     3.1.11如何通过rman的备份进行搭建dg。     3.1.12dg库使用静态监听无法监听pdb数据库的service问题如何进行解决?   4.rac+rac dg的实战步骤(pdb架构)(上传。。。)5.19c单实例数据库通过rman备份进行异机迁移到单实例数据库     5.1通过备份脚本进行数据,归档,控制文件备份     5.2通过备份脚本进行归档,控制文件备份       (注意源库备份目录是/backup/db和/backup/ar)     5.3传输备份文件到目标库        (传输备份文件到目标库的/home/oracle/bk目录)     5.4利用参数文件启动数据库到nomount     5.5利用备份集恢复控制文件,并启动数据库到mount     5.6通过restore database恢复数据库        5.6.1注册目标库备份集到控制文件        5.6.2启动数据库到mount状态,确定recover database的序列号     5.7recover database        5.7.1通过rman 进行recover database        5.7.2通过sql 命令行进行 recover database;     5.8.打开数据库          5.8.1解决打开数据库后,sys用户无法远程监听登录问题          5.8.2修改数据库动态参数启动数据库     5.9.备份的扩展             5.9.1如何知道备份集里面有哪些归档             5.9.2如何从这些备份集提取归档             5.9.3进行异机数据库迁移时,如何逐步应用归档,并且如何open read only数据库后,继续应用归档             5.9.4为何要进行 open read only进行提前打开验证。               5.10.rman迁移备份的补充             5.10.1如何再rman设置数据文件,在线日志生成路径。               类似如下命令                    run  6单实例数据库无数据丢失通过rman备份异机迁移到rac数据库和rac数据库通过rman迁移到rac数据库      6.1单实例源库进行数据库升级           19.3的源库升级到19.13版本(包括打数据库补丁和ojvm补丁)      6.2.传输备份文件到目标库           传输备份文件到目标库的/home/oracle/bk目录     6.3.利用参数文件启动数据库到nomount     6.4.利用备份集恢复控制文件,并启动数据库到mount        6.5.通过restore database恢复数据库           注册目标库备份集到控制文件           启动数据库到mount状态,确定recover database的序列号     6.6.recover database          通过rman 进行recover database          通过sql 命令行进行 recover database;     6.7.单实例数据库恢复完成后,配置为rac数据库           注册数据库到集群          修改数据库参数文件到asm     6.8.迁移rac数据库到rac数据库。           单实例数据库异机迁移到rac和,rac数据库异机迁移到rac有啥不一样。           根据上面理论,实施rac数据库异机恢复到rac7数据库本地恢复系列     7.1单实例数据库本地恢复     7.2rac数据库本地恢复8综合实战(uploading)     7.1实战课题:        有一台11.2.0.3的单实例数据库A,数据库容量有20T,无备份。        如何迁移到新搭建的rac环境B(数据库版本是19.13),并且是迁移到rac的pdb数据库,并且rac数据库的asm容量只有21T.        这次实战包含的知识点。        1-如何在环境B复制数据库A的软件,最好进行复制,因为数据库A的11.2.0.3打了很多补丁,如果安装11.2.0.3软件,会造成版本不一致。        2-如何搭建11.2.0.3的单实例dg。        3-dg归档缺失如何解决。        4-如何升级11.2.0.3单实例到11.2.0.4单实例        5-如何升级11.2.0.4单实例到19.3单实例        6-如何升级19.3单实例到19.13单实例。        7-如何迁移19.13单实例数据库到19.13的rac的pdb数据库。9数据库升级系列     8.1 单实例19c数据库升级到19.13版本。     8.2 单实例12.2.0.1数据库升级到19.13版本。     8.3 单实例12.1.0.2数据库升级到19.13版本。     8.4 19c数据库rac升级到19.13版本。
课程基础概述本门课程,大喵将会打着大家从零打造一款属于大家自己的 CLI命令行脚手架工具,本课程主要面向新手同学,对命令行工具开发,前端工具开发感兴趣的同学,可以通过本门课程学习到如何使用Node.JS开发一款适配自身项目特色的脚手架命令行工具。并且也会带着大家推送自己开发完成的CLI工具到NPM线上仓库,供所有人下载安装使用。整个课程,大喵会详细讲解所需要依赖的第三方模块包的具体使用,让同学们可以举一反三开发具备自身特色的CLI工具,最终大喵会运用到前面所讲解的基础内容,独立自主开发一个具备 damiao [ add | delete | list | init ] 四种子命令的CLI脚手架工具。CLI命令行工具命令行工具(Cmmand Line Interface)简称cli,顾名思义就是在命令行终端使用的工具。我们常用的 git 、npm、vim 等都是 cli 工具,比如我们可以通过 git clone 等命令简单把远程代码复制到本地。在目前前端工程大流行的环境下,vue-cli、create-reate-app、angular-cli 等等方便快捷的命令行脚手架工具诞生,极大的提升了我们的开发效率与质量,我们可以通过这些脚手架工具在本地快速构建我们的开发项目。 课程目录结构1、CLI课程介绍   2、CLI课程纲领和讲师介绍3、CLI课程内容概述    4、CLI命令行工具及场景应用5、CLI课程准备工具和技术   6、CLI课程收获和收益  7、CLI课程实战案例介绍   8、npm CLI 命令行工具发展现状9、创建第一个命令行自定义命令   10、process.argv 接收命令行参数11、commander 工具使用介绍一   12、commander 工具使用介绍二13、inquirer 工具使用介绍   14、ora 加载工具使用介绍15、chalk 颜色工具使用介绍   16、download-git-repo 仓库工具介绍17、创建脚手架命令   18、创建命令可执行文件19、damiao add 命令行指令开发   20、damiao add 模板录入校验21、damiao delete 命令行指令开发   22、damiao list 命令行指令开发23、damiao init 初始化项目指令开发   24、damiao init 指令参数输入校验25、damiao 命令行指令测试.mp4  26、创建npm个人账号及发布npm仓库27、全局安装脚手架工具

17,081

社区成员

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

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