2017-09-26 340 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));