我是Oracle和SQL的新手,我正在尝试从SQL * Plus中执行一个简单的测试功能。我的函数叫做tf(对于Test Function),它在一个名为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;
/
我可以使用以下命令成功将此功能加载到Oracle中;
SQL> start ./tf.sql
执行此命令后,SQL * Plus只会声明;
Function created.
当我从SQL * Plus命令提示符执行以下命令时(在我调用set serveroutput后);
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
对此的任何帮助都将非常感激。
提前致谢。
克雷格
答案 0 :(得分:6)
exec
不适用于函数,因为它不知道如何处理返回值。这类似于常规的PL / SQL语句;如果你调用一个函数,你必须将返回值赋给某个东西。
如果要在SQL * Plus中使用函数,则应改为使用SQL:
select tf('asdf') from dual;
此外,您永远不应该在SYSTEM中创建对象。这可能会导致一些非常奇怪的问题。
答案 1 :(得分:3)
继续@jonearles的回答,突出了SQL * Plus的观点中的函数和过程之间的区别,以及@MS Stp的评论,运行它的一种方法是:
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
传递给另一个函数。