2011-03-31 2 views
1

가 여기 내 전체 저장 프로 시저입니다 작동하지 저장 프로 시저 :오라클 (여기서 문자열)

CREATE OR REPLACE PROCEDURE "CTI"."TEMP_DIVISION" 
(
    pDivisionList in varchar2, 
    out_cursor out SYS_REFCURSOR 
) 
as 
begin 
    open out_cursor for 
    SELECT distinct CTA_DIVISION 
    FROM cti_account 
    WHERE CTA_DIVISION in (pDivisionList); 
END; 

내가 TPA에 전달하는 경우는 1 행 (올바른)와 같은 TPA를 반환합니다. CFL을 전달하면 CFL이 1 행 (올바른)으로 반환됩니다. 그러나, 내가 뭘하고 싶은지, TPA, CFL을 통과하고 ('TPA', 'CFL')에서 2 행의 데이터를 반환하는 CTA_DIVISION과 같이 실행해야하지만, 그런 일은 일어나지 않습니다. 행을 반환하지 않습니다. 해당 문자열을 전달하고 2 행을 반환하려면 무엇을 변경해야합니까? TIA

+1

가능한 중복 http://stackoverflow.com/questions/242771/oracle-stored-procedure-with-parameters -for-in-clause) – DCookie

답변

4

Oracle: passing a list as bind variable을 귀하의 케이스에 맞게 조정할 수 있다고 생각합니다.

varchar2를 목록 또는 단일 값으로 사용하려면 pDivisionList을 배열 (가능하면 하나의 값)로 구문 분석하고 다른 절차 (프로 시저 내에서 정의 할 수 있음)에 전달해야합니다.

WRT는 @frustratedwithformsdesigner의 해결책에 대해 동적 SQL은 SQL 주입의 영향을받습니다. 이러한 솔루션을주의하십시오.

+0

키가'어디에서 empno (SELECT * FROM TABLE (CAST (? as NUMBER_LIST_TYPE)))'... 매우 영리합니다. 이 트릭에 필요한 최소 버전이 있습니까? – FrustratedWithFormsDesigner

+1

그게 효과가있다. 또한 이렇게하면 http://asktom.oracle.com/pls/apex/f?p=100:11:0:::P11_QUESTION_ID:110612348061 –

+1

@frustratedwithformsdesigner Correct가 도움이되었습니다. 나는 그것을 강조 했어야했다. 확실하지는 않지만 CAST가 11g에 도입되었을 수도 있습니다. TYPE은 꽤 오랫동안 사용되어 왔습니다. – nix

0

이것은 아마도 동적 SQL을 사용하여 수행 할 수 있습니다. 다음과 같은 쿼리를 작성하십시오.

sql_str := 'SELECT distinct CTA_DIVISION 
    FROM cti_account 
    WHERE CTA_DIVISION in ('||pDivisionList||')'; 

그런 다음 execute immediate을 사용하십시오. 물론 pDivisionList"'a','b','c'"으로 포맷되어 있는지 확인해야합니다.

동적 SQL은 잠재적 인 SQL 주입 문제를 가지고 있으므로 pDivisionList에 들어가는 것에 대한 완전한 제어권을 가지고 있는지 확인하십시오.

0

간단한 방법은 다음과 같습니다

SELECT distinct CTA_DIVISION 
FROM cti_account 
WHERE INSTR(','||pDivisionList||',', ','||CTA_DIVISION||',') > 0; 
[IN 절 매개 변수와 Oracle 저장 프로 시저 (의