2010-12-09 2 views
1

함수 서명을 CLOB 유형의 매개 변수 (p_param)로 변경해야합니다. 이전 유형은 nvarchar2입니다. 이로 인해 기존 코드가 || 연결하기.즉시 실행을위한 PL/SQL의 Concat CLOB

여기에 기존 코드 조각이 있는데, 이는 NVarchar2에서 잘 작동했지만 분명히 || CLOB를 concat하려면 nvarchar2와 같은 문자를 처리합니다. nvarchar2의 문자 제한을 초과하면 문제가됩니다. 표현 잘못된 유형

이다 :

execute immediate  
    'select p.person_id 
    from person p where p.id in (' || p_param || ')' 
bulk collect into persons; 

나는

PLS-00382는,이 컴파일되지 않습니다

execute immediate 
    concat(concat('select p.id from person p where p.person_id in(',p_param),')') 
    bulk collect into members; 

, 나는 오류가 발생하는 것으로 위의 조각을 변경하려

저는 PL/SQL을 처음 사용하는데 도움을 주셔서 감사합니다.

+0

VARCHAR2 또는 NVARCHAR2 변수에 적합하지 않을 정도로 오래 사람을 구성하고 있습니까? 나는 오라클이 오랫동안 SQL을 갖고 싶어한다고 생각하지 않는다. 나는이 접근 방식에 전적으로 의문을 품을 것이다. –

+0

예, 전적으로 동의합니다. 일부 코드를 유지 관리하고 있으며 전체 내용을 다시 작성하지 않으려합니다. – Andy

답변

3

은 당신이 DBMS_SQL을 사용하는 코드의 특정 조각을 수정해야로서, 나는 강하게 완전히 동적 SQL 접근 방식을 제거하기 위해 그것을 변경하는 것을 고려한다. 대신, 내가 (후속 응답이 already done this있다)를 CLOB를 취할 수정, 톰의 str2tbl 기능을 것입니다 후 최소한

select p.person_id 
    bulk collect into persons 
    from person p 
where p.id in (select column_value 
        from str2tbl(p_param)) 

에 코드를 변경, 그건 당신이 비의 큰 숫자를 만들지 않도록 할 것 공유 구문에 대한 엄격한 구문 분석, 하드 구문 분석 횟수 및 구문 분석에 소요되는 시간을 줄이고 공유 풀에 대한 부담을 줄입니다. 또한 SQL 주입 공격과 같은 위험을 줄일 수 있습니다.

+1

+1 - 이것이 내가 취할 접근법입니다. – APC