我使用动态sql创建了一个过程,但无法成功运行它。
create or replace procedure getdata(string par1, results out cursor)
as
declare sqlBase varchar2(100);
begin
sqlBase := 'open '||results|| ' for select * from studetns';
end;
运行后,会弹出以下错误消息:
PLS-00306,调用'||'
时参数的数目或参数类型错误
我只需要通过某些参数过滤数据,但有些参数可能为null或为空, 所以我需要过滤动态。喜欢if(par1不为null)然后........ 所以这里我需要使用动态sql。在C#程序中,使用cursor返回结果。 像这里一样,我使用游标类型来打开select语句。
但是在sql编辑器中,我得到了正确的sql语句。
有人可以帮我吗?
答案 0 :(得分:2)
你的语法有点不对劲。试试这个:
create or replace procedure getdata(par1 varchar2, par2 varchar2, results out sys_refcursor)
as
begin
open results for
select *
from students
where name = nvl(par1, name)
and surname = nvl(par2, surname);
end;
为什么需要参数par1
?最好使用PL / SQL类型varchar2
,而不是string
。它们的工作方式相同,但varchar2
是基本数据类型,而string
是其子类型。
答案 1 :(得分:0)
根据你想要达到的目标,我会尝试这样的事情:
create or replace procedure getdata(par1 varchar2, results out sys_refcursor)
as
sqlBase varchar2(100);
begin
sqlBase := 'begin open :X for select * from students;end;';
execute immediate sqlbase USING IN OUT results;
end;
在尝试游标时,无法将游标连接到字符串中,这就是错误的来源。
但如果你能澄清你的问题,我们可以帮助你更好。