关于在存储过程中执行drop和create语句的问题

txmz 2005-03-24 10:21:28
脚本如下
CREATE or replace function Code
Return Varchar2 as
vGlideCode Varchar2(20);
seq_year varchar2(4);
begin
update tbl_seqYear set seqYear=to_char(sysdate,'yyyy');
drop sequence xxSeq;
create sequence xxSeq ;
select xxSeq.nextval into vGlideCode from dual;
end if;
return(vGlideCode);
end;

结果提示drop 和 CREATE 有错误,update 虽然没有问题。但是在执行的时候会提示有问题

请问在存储过程中可以执行那些语句吗
...全文
543 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
congzilongoooo 2005-06-21
  • 打赏
  • 举报
回复
好精彩
bzszp 2005-06-21
  • 打赏
  • 举报
回复
肯定是dinya2003说的那种情况!
heyixiang 2005-06-20
  • 打赏
  • 举报
回复
'create sequence ss'
创建表怎么连字段都不加?

其次,动态DML可以在存储过程中使用,但函数中我就不清楚了。
nowait 2005-06-19
  • 打赏
  • 举报
回复

是在执行update syy set sn =to_char(sysdate,'yyyy');时提示法在查询中执行 DML 操作
权限我已经加了,没有问题
---------------------------------------------------
上面的语句单独执行肯定是没有问题的。
SQL> update test set time=to_char(sysdate,'yyyymmddhh24miss');

3 行 已更新

SQL> commit;

提交完成

你单步调试,看问题是出在哪句上。


dinya2003 2005-06-19
  • 打赏
  • 举报
回复
你是在你的查询语句中使用了你建的函数吧. 不允许这么用的,
你应该把你的DML语句写在过程中执行.
「已注销」 2005-06-17
  • 打赏
  • 举报
回复
学习
suesue 2005-03-24
  • 打赏
  • 举报
回复
关注
txmz 2005-03-24
  • 打赏
  • 举报
回复
好是好了不过又出现了问题

create or replace function GlideCode
Return Varchar2 as
vCode Varchar2(20);
sy varchar2(4);
sqlStr varchar2(200);
begin
select sn into sy from syy;
if sy=to_char(sysdate,'yyyy') then
select ss.nextval into vcode from dual;
else
sqlStr := 'update syy set sn ='||to_char(sysdate,'yyyy');
execute immediate sqlStr;
execute immediate 'drop sequence ss;
execute immediate 'create sequence ss';
select ss.nextval into vcodefrom dual;
end if;
return(vGlideCode);
end;

ORA-14551: 无法在查询中执行 DML 操作
请问怎么解决在查询的同时做DML操作啊?????
skystar99047 2005-03-24
  • 打赏
  • 举报
回复
在存储过程中执行DDL语句需要用动态语句
EXECUTE IMMEDIATE DDLSQL
zonelive 2005-03-24
  • 打赏
  • 举报
回复
上面的
用动态语句只能
LGQDUCKY 2005-03-24
  • 打赏
  • 举报
回复
还有使用存储过程建立表的时候,用户要有明确的CREATE TABLE的权限
LGQDUCKY 2005-03-24
  • 打赏
  • 举报
回复
存储过程不能自己使用DDL语句,要使用动态语句来执行


CREATE or replace function Code
Return Varchar2 as
vGlideCode Varchar2(20);
seq_year varchar2(4);
str varchar2(100);
begin
update tbl_seqYear set seqYear=to_char(sysdate,'yyyy');
str:='drop sequence xxSeq';
execute immediate str;
str :='create sequence xxSeq '
execute immediate str;
select xxSeq.nextval into vGlideCode from dual;
end if;
return(vGlideCode);
end;

txmz 2005-03-24
  • 打赏
  • 举报
回复
是在执行update syy set sn =to_char(sysdate,'yyyy');时提示法在查询中执行 DML 操作
权限我已经加了,没有问题
etheltim 2005-03-24
  • 打赏
  • 举报
回复
权限不足
bobfang 2005-03-24
  • 打赏
  • 举报
回复
你是在调用函数时出的错吧,你是执行
select ..., GlideCode() , ... from ... ?
cronuz 2005-03-24
  • 打赏
  • 举报
回复
SELECT sn INTO sy FROM syy;
此処↑会出Exception (NO_DATA_FOUND,TOO_MANY_ROWS等)在最後要加

BEGIN --main
-- 省略
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN '0';
WHEN TOO_MANY_ROWS THEN
RETURN '0';
WHEN OTHERS THEN
RETURN '0';
END;
txmz 2005-03-24
  • 打赏
  • 举报
回复
select sn into sy from syy;

这条语句只返回一条记录,我在表里面只有一条数据
LGQDUCKY 2005-03-24
  • 打赏
  • 举报
回复
select sn into sy from syy;


这条语句如果返回多条记录会出错,这样要使用到游标
txmz 2005-03-24
  • 打赏
  • 举报
回复
这个我知道。与语法无关了。好象是在查询一个表的时候不能做DML操作,请问该怎么做啊
cronuz 2005-03-24
  • 打赏
  • 举报
回复
execute immediate 'drop sequence ss;
↑少了一個単引号
加载更多回复(2)

17,140

社区成员

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

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