请教:如何在oracle中使用动态sql?

[复制链接]
查看11 | 回复9 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
我想在一存储过程中使用动态sql,但以前只接触过sql server的动态sql,但在oracle中提示编译错误,请问如何在oracle中使用动态sql,另外,在oracle中是不是不支持select * from tablename这样的语句,我想从表中取出记录集,该如何实现?谢谢
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
oracle中只需要拼写出形式上正确的plsql语句即可
然后
execute immediate plsqlstatement
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
oracle中只需要拼写出形式上正确的plsql语句即可
然后
execute immediate plsqlstatement
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
请看我如下代码为什么编译不通过?
create or replace procedure proc_update_ad_info
(

infoid
in
number,

str
in
varchar2,

action
in
number,

ret
out
number
)
as
begin

--declare
sqlstr
varchar2(1000);



if action = 3 then

BEGIN

sqlstr= 'delete from t_ad_info where'||str;

execute immediate sqlstr;

END

end if;


exception

when NO_DATA_FOUND then

rollback;

ret := 0;



when others then

rollback;

ret := 0;
end proc_update_ad_info;
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
create or replace procedure proc_update_ad_info
(
infoid in number,
str in varchar2,
action in number,
ret out number
)
as
sqlstr varchar2(1000);
begin
if action = 3 then
BEGIN
sqlstr:= 'delete from t_ad_info where '||str;
execute immediate sqlstr;
END;
end if;
exception
when NO_DATA_FOUND then
rollback;
ret := 0;
when others then
rollback;
ret := 0;
end proc_update_ad_info;
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
就是不用declare 并且放在过程体的外面?
非常感谢,目前动态sql已经没有问题了。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
非常感谢,一切都成功了,但是又有个问题请教。下面的代码为什么编译不通过?
create or replace procedure proc_hr_test
( in_name in varchar2,

out_nameout number

)
is
begin
select * from adinfo_ca_view;
end proc_hr_test;
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
在存储过程里是必须要有接收集的。可不是在sqlplus里面。
应该是 select * into 你的接收结果集 from 表——这样只是返回唯一结果集。
如果要返回多条,就要用游标。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
在procedure中要用SELECT 。。。。INTO 。。。。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
LZ我把你的代码重新修改了一下,这样就对了:
create or replace procedure proc_update_ad_info(strin varchar2,

action in number,

retout number) as
sqlstr varchar2(1000);
begin
if action = 3 then
BEGIN
sqlstr := 'delete from t_ad_info where' || str;
execute immediate sqlstr;
END;
end if;
exception
when NO_DATA_FOUND then
rollback;
ret := 0;
when others then
rollback;
ret := 0;
end proc_update_ad_info;
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836