web-dev-qa-db-ja.com

カーソルに(カンマ区切りで)渡す-単一のパラメーター

カーソルに渡される(コンマ区切りの値を含む)指定された文字列の選択を取得する必要があります。単一の変数を介して渡すことができる複数の値が存在する可能性があります。私のコードはやや似ています:

CURSOR My_Cursor( vsStr1 )
  IS
  SELECT some_field
    FROM some_table
   WHERE txtfield1 IN ( vsStr1 );    --this field is varchar2 type

vsStr1 varchar2(100) := '01, 25, 80, 100';

その変数の相互関係を渡す方法は?任意の助けいただければ幸いです。

2
Dozent

私がこれについて知っている最も単純で少し汚いトリックはxmltable()です。 xmltable()を使用すると、コンマ区切りの値のリストを行に変換できます。次に例を示します。

select * from xmltable('1, 2, 3')

COLUMN_VALUE
------------
1
2
3

列の名前がcolumn_value自動的に。これはXMLType列であり、通常の型と比較できるように変換する必要があります。たとえば、(column_value).getnumberval()または(column_value).getstringval()

これを使用すると、カーソルは次のようにコーディングできます。

set serveroutput on
declare
  l_parameters varchar2(50) := '101, 102, 103, 104';

  cursor my_cursor (params varchar2)
  is
  select employee_id, first_name, last_name from hr.employees
  where employee_id in
    (select (column_value).getnumberval() from xmltable(params));
begin
  for c in my_cursor(l_parameters) loop
    dbms_output.put_line(c.employee_id || ': ' || c.first_name || ', ' || c.last_name);
  end loop;
end;
/

101: Neena, Kochhar
102: Lex, De Haan
103: Alexander, Hunold
104: Bruce, Ernst
5
Balazs Papp

これは、サブクエリファクタリング、正規表現、およびデュアルでの階層クエリを使用したソリューションです。

CURSOR My_Cursor( vsStr1 ) IS
   WITH 
      RawInputData As (
         SELECT vsStr1 sStr1 FROM dual
         ),
      InputData As (
         SELECT regexp_substr((SELECT sStr1 FROM RawInputData),'[^,]+',1,level) CurrentsStr1 
         FROM dual 
         CONNECT BY level <= length((SELECT sStr1 FROM RawInputData)) 
            - length(replace((SELECT sStr1 FROM RawInputData),',',''))+1
      )  
   SELECT some_field
   FROM some_table
   WHERE txtfield1 IN ( SELECT CurrentsStr1 FROM InputData );

vsStr1 varchar2(100) := '01,25,80,100';
4
Leigh Riffel