Oracle动态运行错误

时间:2013-11-22 11:04:28

标签: oracle

我使用动态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语句。

有人可以帮我吗?

2 个答案:

答案 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;

在尝试游标时,无法将游标连接到字符串中,这就是错误的来源。

但如果你能澄清你的问题,我们可以帮助你更好。