2017-09-01 1 views
1

C#変数PL/SQL変数値に対するリストとしての入力パラメータ値の値の確認方法はありますか?

string val_1 = 'A','B','C'; 

Iは、PL/SQLのメソッドのパラメータとして、この変数を渡し、次のようにPL/SQLの方法で別の変数の値をチェック:

Procedure x(val_1 IN VARCHAR2) 
IS 
    val_2 VARCHAR2(1):= 'A'; 
BEGIN 
    IF (val_2 IN (val_1)) THEN 
     dbms_output.put_line('matched'); 
    END IF; 
END; 

この状態が動作していません。私が間違って何をしているのか?

+1

'val_1'はコンマと引用符を含む文字列だけのように見えます。 'val_2'がそれにマッチするためには、 'A'、 'B'、 'C​​'の値を持たなければなりません。おそらく、ネストされたテーブル配列を渡し、 'val_2のval_1のメンバー 'を使うか、連想配列を使ってその値をループさせるか、正規表現を使って文字列を保持して一致させる必要があります。 (私はこれを答えにしたいと思いますが、今はちょっと時間がかかりません) –

+2

おそらく 'if '、' || val1 || '、' like '%、' || val2 || '、%それから...?あなたの最初の文字列は少し疑わしいですが、あなたは実際に '' A ''、 'B'、 'C​​' 'を渡しているのですか、' A、B、C'を渡していますか? – Boneist

+0

両方の方法が機能していません –

答えて

1

var1 varchar2(1000) := 'a','b','c' - Incorect
var1 varchar2(1000) := q'~ 'a','b','c'~'; - 正しい
var1 varchar2(1000) := 'a,b,c'; - 正しい

somthing in (varchar2_variable) is incorrect。 oracleにはこのような構成はありません。

単純なソリューションの例。しかし、どちらのソリューションも将来問題を引き起こす可能性があります。より柔軟なバージョンはregexp

declare 
var1 varchar2(1000) := q'~ 'a','b','c' ~'; 
to_test varchar2(100) := 'a'; 
begin 
if instr(var1,to_test) > 0 then 
    dbms_output.put_line('Matched'); 
end if; 
end; 

declare 
var1 varchar2(1000) := q'~ 'a','b','c' ~'; 
to_test varchar2(100) := 'a'; 
begin 
if regexp_instr(var1,to_test) > 0 then 
    dbms_output.put_line('Matched'); 
end if; 
end; 
+0

あなたは私の質問が正しくないと思います。 var_1変数は、PLSQLメソッド呼び出しの実行中に渡されるC#変数です。 –

0

となります。配列を渡すことができれば、これははるかに簡単になります。

まだお持ちでない場合、配列型を作成します。代わりにプレーンな文字列のパラメータとしてその

create or replace type shortlist as table of varchar2(100); 

用途:

create or replace procedure x 
    (val_1 in shortlist) 
is 
    val_2 varchar2(1) := 'A'; 
begin 
    if val_2 member of val_1 then 
     dbms_output.put_line('matched'); 
    end if; 
end; 

をプロシージャを呼び出します。

begin 
    x(shortlist('A','B','C')); 
end; 

または何とかC#で配列を定義する(私はC#を知らない)

string[] names = new string[3] {"A", "B", "C"}; 

と、ここで説明するようにプロシージャを呼び出す:Passing array to Oracle procedure from c#

関連する問題