2017-09-26 338 views
0

我正在嘗試使用IN執行此查詢,但是如果類型是CLOB不起作用。 我需要的參數p_rut是CLOB和查詢我需要使用IN,因爲它會有一個選擇返回更多的行比較。 如何在IN中使用參數CLOB?在IN中使用CLOB? ORACLE

PROCEDURE INSERT_TEST (o_dat out o_cursor, p_rut in CLOB) 
AS 
BEGIN 

OPEN o_dat FOR  

select * from cliente 
     where rut in (p_rut); 

END; 

表CLIENTE

CREATE TABLE CLIENTE 
(
    PRODUCTO  VARCHAR(50), 
    RUT   VARCHAR2(50), 
    DV   VARCHAR2(50), 
    FONO1   VARCHAR2(50), 
    FONO2   VARCHAR2(50), 
    FONO3   VARCHAR2(50), 
    FONO4   VARCHAR2(50), 
    FONO5   VARCHAR2(50), 
    FONO6   VARCHAR2(50),    
    COMUNA  VARCHAR2(50), 
    EDAD   NUMBER(8), 
    SEXO   NUMBER(8), 
    DIASMORA  NUMBER(8), 
    AÑODEUDA  NUMBER(8), 
    PAGOMINIMO NUMBER(8), 
) 
; 
+2

RUT是varcahr2(50),因此您試圖將其與單個clob進行比較。無論您將多少個varchar2字符串填充到SINGLE clob中,它都將保持單一。你需要一個非常不同的方法。 –

+0

不管「p_rut」的數據類型如何,你寫的都沒有意義。你對'p_rut'是什麼意思**是一個用逗號分隔的值列表,你需要比較'rut'嗎? – mathguy

+0

目前還不清楚,爲什麼你需要'IN'?我會明白'p_rut'需要是CLOB。但爲什麼IN? – LiborStefek

回答

0

您可以使用:

DBMS_LOB.INSTR (
    lob_loc IN CLOB  CHARACTER SET ANY_CS, 
    pattern IN VARCHAR2 CHARACTER SET lob_loc%CHARSET, 
    offset  IN INTEGER := 1, 
    nth  IN INTEGER := 1) 
    RETURN INTEGER; 

PROCEDURE INSERT_TEST (o_dat out o_cursor, p_rut in CLOB) 
AS 
BEGIN 

OPEN o_dat FOR  

select * from cliente 
     where DBMS_LOB.INSTR (p_rut,rut)>0; 

END; 
+0

但是,這做了一個不同的事情。它測試內部參數'p_rut'中是否有'rut'。 – LiborStefek

+0

clob是一個很長的字符串,你不能在IN中使用,所以我認爲你想看看在p_rut中至少存在一次車轍。請解釋一下你試圖達到的目標,這樣我可以進一步提供幫助。 –

0

使用它不能使用CLOB,所以我只是做了CAST到varchar2。

select * from cliente 
     where rut in (CAST (p_rut AS VARCHAR2(100));