2013-11-22 20 views
0

我使用动态sql创建了一个过程,但无法成功运行它。Oracle动态运行错误

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,错号码或类型的调用参数 '||'

我只是需要通过一些参数来过滤数据,但有些参数可能为空或空, ,所以我需要过滤动态。就像if(par1不为null)那么........ 所以在这里我需要使用动态sql。在C#程序中,使用游标返回结果。 喜欢这里,我用光标类型打开select语句。

但在sql编辑器中,我得到正确的sql语句。

有人可以帮助我吗?

回答

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是它的子类型。

+0

你是对的,谢谢你。 'string'与'varchar2'相同。 –

+0

我需要使用par来过滤数据。有多个参数。在这里,我只列出一个参数。使用光标返回选择结果。 –

+0

然后在select语句中添加'where name = par1'。 –

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; 

不能连接光标成一个字符串,你试了一下,这就是来自何方您的错误。

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

+0

我只是想使用一些参数来过滤数据,但参数是选择选项,如果par1为null,那么不要使用它来过滤。如果par2不为null,则使用par2,然后与par3相同, par4,par5 ..... –

+0

好吧,我认为你不需要动态SQL。只需使用@AlenOblak的回答 – Armunin

+0

是的。现在,我认为@AlenOblak解决方案是可以的,谢谢 –