2011-12-07 28 views
0

Javaコードからストアド・プロシージャに渡されるコンマ区切りの文字列があります。例oracle pl sqlの文字列を分割する

管理、役割、ユーザー

については

今、私はこの文字列を分割し、2番目の質問がされているOracle PL/SQLの配列

にそれを移入しますか、この機能はSQLサーバーで実行すると有効になりますか? SQL側で

+0

これは悪いDBデザインのような匂いがします。たぶん、データの正規化について考えるべきでしょう –

答えて

0

は、T-SQLにはネイティブの分割機能はありませんが、同じby Erland Sommarskog here

を行うCLR機能の良い例は、それはOracleの機能は、SQLに有効であるとは考えにくいのですがありますSQL文は通常、あるフレーバから別のフレーバへの変換が必要です。ただし、クライアントがodbcや.netなどの共通ドライバを使用している場合は、この機能をクライアントに移行して両方のデータベースで動作させることができます。使用の

2
function str2tbl  (p_str in varchar2,p_delim in varchar2 default '.') return myTableType 
    is 
     l_str  long default p_str || p_delim; 
     l_n  number; 
     l_data  myTableType := myTabletype(); 
    begin 
     loop 
      l_n := instr(l_str, p_delim); 
      exit when (nvl(l_n,0) = 0); 
      l_data.extend; 
      l_data(l_data.count) := ltrim(rtrim(substr(l_str,1,l_n-1))); 
      l_str := substr(l_str, l_n+length(p_delim)); 
    end loop; 
    return l_data; 
    end str2tbl; 

例:

TYPE myTableType is table of varchar2(100); 
v_array mytabletype; 
v_array := str2tbl (string, ','); 
0

クエリ以下で試してくださいなります

--Creating function 
CREATE FUNCTION GetSplittedData(@dataToSplit VARCHAR(500)) 
RETURNS VARCHAR(500) 
AS 
BEGIN 
    RETURN (''''+REPLACE(@dataToSplit, ',', ''',''')+'''') 
END 

--Calling function with data 
SELECT DBO.GetSplittedData('admin,role,user') 

更新:あなたが関数を記述することができますが、これはSQL Serverに

1

に応じています文字列を解析するために各データベースで新しい値が追加されるとパーサのルールに違反する危険性がありますe(あなたの場合、「Admin、Super」をユーザーとして追加することを決めたと想像してください。これを行うより良い方法は、この目的のために設計された構造を使用することです。オラクルで

は、次の操作を行うことができます:

create type Varchar10List as table of varchar(10); 

create function YourFunction (pRoles Varchar10List) as 
... 

しかしこれはSQL Serverの動作しないでしょう。 SQL Serverには表形式のパラメータがありますが、これは似ていますが、まだJavaではサポートされていません。

もっと一般的にやりたければ、非常に単純なXMLとしてリストを渡すことができます。現時点でほとんどのデータベースサーバーにはXMLパーサーが統合されているため、Oracleを使用しているかSQL Serverを使用していても、XMLをより使いやすいものに変換するのは簡単です。