カーソルに渡される(コンマ区切りの値を含む)指定された文字列の選択を取得する必要があります。単一の変数を介して渡すことができる複数の値が存在する可能性があります。私のコードはやや似ています:
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';
その変数の相互関係を渡す方法は?任意の助けいただければ幸いです。
私がこれについて知っている最も単純で少し汚いトリックは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
これは、サブクエリファクタリング、正規表現、およびデュアルでの階層クエリを使用したソリューションです。
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';