2011-04-20 2 views
2

Я хочу передать весь sql-запрос в качестве лексического параметра в хранимую процедуру, а затем выполнить его. Любые предложения, как это сделать?PL/SQL: Передача лексического параметра в хранимую процедуру

+0

Что значит «выполнить его»? Запрос предназначен для возврата результата - вам нужно определить, что вы хотите, чтобы хранимая процедура выполняла результаты. –

+0

Привет, Jeffrey, Что я хочу сделать, так это дать запрос во время выполнения хранимой процедуре, например, я хочу выполнить операцию вставки. Я дам запрос вставки во время выполнения, когда я выполню процедуру. – Tehseen

+0

Будет ли запрос всегда возвращать тот же набор столбцов и типов данных? –

ответ

1

вы можете попробовать это:

create or replace procedure my_proc(pstring IN varchar2) 
is 

begin 

    if length(pstring)>0 then 

    EXECUTE IMMEDIATE pstring; 

    end if; 

end my_proc; 

здесь является официальным оракулом документация по динамическому PLSQL: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/dynamic.htm#CHDGJEGD

+0

Спасибо Алекс, это действительно полезно. – Tehseen

+0

Быть очень, очень, очень уверенным, что у вас нет другого способа сделать это? Выполнение неизвестного SQL может быть очень опасным, и злоумышленник, если они сталкиваются с этим, может в принципе сделать что-либо в вашей базе данных ... –

1

Не уверен, что вы подразумеваете под «лексическим» параметром, но вы можете передать запрос SQL в виде VARCHAR2, а затем выполнить его с помощью EXECUTE IMMEDIATE.

+0

Спасибо за ответ, Я делаю это. создать или заменить процедуру testproc (str varchar2 (1000)) как есть начало выполнить немедленное (str); конец; Правильно ли это, или я чего-то не хватает? – Tehseen

+0

Оставьте «(1000)», так как вы не укажете длину IN-параметров. – darreljnz

1

То, что вы пытаетесь сделать, - это, безусловно, неправильный путь.

Execute Immediate следует использовать с осторожностью, поскольку он может: a) налагать угрозу безопасности и b) вызывать негативные последствия для производительности, когда многие различные операторы SQL выполняются таким образом.

Однако, см. here как вставить записи, используя execute immediate. Обратите внимание, что важно использовать переменные связывания.

0

Если вы хотите запустить запрос (в противоположность DML [вставки, обновления , удалить] или PL/SQL блок кода), вы можете сделать что-то вроде этого:

function get_dataset (p_sql_query in varchar2) return sys_refcursor 
as 
    l_returnvalue sys_refcursor; 
begin 

    open l_returnvalue for p_sql_query; 

    return l_returnvalue; 

end get_dataset; 

возвращаемое значение является «слабо Ty ped "REF CURSOR.

Затем вызывающая программа (будь то Java, .NET, PL/SQL, независимо) должна обрабатывать результат функции и закрывать курсор.

+0

Thanx ObiWanKenobi, это полезно. – Tehseen

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