2012-02-05 2 views
2

Oracle과 SQL을 처음 사용하고 SQL * Plus에서 간단한 테스트 기능을 실행하려고합니다. 내 함수는 tf (Test Function 용)라고 불리며 다음과 같이 tf.sql 파일에 정의됩니다.Oracle SQL * Plus에서 함수를 실행할 때 일관되지 않은 동작이 발생합니까?

create or replace 
function 
tf 
(
arg1 in varchar2 
) 
return number 

as 

return_value number; 

begin 

return_value := 0; 
dbms_output.put_line('Argument 1 = ' || arg1); 
return return_value; 

end; 
/

다음 명령을 사용하여이 함수를 성공적으로 Oracle에로드 할 수 있습니다.

SQL> start ./tf.sql 

이 명령을 실행 한 결과로 SQL * Plus는 간단히 설명합니다.

(나는에 설정 SERVEROUTPUT을 호출 한 후) 나는 다음의 SQL * Plus를 명령 프롬프트에서 다음 명령을 실행하면
Function created. 

;

SQL> exec dbms_output.put_line(SYSTEM.TF('Hello')); 

다음 출력이 표시됩니다.

Argument = Hello 
0 

PL/SQL procedure successfully completed. 

이제 SQL * Plus 명령 프롬프트에서 직접 내 함수를 실행하려고하면 다음 명령을 사용하십시오.

SQL> exec SYSTEM.TF('Hello'); 

SQL * Plus에서 다음 오류 메시지가 표시됩니다.

BEGIN SYSTEM.TF('Hello'); END; 

     * 
ERROR at line 1: 
ORA-06550: line 1, column 7: 
PLS-00221: 'TF' is not a procedure or is undefined 
ORA-06550: ;ine 1, column 7 
PL/SQL: Statement ignored 

아무에게도이 문제에 대해 알려 줄 수 있습니까? 내 함수가 첫 번째 경우에는 성공적으로 실행되는 것처럼 보이지만 두 번째 경우에는 성공적으로 실행되지 않는 이유는 해결할 수 없습니다.

SQL * Plus 명령 프롬프트에서 다음 명령을 실행하면;

SQL> select * from user_objects where object_name = 'TF'; 

다음과 같은 결과가 반환됩니다.

OBJECT_NAME 
----------- 
TF 
SUBOBJECT_NAME 
-------------- 
OBJECT_ID 
--------- 
74475 
DATA_OBJECT_ID 
-------------- 
OBJECT_TYPE 
----------- 
FUNCTION 
CREATED 
------- 
05-FEB-12 
LAST_DDL_ 
--------- 
05-FEB-12 
TIMESTAMP 
--------- 
2012-02-05:02:11:15 
STATUS 
------ 
VALID 
T 
- 
N 
G 
- 
N 
S 
- 
N 
EDITION_NAME 
------------ 
1 

위의 사항에 대한 도움은 매우 감사하겠습니다.

미리 감사드립니다.

크레이그

답변

6

exec는 반환 값으로 무엇을 해야할지하지 않기 때문에 기능이 작동하지 않습니다. 이것은 일반적인 PL/SQL 문과 유사합니다. 함수를 호출하면 반환 값을 무언가에 할당해야합니다. 당신은 SQL * 플러스에서 함수를 사용하려면

대신 SQL을 사용한다 :

select tf('asdf') from dual; 

또한,이 시스템의 객체를 생성해서는 안됩니다. 이것은 정말 이상한 문제를 일으킬 수 있습니다.

+2

True 또는 그는 annon PL/SQL 블록에서 호스트/바인드 또는 로컬 변수를 사용하여 반환 값 – MStp

3

@jonearles 함수 및 SQL에서 절차 * 플러스 '관점의 차이를 강조하고, STP의 의견을 @MS 대답은, 그것을 실행하는 하나의 방법에 이어 것은 :

variable rc number; 
exec :rc := tf('Hello'); 

Argument = Hello 

PL/SQL procedure successfully completed. 

것은 보려면 당신이 할 수있는 리턴 코드는 다음을 수행하십시오 당신은 당신이받은 오류 메시지에서 볼 수

print rc 
0 

exec 정말 익명 PL/SQL 블록의 단지 속기이다. variable을 사용하면 블록이 아닌 SQL * Plus 레벨에서 바인드 변수를 선언 할 수 있습니다. 또한 바인드 변수와 인수를 선언하고 별도의 exec 호출을 설정할 수 있습니다

variable rc number; 
variable arg varchar2(5); 
exec :arg := 'Hello'; 
exec :rc := tf(:arg); 

나는 종종 기존 프로 시저 호출을 테스트하기 위해이 구성 사용, 예를 들어, 해당 호출의 변수를 고정 값으로 바꿀 필요없이 Pro * C 코드에서 복사 한 내용. 다른 인수를 사용하여 반복적으로 호출하는 것을 더 쉽게 만들 수 있으며 여러 호출에서 변수를 다시 사용할 수 있으므로 나중에 :rc을 다른 함수에 전달할 수 있습니다.

+1

+1 +1을 얻을 수 있으며이 DECLARE rc 번호처럼 사용할 수있는 또 다른 방법이 있습니다 (length 또는 use를 지정하십시오 %유형); arg varchar2 (5) : = 'Hello'; BEGIN rc : = tf (arg); DBMS_OUTPUT.PUT_LINE (rc); END; 또는 DBMS_OUTPUT.PUT_LINE (tf (arg))을 사용할 수도 있습니다. 시작 태그와 종료 태그 사이에 – MStp

+0

@MS Stp - 내가 이전에 언급 한 내용을 당신이 생각한 것; 나는 그것이 그 자체로 유용하고 틀림없이보다 일반적인 것으로서 분리 된 대답으로 그것을 깨뜨릴만한 가치가 있다고 생각한다. –

관련 문제