procedure参数如何传递

Adebayor 2009-11-11 02:39:58
SQL> select * from test;

ID NAME
--------------- -----
1 aa
2 bb
3 cc

create or replace procedure pro(t in varchar2) is
begin
dbms_output.put_line(t);
for c in (select id from test where name in(t)) loop
dbms_output.put_line(c.id);
end loop;
end;

问:参数要如何传递才会有结果呢(不只一条记录)? 赶紧帮帮忙吧 呵呵
...全文
331 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
todayandtomorrow 2009-11-11
  • 打赏
  • 举报
回复
楼主,你讲明白问题。要是传递得参数是什么?'aa'?'aa,bb'?'aa,bb,cc'?还是别得其他的。
结果得情况你也用语言描述下。

wh62592855 2009-11-11
  • 打赏
  • 举报
回复
学习~
Adebayor 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wildwave 的回复:]
引用 15 楼 adebayor 的回复:
引用 14 楼 wildwave 的回复:
那就也不会有问题
我写的过程名是proc
你是不是建了proc调用了pro...

呵呵 可以了
谢谢你 不过对于你的source不是很明白 不用动态不可以吗?
我写的pro是这么传的 pro('''aa''' || ',' || '''bbb''');
字符串输出的结果是'aa','bb'
可传到name中就没结果了!

IN里面你要对应的是若干个参数,而你传入的是一个字符串,只能按一个值处理
所以只能用动态语句来解决
'''aa''' || ',' || '''bbb'''和'''aa'',''bbb'''是一样的

select into 你应该明白吧。bulk collect into将一组值批量传入temp这个plsql表
[/Quote]
OK
小灰狼W 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 adebayor 的回复:]
引用 14 楼 wildwave 的回复:
那就也不会有问题
我写的过程名是proc
你是不是建了proc调用了pro...

呵呵 可以了
谢谢你 不过对于你的source不是很明白 不用动态不可以吗?
我写的pro是这么传的 pro('''aa''' || ',' || '''bbb''');
字符串输出的结果是'aa','bb'
可传到name中就没结果了!
[/Quote]
IN里面你要对应的是若干个参数,而你传入的是一个字符串,只能按一个值处理
所以只能用动态语句来解决
'''aa''' || ',' || '''bbb'''和'''aa'',''bbb'''是一样的

select into 你应该明白吧。bulk collect into将一组值批量传入temp这个plsql表
Adebayor 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 adebayor 的回复:]
引用 14 楼 wildwave 的回复:
那就也不会有问题
我写的过程名是proc
你是不是建了proc调用了pro...

呵呵 可以了
谢谢你 不过对于你的source不是很明白 不用动态不可以吗?
我写的pro是这么传的 pro('''aa''' || ',' || '''bbb''');
字符串输出的结果是'aa','bb'
可传到name中就没结果了!
[/Quote]
主要是这句:
execute immediate 'select id from test where name in ('''||replace(t,',',''',''')||''')'
bulk collect into temp;

有时间麻烦帮我分析下
完了 我好散分 呵呵 玩笑
Adebayor 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wildwave 的回复:]
那就也不会有问题
我写的过程名是proc
你是不是建了proc调用了pro...
[/Quote]
呵呵 可以了
谢谢你 不过对于你的source不是很明白 不用动态不可以吗?
我写的pro是这么传的 pro('''aa''' || ',' || '''bbb''');
字符串输出的结果是'aa','bb'
可传到name中就没结果了!
小灰狼W 2009-11-11
  • 打赏
  • 举报
回复
那就也不会有问题
我写的过程名是proc
你是不是建了proc调用了pro...
Adebayor 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wildwave 的回复:]
引用 9 楼 adebayor 的回复:
引用 7 楼 adebayor 的回复:
我想要的结果是:
aa,bb,cc
1
2
3

这样

传入proc('aa,bb,cc')输出
1
2
3
对吧
过程没有问题,测试过了
你看看
SQL codedeclare
tvarchar2(10):='aa,bb,cc';
type type1istableofnumberindexby binary_integer;temp type1;beginexecute immediate'select id from test where name in ('''||replace(t,',',''',''')||''')'bulk collectintotemp;for iin1..temp.count loop
dbms_output.put_line(temp(i));end loop;end;是否会出错
也可以写成
SQL codedeclare
tvarchar2(10):='aa,bb';
cur sys_refcursor;
vnumber;beginopen curfor'select id from test where name in ('''||replace(t,',',''',''')||''')';
loopfetch curinto v;exitwhen cur%notfound;
dbms_output.put_line(v);end loop;close cur;end;
写成匿名过程容易检查错误
成功后改成procedure形式
[/Quote]
匿名过程是可以的
小灰狼W 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 adebayor 的回复:]
引用 7 楼 adebayor 的回复:
我想要的结果是:
aa,bb,cc
1
2
3

这样
[/Quote]
传入proc('aa,bb,cc')输出
1
2
3
对吧
过程没有问题,测试过了
你看看
declare
t varchar2(10):='aa,bb,cc';
type type1 is table of number index by binary_integer;
temp type1;
begin
execute immediate 'select id from test where name in ('''||replace(t,',',''',''')||''')'
bulk collect into temp;
for i in 1..temp.count loop
dbms_output.put_line(temp(i));
end loop;
end;
是否会出错
也可以写成
declare
t varchar2(10):='aa,bb';
cur sys_refcursor;
v number;
begin
open cur for 'select id from test where name in ('''||replace(t,',',''',''')||''')';
loop
fetch cur into v;
exit when cur%notfound;
dbms_output.put_line(v);
end loop;
close cur;
end;

写成匿名过程容易检查错误
成功后改成procedure形式
ngx20080110 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 adebayor 的回复:]
SQL> exec pro('aa');
aa
1
这是一个参数的结果

我想要的结果是:
SQL> exec pro('aa');
aa,bb,cc
1
2
3
不会传参数呀!



[/Quote]
不懂你想得到什么结果,参数是aa,跟bb, cc没什么关系吧?
sxx_tt 2009-11-11
  • 打赏
  • 举报
回复
你要传入的参数是‘aa,bb,cc'的话,直接这个作为一个参数就是了
exec pro('aa,bb,cc');
Adebayor 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 adebayor 的回复:]
我想要的结果是:
aa,bb,cc
1
2
3

[/Quote]
这样
Adebayor 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wildwave 的回复:]
动态

SQL codecreateorreplaceprocedureproc(tinvarchar2)as
type type1istableofnumberindexby binary_integer;temp type1;beginexecute immediate'select id from test where name in ('''||replace(t,',',''',''')||''')'bulk collectintotemp;for iin1..temp.count loop
dbms_output.put_line(temp(i));end loop;endproc;
试试
begin
proc('aa,bb');
end;
[/Quote]
还是不行 sql无效
Adebayor 2009-11-11
  • 打赏
  • 举报
回复
SQL> exec pro('aa');
aa
1
这是一个参数的结果

我想要的结果是:
SQL> exec pro('aa');
aa,bb,cc
1
2
3

不会传参数呀!


小灰狼W 2009-11-11
  • 打赏
  • 举报
回复
动态

create or replace procedure proc(t in varchar2)
as
type type1 is table of number index by binary_integer;
temp type1;
begin
execute immediate 'select id from test where name in ('''||replace(t,',',''',''')||''')'
bulk collect into temp;
for i in 1..temp.count loop
dbms_output.put_line(temp(i));
end loop;
end proc;

试试
begin
proc('aa,bb');
end;
iqlife 2009-11-11
  • 打赏
  • 举报
回复
参数用数组传递进去

SQL> create or replace type myvarray_list as varray(10) of varchar2(50);
2 /

类型已创建。

SQL> create or replace procedure show_list(
2 p_varlist in myvarray_list
3 )
4 is
5 str varchar2(50);
6 begin
7 for x in 1..p_varlist.count loop
8 dbms_output.put_line('p_varlist('||x||')='||p_varlist(x));
9 end loop;
10 end;
11 /

过程已创建。

SQL> exec show_list(myvarray_list('Oracle','DB2','Sql Server','mySql','DBA'));
p_varlist(1)=Oracle
p_varlist(2)=DB2
p_varlist(3)=Sql Server
p_varlist(4)=mySql
p_varlist(5)=DBA

PL/SQL 过程已成功完成。
ngx20080110 2009-11-11
  • 打赏
  • 举报
回复
我猜想LZ想要的结果是:
exec pro('aa,bb');

1
2

da21 2009-11-11
  • 打赏
  • 举报
回复
exec pro('aa')
lengyunfei006 2009-11-11
  • 打赏
  • 举报
回复
你现在返回的是id的一个结果集,你具体要达到什么效果?
sxq129601 2009-11-11
  • 打赏
  • 举报
回复
只有一条因为你同名的就一个啊。你数据库里如果同名的很多就多个啊

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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