2011-04-20 4 views
2

SQLクエリ全体をレキシカルパラメータとしてストアドプロシージャに渡してから実行します。どのようにそれを行うための任意の提案?PL/SQL:レキシカルパラメータをストアドプロシージャに渡す

+0

「実行する」とはどういう意味ですか?クエリは結果を返すように設計されています。ストアドプロシージャで実行する結果を定義する必要があります。 –

+0

こんにちはJeffrey、 私は何をしたいのですか?実行時にクエリをストアドプロシージャに渡すことです。たとえば、挿入操作を実行したいと思います。実行時に実行時に挿入クエリを実行します。 – Tehseen

+0

クエリは常に同じ列とデータ型のセットを返しますか? –

答えて

1

あなたはこの試みることがありますが、DMLとは対照的に、クエリ([挿入、更新を実行したい場合は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))をそのまま作成または置き換えます。 begin execute immediate(str); end; これは正しい方法ですか、何か不足していますか? – Tehseen

+0

INパラメータの長さを指定しないので、 "(1000)"をそのままにします。 – darreljnz

1

あなたがしようとしていることはほとんど間違った方法です。

Execute Immediateは、a)セキュリティリスクがあり、b)多くの異なるSQL文がそのように実行された場合にパフォーマンスに悪影響を及ぼすことがあるため、注意が必要です。

ただし、execute immediateを使用してレコードを挿入する方法については、hereを参照してください。バインド変数を使用することが不可欠であることに注意してください。

0

:ここ

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の公式Oracleのドキュメントです

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「弱いです、削除]またはコードのPL/SQLブロック)が、あなたはこのような何かを行うことができます「REF CURSOR」を押します。

呼び出しプログラム、関数の結果を処理し、カーソルをクローズする必要があります(それが何であれのJava、.NET、PL/SQL、あるかどうか)。

+0

Thanx ObiWanKenobi、これは便利です。 – Tehseen

関連する問題