2011-12-16 6 views
1

私は2つの値を返すカーソルを持っています:1つは私が使用する(したがって、out変数に割り当てます)、もう1つはROWNUMを動作させるために返されたものです。このPL/SQLプロシージャはなぜ機能しませんか?

カーソルをクエリとして実行すると、期待どおりに動作します。しかし、手順を実行すると、out変数が空になります。私のアプローチは何とかサポートされていないのですか?つまり、2つの値を返しますが、そのうちの1つだけを返します。ここで

は私の手順のコードである:(クエリ自体にあまり掘り下げないでくださいそれは動作しますが、私はそれは少し醜いですが、それは動作します知っているそれは私が最後から2番目のを返すために見つけた唯一の方法でした。行)

procedure retorna_infos_tabela_164(i_nip in varchar, 
           o_CODSDPANTERIOR out number) is 
cursor c_tabela_164 is 
    select * 
    from(
     select CODSDP,ROWNUM rn 
     from 
       (
       select NRONIP,CODTIPOMOV,CODSDP 
       from TB164_HISTORICOMOVIMENTACOES 
       where NRONIP = i_nip and 
       CODTIPOMOV='S1' 
       order by DTHMOV desc 
      ) 
     ) 
    where rn=2; 

    v_temp_nr number; 

begin 
    open c_tabela_164; 
    fetch c_tabela_164 into o_CODSDPANTERIOR,v_temp_nr; 
    close c_tabela_164; 
end retorna_infos_tabela_164; 

EDIT私は、この手順を実行しようとした方法では動作しませんでしたdbms_output.put_line(o_CODSDPANTERIOR)でいました。私はちょっとgoogledと私はTO_CHAR()私のvar最初にして、それを出力する必要があります見た。どちらもうまくいきませんでした。

+0

クエリとしてカーソルを実行できますか? (sybaseではありません) –

+0

@aFあなたは 'select'キーワードの前にその部分を切り捨てると実行できます。 :) – GolezTrol

+0

さて、私はカーソルが*クエリだと思った。 SQLランナーでCtrl + Cを押してからctrl + vを押すだけです。 –

答えて

0

申し訳ありません私が使用しているツールとは何か答えがあったときに、皆さんが私に答える時間を取ってくれました。皆さんが何かを学んだことを願っています。

クエリは私にとっては少なくとも機能しますが、動作しないエッジケースは見つかっていませんが、徹底的にテストしていません。

問題TOAD、私は手順を実行するために使用しているツールは、時々私はそれを言うが、時にはそれがないパラメータで手続きを移入ということでした。ここでの問題は、パラメータなしのプロシージャを実行しようとしていたため、結果が得られないということでした...

レッスン学習:TOADバージョン9で右クリック>プロシージャを実行してプロシージャを実行すると、 。

+0

おそらく別のレッスン - あなたのGUIツールが予期しない結果を出すと、SQLPlusのような素人のツールに切り替える –

2

数字をDBMS_OUTPUT.PUT_LINEに渡すことに問題はありません。 Oracleは、他の組み込みタイプをデフォルト・フォーマットを使用して暗黙的にVARCHAR2に変換します。使用されるフォーマットを制御したい場合は、TO_CHARを使用する必要があります。これはよく考えられますが、一般的には必要ありません。

ただし、出力を有効にしていないため出力が表示されない可能性があります。 SQLPlusでテストを実行する場合は、DBMS_OUTPUT呼び出しを含むコードを実行する前にSET SERVEROUTPUT ONを必ず確認してください。他のクライアントを使用している場合は、DBMS_OUTPUTを有効にする適切な方法について、そのドキュメントを参照してください。 (文字列リテラルを出力する別の呼び出しを追加することで有効になっているかどうかはもちろんテストできます)

outパラメータを設定するために使用しているテクニックには本質的に何も問題はありません。ただし、カーソルから2つの列を返す必要はありません。 select *は単にselect CODSDPになります。述語で参照される列が選択リストになければならないという誤解の下にあるようですが、そうではありません。最も内側のクエリでは、選択リストは外側のブロックで参照されないため、NRONIPまたはCODTIPOMOVを含める必要はありません。その問合せのWHERE句は、選択リスト内にあるかどうかにかかわらず、表内の任意の列を参照できます。

私の最初の推測は、単にサーバー出力を有効にしていないということです。私が今考えることのできる唯一の可能性は、クエリとプロシージャを2つの異なるセッションで実行していることです。そのうちの1つはテーブルに対してコミットされていないトランザクションを持っているため、実際には異なるデータが表示されます。

これらの提案が問題にはならない場合は、スタンドアロンクエリとプロシージャのテストを1つのSQLPlusセッションで実行し、ここでセッション全体をコピー&ペーストしてくださいまさにあなたがやっていること。

関連する問題