2009-05-19 7 views
3

다음과 같이 PL/SQL 저장 프로 시저가 있다고 가정합니다.PL/SQL 매개 변수 값이 기본값으로 설정되었는지 어떻게 확인합니까?

PROCEDURE do_something(foo VARCHAR2 DEFAULT NULL) IS 
BEGIN 
    /* Do something */ 
END; 

이제 do_something가 두 가지 다른 방법으로 호출된다고 가정합니다.

/* Scenario 1: The 'foo' parameter defaults to NULL */ 
do_something(); 

/* Scenario 2: The 'foo' parameter is explicitly set to NULL */ 
do_something(foo => NULL) 

어떤 시나리오가 호출되는지 확인하기 위해 do_something 프로 시저를 정의 할 수 있습니까? 그것?

편집 :이 절차에 대한 내 의도를 명확히하기 :

FUNCTION find_customer(name VARCHAR2 DEFAULT NULL, number VARCHAR2 DEFAULT NULL) RETURN NUMBER IS 
BEGIN 
    /* Query the "customer" table using only those parameters provided */ 
END; 

다음은 원하는 SQL 절과 함께이 절차를 사용하는 예입니다.

/* SELECT * FROM customer WHERE customer.name = 'Sam' */ 
find_customer(name => 'Sam') 

/* SELECT * FROM customer WHERE customer.name = 'Sam' AND customer.number = '1588Z' */ 
find_customer(name => 'Sam', number => '1588Z') 

/* SELECT * FROM customer WHERE customer.name = 'Sam' AND customer.number IS NULL */ 
find_customer(name => 'Sam', number => NULL) 

/* SELECT * FROM customer WHERE customer.name IS NULL */ 
find_customer(name => NULL) 

/* SELECT * FROM customer WHERE customer.name IS NULL AND customer.number IS NULL */ 
find_customer(name => NULL, number => NULL) 
+0

왜 시나리오를 구분하고 싶습니까? 결국 foo는 같은 가치를 지니지 않을까요? – Petros

+0

페트 로스, 잘하면 내 최신 편집이 내가 왜 이러는지 명확히하는 데 도움이 될 것입니다. –

+0

내게있어 당신이 정말로 후인 것은 두 번째 종류의 "NULL"입니다. "UNCONSTRAINED"또는 "UNSPECIFIED"- 당신은 디폴트 값으로 마법 값을 사용할 수 있지만, 실제로는 래퍼 프로 시저를 명시 적으로 생성하는 것이 좋을 것입니다. 많은 경우, 생성 할 스크립트를 작성할 수 있습니다. –

답변

7

당신은 절차에 과부하 대신를 사용하여 수 기본값 :

PROCEDURE do_something(foo VARCHAR2) IS 
BEGIN 
    /* Do something */ 
END; 

PROCEDURE do_something IS 
BEGIN 
    /* here you know: no argument. Then call do_something(null) */ 
END; 
+0

+1 매우 명확하고 효과적입니다. 불행히도, 나는 완전히 자신을 분명히하지 않았다. 많은 매개 변수가 기본값으로 설정 될 수있는 프로 시저를 작성 중입니다. 오버로딩하려면 많은 순열이 필요합니다. 그러나 내가 묻는 질문에 당신이 완벽하게 답했다는 것을 감안할 때, 당신은 받아 들여진 대답을 받아야한다고 생각합니다. –

+1

많은 절차에 대해 걱정할 필요가 없습니다. PL/SQL에서 수년간 작업하지 않았기 때문에 비공개로 만들 수 있는지 잊었습니다. 가능한 경우 문제가되지 않습니다. 중복 된 코드가 없는지 확인하십시오. 하나의 프로 시저를 다른 프로 시저에서 호출하십시오. 로직을 포함하고 "공개"프로 시저에서 호출 된 추가 인수를 갖는 세 번째 (개인?) 프로 시저를 작성할 수 있습니다. –

+1

개인 절차 자체는 가질 수 없지만 패키지 내에 개인 절차가있을 수 있습니다. –

8

defaultin 대신 g to null, 생략 된 매개 변수 값을 실제 세계에서 사용하지 않을 기본값으로 지정 하시겠습니까? 사용하는 값은 일부 도메인에 속해야하므로 해당 도메인 외부의 값을 선택하십시오.

PROCEDURE의 do_something (foo를 VARCHAR2의 DEFAULT "* # @ ')는

l_foo VARCHAR2(32000); -- local copy of foo parm 

IF foo = '*#@' THEN 

-- I know the parm was omitted 

    l_foo := NULL; 

ELSE 

    l_foo := foo; 

END IF; 

END를 BEGIN이고;

+1

이것은 나의 생각이기도하다. 실제 기본값은 프로 시저 본문에 구현 될 수 있습니다. –

+2

동감이지만 실제로는 인쇄 할 수없는 문자를 사용합니다. 일반적으로 chr (7) [경고음의 ASCII 코드입니다.] –

+0

동의! 나는이 옵션도 좋아하는데, 특히 인쇄 할 수없는 문자에 대한 게리의 의견입니다. –

관련 문제