2013-11-22 3 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, неправильное число или типы аргументов в вызове '||'

Мне просто нужно отфильтровать данные по некоторым параметрам, но некоторые параметры могут быть пустыми или пустыми, , поэтому мне нужно отфильтровать динамические. например, если (par1 не null), то ........ , поэтому здесь мне нужно использовать динамический sql. в программе C# используйте курсор для возврата результата. , как здесь, я использую тип курсора для открытия операторов выбора.

но в редакторе 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

Мне нужно использовать пар для фильтрации данных. существует несколько параметров. здесь я просто перечисляю один параметр. используйте курсор для возврата результата выбора. –

+0

Затем просто добавьте 'where name = par1' в оператор select. –

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 является нулевым, тогда не используйте его для filter.if par2 не является нулевым, а затем используйте par2, то же, что и par3, par4, par5 ..... –

+0

Хорошо, я думаю, вам не нужен динамический SQL. Просто используйте ответ @AlenOblak – Armunin

+0

Да.Теперь, я думаю, решение @AlenOblak в порядке, спасибо –

Смежные вопросы