2009-12-12 8 views
2

DML이 포함되지 않은 Oracle 저장 함수의 반환 값 선택은 다음 함수를 선택하기 만하면됩니다.PLSQL Developer에서 DML이 포함 된 Oracle 함수를 테스트하는 방법은 무엇입니까?

select function_name() from dual; 

함수에 DML이 들어있는 경우 (이 경우에는 함수) 위의 쿼리는 허용되지 않습니다. (ORA-14551)

어떻게이 함수의 반환 값을 선택하거나 볼 수 있습니까?

plsql 개발자가 "test"를 선택하면 plsqldev는 다음과 같은 결과를 생성합니다.

declare 
    -- Non-scalar parameters require additional processing 
    result xmltype; 
begin 
    -- Call the function 
    result := find_person(as_surname => :as_surname, 
         as_given => :as_given, 
         ad_birth_date_from => :ad_birth_date_from, 
         ad_birth_date_to => :ad_birth_date_to, 
         as_gender => :as_gender); 
end; 

"result"변수의 값은 어떻게 볼 수 있습니까?

select result from dual; 
시작/끝 블록 안에

ORA-06550: PLS-00428: an INTO clause is expected in this SELECT statement 
이 생성됩니다.

답변

0

declare 블록에서 함수

pragma autonomous_transaction 

첨가가 듀얼

select find_person(arguments) from dual; 

으로부터 선택 될 수 있도록 만들어 이후 함수의 DML은 함수에 전달 된 인수를 로깅하기위한 것이므로 autonomous_transaction을 사용할 수 있지만 그렇지 않으면 피해야합니다.

+0

정말, 당신이해야하는 것은 로그 프로 시저입니다. –

+0

로깅을 위해 autonomous_transaction을 사용하는 것은 종종 나쁜 생각입니다. 로깅을 커밋 한 다음 주 트랜잭션이 롤백되면 사용자가 실제로 수행 한 작업을 항상 확인할 수있는 것은 아닙니다. – jva

+0

-1 : 이것은 묻는 질문에 대답하지 않습니다 – kurosch

0

pragma_autonomous_transaction은 한 가지 방법입니다. 밖으로 원래 데이터베이스를 초래하여 테스트 할 수 있지만

0

을 등 DbUnit을, utPLSQL

처럼 SQL/PLSQLs 이러한 SQL에 대한 단위 테스트 도구를 테스트하고 PLSQL하는 몇 가지 오픈 소스 도구가 있습니다 PLSQL 개발자의 테스트 화면에는 두 개의 섹션이 있습니다. 위쪽 부분에는 질문에 표시된 코드가 있습니다. 테스트 함수가 생성 한 코드는 함수의 변수를 : as_surname, : as_given 등의 변수로 바 꾸었습니다. 화면의 아래 부분에서 이러한 매개 변수의 값을 입력하고 결과의 값을 볼 수 있습니다.

1

나는 XMLTYPE 함께 일하지 않은,하지만 문서는 다음과 같은 옵션을 제공합니다

dbms_output.put_line(result.getStringVal()); 
2

변화 "결과"에 "결과를"및 변수의 왼쪽 상단 모서리에있는 작은 화살표 꼬추를 클릭 그리드. "결과"를 바인드 varibale로 추가해야하며 그 유형을 지정할 수 있습니다.

가장 좋은 옵션은 clob 또는 PL/SQL 문자열입니다.

그리고 당신의 스크립트과 같이 볼 수 있었다 : 당신이 볼 수 있듯이

declare 
    result xmltype; 
begin 
    result := find_person(as_surname => :as_surname, 
         as_given => :as_given, 
         ad_birth_date_from => :ad_birth_date_from, 
         ad_birth_date_to => :ad_birth_date_to, 
         as_gender => :as_gender); 
    if result is null then 
    :result := null; 
    else 
    :result := result.GetClobVal(); 
    end if; 
end; 

, 그것은 방법으로 XMLTYPE을 반환하는 방법의 취급을 제외하고, PL/SQL 개발자가 당신을 위해 만든 것을 기본적으로 그 PL/SQL 데브 이해합니다.

당신이 결과 집합을 반환하려는 경우, 당신은 반환 할 수 커서 :

begin 
    ... 
    open :someCursor for 
    select 1 from ...; 
    ... 

당신은 "커서"에 변수 그리드에서 "someCursor"의 유형을 변경해야하거나 작동하지 않을 수 있습니다.

+0

+1 : 우수한 응답 – kurosch

0

SQL Developer는 DBMS_OUTPUT에서 잘 작동합니다. 스크립트 출력, 결과 등과 함께 별도의 탭이 있습니다. "출력 사용"버튼을 클릭하고 코드에 DBMS_Output.Put_Line(result);을 사용하십시오.