2013-05-01 3 views
0

배열을 PL/SQL 패키지 함수에 전달 중입니다. IN 절이있는 함수 내에서이 배열을 쿼리에 사용하려면이 작업을 수행하고 있습니다.오라클 함수에 배열 전달

같은 패키지 내 선언은 보인다 : 나는 익명 블록에서 실행하면 동일한 쿼리가 잘 실행

select a.id, a.geom from Table_FIELD a where a.id in (select * from table (in_feature_ids)) and sdo_filter(A.GEOM,mdsys.sdo_geometry(2003,4326,NULL,mdsys.sdo_elem_info_array(1,1003,3), mdsys.sdo_ordinate_array(0,57,2.8,59)),'querytype= window') ='TRUE' 

을 다음과 같이 쿼리를 발사하고 내 PL/SQL 기능에서

create or replace 
PACKAGE selected_pkg IS 

    TYPE NUM_ARRAY IS TABLE OF NUMBER; 

    FUNCTION get_selected_kml(
     in_layer  IN NUMBER, 
    in_id  IN NUMBER, 
     in_feature_ids IN selected_pkg.NUM_ARRAY, 
     in_lx   IN NUMBER, 
     in_ly   IN NUMBER, 
     in_ux   IN NUMBER, 
     in_uy   IN NUMBER 
    ) 
    RETURN CLOB; 

END selected_pkg; 

like

CREATE TYPE num_arr1 IS TABLE OF NUMBER; 

declare 
    myarray num_arr1 := num_arr1(23466,13396,14596); 
BEGIN 
    FOR i IN (select a.id, a.geom from Table_FIELD a where a.id in (select * from table (myarray)) and sdo_filter(A.GEOM,mdsys.sdo_geometry(2003,4326,NULL,mdsys.sdo_elem_info_array(1,1003,3), mdsys.sdo_ordinate_array(0,57,2.8,59)),'querytype= window') ='TRUE' 
    loop 
     dbms_output.put_line(i.id); 
    end loop; 
end; 

아래와 같이 함수를 호출하여 실행하려고하면

--Running function from passing array for IDs 
declare 
    result CLOB; 
    myarray selected_pkg.num_array := selected_pkg.num_array(23466,13396,14596); 
begin 
    result:=SELECTED_PKG.get_selected_kml(3, 19, myarray, 0.0,57.0,2.8,59); 
end; 

나는 오류가 점점 오전

ORA-00904: "IN_FEATURE_IDS": invalid identifier 

은 누군가가 나 그것의 원인을 이해하는 데 도움이 시겠어요? 는 SQL 엔진이 인식하지 않는

덕분에, 앨런

+0

Alex, 예 위의 질문에서 수정되었습니다 (복사 붙여 넣기에서 오류가 발생했습니다). 그러나 나는 그것을 올바르게 달리고있다. – AlanShar

답변

2

당신은 SQL 쿼리에 PLSQL에서 선언 된 유형을 쿼리 할 수 ​​없습니다.

데이터베이스에서 numarr1 유형을 선언 했으므로 첫 번째 예제가 작동하지만 selected_pkg.num_array 유형은 패키지에서 선언되었습니다.

좋은 요약 here

+0

Stevo, 기능을 어떻게 얻을 수 있을지 제안 해 주시겠습니까? – AlanShar

+0

@AlanShar는 Alex Poole의 답변을 참조하십시오. –

2

나는 확실히 당신이 얻고있는 오류를 재현 할 수 없습니다; 익명 블록은 in_feature_ids을 참조하지 않으며 패키지는 동적 SQL을 사용하지 않는 한 런타임에서가 아니라 컴파일시이를 인식하지 못한다고보고해야합니다. 함수 몸체를 볼 수 없으면 어떻게되는지 잘 모르겠습니다.

그러나 SQL 문에서 PL/SQL 정의 유형을 사용할 수는 없습니다. 어떤 시점에서 table(in_feature_ids)은 오류가 발생합니다. ORA-21700을 시험해 보았습니다. 새로운 것이므로 ORA-22905를 기대합니다. 무엇이든 오류, 당신은하지 패키지 내에서, 스키마 레벨에서 정의 된 유형을 사용해야합니다, 그래서 이것은 (간결을위한 공간 물건 생략) 작동합니다

CREATE TYPE num_array IS TABLE OF NUMBER; 
/

CREATE OR REPLACE PACKAGE selected_pkg IS 
    FUNCTION get_selected_kml(
     in_layer  IN NUMBER, 
     in_id   IN NUMBER, 
     in_feature_ids IN NUM_ARRAY, 
     in_lx   IN NUMBER, 
     in_ly   IN NUMBER, 
     in_ux   IN NUMBER, 
     in_uy   IN NUMBER 
    ) RETURN CLOB; 
END selected_pkg; 
/

CREATE OR REPLACE PACKAGE BODY selected_pkg IS 
    FUNCTION get_selected_kml(
     in_layer  IN NUMBER, 
     in_id   IN NUMBER, 
     in_feature_ids IN NUM_ARRAY, 
     in_lx   IN NUMBER, 
     in_ly   IN NUMBER, 
     in_ux   IN NUMBER, 
     in_uy   IN NUMBER 
    ) RETURN CLOB IS 
    BEGIN 
     FOR i IN (select * from table(in_feature_ids)) LOOP 
      DBMS_OUTPUT.PUT_LINE(i.column_value); 
     END LOOP; 
     RETURN null; 
    END get_selected_kml; 
END selected_pkg; 
/

을 ... 또한 스키마를 사용하여 호출 -level 유형 :

set serveroutput on 
declare 
    result CLOB; 
    myarray num_array := num_array(23466,13396,14596); 
begin 
    result:=SELECTED_PKG.get_selected_kml(3, 19, myarray, 0.0,57.0,2.8,59); 
end; 
/

23466 
13396 
14596 

PL/SQL procedure successfully completed. 

는 또한, 당신은 정확히 같은 유형을 사용할 필요가 있습니다뿐만 아니라 in a recent question을 논의, 같은 보이는 하나. 예를 들어 num_arr1 변수를 사용하여 함수를 호출 할 수 없습니다. 그들은 표면적으로 동일하게 보이지만 오라클과는 상이하고 서로 호환되지 않습니다.