• 主页
  • Oracle 基础和管理
  • Oracle 高级技术
  • Oracle 认证与考试
  • 职位交流

关于在存储过程中执行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 虽然没有问题。但是在执行的时候会提示有问题

请问在存储过程中可以执行那些语句吗
...全文
330 点赞 收藏 22
写回复
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;
↑少了一個単引号
回复 点赞
发动态
发帖子
Oracle
创建于2007-09-28

6417

社区成员

5.4w+

社区内容

Oracle开发相关技术讨论
社区公告
暂无公告