1

これが私のストアドプロシージャ全体です。

CREATE OR REPLACE PROCEDURE "CTI"."TEMP_DIVISION"
(
    pDivisionList in varchar2,
    out_cursor out SYS_REFCURSOR
)
as
begin
  open out_cursor for
  SELECT distinct CTA_DIVISION
  FROM cti_account 
  WHERE CTA_DIVISION in (pDivisionList);  
END;

TPAを渡すと、TPAが1行として返されます(正しい)。CFLを渡すと、CFLが1行として返されます(正しい)。ただし、私がやりたいのは、TPA、CFLを渡して、('TPA'、'CFL')のWHERE CTA_DIVISIONのように実行し、2行のデータを返すことですが、それは起こりません。行を返していません。その文字列を渡して2行を返すには、何を変更する必要がありますか?TIA

4

3 に答える 3

4

私はあなたがOracleを適応させることができると思います:あなたのケースに合うようにバインド変数としてリストを渡します。

varchar2をリストまたは単一の値として機能させるには、をpDivisionList(おそらく1つの値の)配列に解析し、それを別のプロシージャ(プロシージャ内で定義できる)に渡す必要があります。

@frustratedwithformsdesignerのソリューションに対するWRTでは、動的SQLはsql-injectionの影響を受けやすくなっています。そのような解決策に注意してください。

于 2011-03-31T17:45:03.217 に答える
0

より簡単な方法は次のとおりです。

SELECT distinct CTA_DIVISION
FROM cti_account 
WHERE INSTR(','||pDivisionList||',', ','||CTA_DIVISION||',') > 0;
于 2011-04-01T06:14:57.897 に答える
0

これはおそらく動的 SQL で実行できます。次のようにクエリを作成します。

sql_str := 'SELECT distinct CTA_DIVISION
  FROM cti_account 
  WHERE CTA_DIVISION in ('||pDivisionList||')'; 

その上で使用execute immediateします。もちろん、pDivisionListとしてフォーマットされていることを確認する必要があります"'a','b','c'"

もちろん、動的 SQL には潜在的な SQL インジェクションの問題があるため、 に何が入るかを完全に制御できるようにしてくださいpDivisionList

于 2011-03-31T17:42:40.000 に答える