2012-06-21 5 views
2

저는 PL/SQL에서 반년 동안 프로그래밍 했었고 꽤 평범한 프로그래밍 언어 (IMHO)라고 생각했습니다. 비록 내가이 기사 (Design Patterns in PL/SQL – Interface Injection for even looser coupling)와 같은 흥미로운 기사를 우연히 발견했지만, 나는 독서하는 것이 좋습니다. 종속성 삽입에 대해 말하면, 서브 루틴을 매개 변수로 전달하는 특별한 기능이 빠져 있습니다. 가능한가? 방법? 예를 들어PL/SQL은 매개 변수로 함수를 전달합니다.

, 내가 자바 스크립트에서이 같은 코드를 가지고 상상 :

function tell_me (printer) { 
    printer ("hello"); 
} 

tell_me (function() { 
    console.log (word); 
}); 

는 PL/SQL에서 비슷한 일을 할 수 있습니까?

+1

PL/SQL에서 매개 변수로 서브 루틴을 전달해야하는 경우 문제를 재검토해야합니다. 실제로 PL/SQL에서 해결해야합니까 ?? –

+0

@ NWest, 네가 맞아. 두 개의 서브 루틴을 느슨하게 결합 할 수있는 한 가지 방법 이겠지. 사실, PL/SQL에 대해 좀 더 자세히 살펴보기 위해 호기심에서 벗어났습니다. – Bolhoso

+0

@NWest, 반사 프로그래밍을 인용하고 여기에 실제 문제가있다. (필자는 약간의 차이가 있지만 가치가있다) : 내 pl/sql 모듈은 거대한 XML로 REST API를 호출해야한다. 각 XML을 손으로 작성하고 싶지 않으므로 각 엔터티를 TYPE에 매핑했습니다. 루틴에 전달 된 유형을 모른 채 유형의 필드를 가져 와서 런타임 중에 변경하는 것이 가능합니까? XML을 PL/SQL 유형으로 변환하는 모듈을 빌드 할 수 있습니다 (반대의 경우도 마찬가지입니다). API의 유형을 변경하면 전체 하나의 conversino 기능을 각 유형에 추가하는 대신 PL/SQL 유형의 유지 관리 만 필요합니다. – Bolhoso

답변

5

매개 변수로 함수를 직접 전달할 수 없습니다. 가장 좋은 방법은 문자열로 전달 된 함수를 실행하기 위해 동적 PL/SQL을 사용하는 것입니다. 나는 이것을 추천하지 않는다. 몇 가지 경우에 동적 PL/SQL을 사용할 수 있지만 여러 가지 문제가 발생할 수 있습니다.

DECLARE 
    PROCEDURE inner_function 
    IS 
    BEGIN 
     dbms_output.put_line('Output'); 
    END; 

    PROCEDURE tell_me(parm_function varchar2) 
    IS 
    BEGIN 
     EXECUTE IMMEDIATE 'BEGIN '||parm_function||'(); END;'; 
    END; 

BEGIN 
    tell_me('inner_function'); 
END; 

DBMS_OUTPUT은 버퍼에 "출력"을 가져야한다.

inner_function이 범위를 벗어날 수 있으므로 작동하지 않을 수 있습니다. 이 경우 스키마 자체에서 프로 시저를 정의하십시오.

관련 문제