从Oracle SQL*Plus中执行函数时行为不一致?

use*_*648 2 sql oracle plsql function

我是Oracle和SQL的新手,我正在尝试从SQL*Plus中执行一个简单的测试函数.我的函数叫做tf(用于测试函数),它在一个名为tf.sql的文件中定义如下;

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;
/
Run Code Online (Sandbox Code Playgroud)

我可以使用以下命令成功将此函数加载到Oracle中;

SQL> start ./tf.sql
Run Code Online (Sandbox Code Playgroud)

执行此命令后,SQL*Plus只会说明;

Function created.
Run Code Online (Sandbox Code Playgroud)

然后我从SQL*Plus命令提示符执行以下命令(在我调用set serveroutput on之后);

SQL> exec dbms_output.put_line(SYSTEM.TF('Hello'));
Run Code Online (Sandbox Code Playgroud)

我得到以下输出;

Argument = Hello
0

PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试直接从SQL*Plus命令提示符执行我的函数,请使用以下命令;

SQL> exec SYSTEM.TF('Hello');
Run Code Online (Sandbox Code Playgroud)

然后我收到来自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
Run Code Online (Sandbox Code Playgroud)

有人能够为我阐明这一点吗?我无法弄清楚为什么我的函数似乎在第一种情况下成功执行,但在第二种情况下不成功.

如果我从SQL*Plus命令提示符执行以下命令;

SQL> select * from user_objects where object_name = 'TF';
Run Code Online (Sandbox Code Playgroud)

然后我得到以下结果返回;

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
Run Code Online (Sandbox Code Playgroud)

对此的任何帮助都将非常感激.

提前致谢.

克雷格

Jon*_*ler 6

exec不能使用函数,因为它不知道如何处理返回值.这类似于常规的PL/SQL语句; 如果你调用一个函数,你必须将返回值赋给某个​​东西.

如果要在SQL*Plus中使用函数,则应使用SQL代替:

select tf('asdf') from dual;
Run Code Online (Sandbox Code Playgroud)

此外,您永远不应该在SYSTEM中创建对象.这可能会导致一些非常奇怪的问题.

  • 是或他也可以在annon PL/SQL块中使用host/bind或local变量来获取返回值 (2认同)