0

SOURCE 列の下のビュー i には、次の値があります。

SRC - TERM - randomtext - LOCATION (ソース列の形式に関する参考情報)

ABC DE RANDOMJIBBERISH MORE RANDOMJIBBERISH FORWARD
ARY HES RANDOMJIBBERISH MORE RANDOMJIBBERISH  BACKWARD
IGHE UER RANDOMJIBBERISH MORE RANDOMJIBBERISH  LEFT

これで、ソースに基づいてそのビューを検索する必要があるクエリができました。これは完全に正常に機能します。

SELECT 
    t.DATE_, t.PX_LAST
FROM 
    THIS.TABLE_NEW t 
WHERE
    t.DATE_ >= '2003-03-02'
    AND t.DATE_ <= '2013-03-02' 
    AND t.SOURCE LIKE 'ABC DE % FORWARD' --Where the magic happens
    AND t.SOURCE LIKE '%'||'1M'||'%'
    AND t.PX_LAST is NOT NULL
ORDER BY 
    t.DATE_ ASC;

問題は、これをストアド プロシージャに実装しようとすると、取得するパラメータにパーセント記号を挿入する必要があることです。これは機能しません。特に、inSource を使用してソースを探す部分です。

PROCEDURE Get_It
(
    inSource VARCHAR2,
    inStartDate DATE,
    inEndDate DATE,
    inLength VARCHAR2,
    inRC1 OUT SYS_REFCURSOR
) AS
BEGIN
OPEN inRC1 FOR
SELECT t.DATE_, t.PX_LAST
FROM THIS.TABLE_NEW t WHERE

t.DATE_ >= inStartDate
AND t.DATE_ <= inEndDate 
AND t.SOURCE LIKE inSource --Where the magic needs to happen 
AND t.SOURCE LIKE '%'||length||'%'
AND t.PX_LAST is NOT NULL
ORDER BY t.DATE_ ASC;
END GET_IT;

したがって、基本的には、文字列の MIDDLE ( inSource) の最後の単語と最後から 2 番目の単語の間に、常にパーセント記号を挿入する必要があります。手動で文字列に入れることができるため、クエリで実行できましたが、実際のストアドプロシージャでは、文字列を操作する方法がわかりません。

4

2 に答える 2

0

inSourcelikeの値を渡し'ABC DE FORWARD'、手順でそれを'ABC DE % FORWARD'- 常に 2 番目と 3 番目の単語の間にある - に変換したいと仮定すると%、文字列を切り刻んで再構築することで混乱するか、単純なことができますregexp_replace():

AND t.SOURCE LIKE regexp_replace(inSource, ' ', ' % ', 1, 2)
AND t.SOURCE LIKE '%'||inLength||'%'

これにより、スペースがスペースで埋められたパーセント記号に置き換えられ、位置 1 (文字列の先頭) から開始され、2 番目のインスタンスにのみ適用されます。したがって、最初のスペースはスキップされ、2 番目と 3 番目の単語の間のスペースにのみ影響します。 .

これを実証するには:

select regexp_replace('ABC DE FORWARD', ' ', ' % ', 1, 2)
from dual;

REGEXP_REPLACE('
----------------
ABC DE % FORWARD
于 2013-04-02T17:39:29.120 に答える