我们可以调用程序里面的函数,但是可以在函数内部调用程序吗? 我试过但我不能在函数内部调用程序。 你能告诉我为什么我们不能调用函数内的程序吗?
答案 0 :(得分:9)
“我试过,但我不能在函数内部调用过程。”
你是怎么试的?你尝试了什么?你以什么方式失败了?
因为允许在函数内调用过程。因此,如果它不适合您,那么您的代码中的原因是错误的。如果没有提供比现在更多的信息,我们就无法诊断出来。
两个最可能的原因是:
您的代码中存在语法错误,导致其无法编译,或者其他一些错误导致运行时异常。
该功能可能在程序的范围内,但反之亦然。
当我们在查询中调用函数(例如发出DML)并且在SELECT语句中调用函数时,您的过程正在执行某些操作。
答案 1 :(得分:4)
我将在这里猜测你首先声明了函数,程序如下:类似于:
DECLARE
FUNCTION my_func RETURN NUMBER IS
BEGIN
RETURN 2;
END my_func;
PROCEDURE my_proc IS
BEGIN
DBMS_OUTPUT.PUT_LINE(my_func + 1);
END my_proc;
BEGIN -- main
my_proc;
END; -- main
如上所示,首先声明函数,您可以从过程中调用该函数。但是,如果您尝试类似以下内容(在过程之前声明的函数和函数调用过程):
DECLARE
FUNCTION my_func RETURN NUMBER IS
BEGIN
my_proc;
RETURN 2;
END my_func;
PROCEDURE my_proc IS
BEGIN
DBMS_OUTPUT.PUT_LINE('22');
END my_proc;
BEGIN -- main
DBMS_OUTPUT.PUT_LINE(my_func);
END; -- main
编译将失败,因为my_func无法“看到”my_proc。为了使它工作,你需要输入my_proc的'prototype'声明,如下所示:
DECLARE
PROCEDURE my_proc;
FUNCTION my_func RETURN NUMBER IS
BEGIN
my_proc;
RETURN 2;
END my_func;
PROCEDURE my_proc IS
BEGIN
DBMS_OUTPUT.PUT_LINE('22');
END my_proc;
BEGIN -- main
DBMS_OUTPUT.PUT_LINE(my_func);
END; -- main
分享并享受。
答案 2 :(得分:1)
我的猜测是您使用的是call proc
或exec proc
。请参阅下面的示例如何调用该过程。
CREATE OR REPLACE function f() return number as
BEGIN
your_proc;
another_proc_with_param(2, 'John');
return 0;
EXCEPTION when others then return -1;
END f;
但是,如果您的函数(或函数调用的函数)执行DML,则您的函数不能在sql语句中使用。(只能在PLSQL块中使用)。
答案 3 :(得分:0)
create or replace function test_fun(id in number) return number
as
val number;
begin
get_data(id,val);
return val;
end;
create or replace procedure get_data(a in number ,b out number)
as
id number;
begin
b:=a*a;
end;
答案 4 :(得分:0)
--------------------------程序内部函数------------------ -----------
create or replace function f_2 return date as
begin
declare
today_date date;
x number;
-------程序声明-----------------
procedure pro_3(d_date out date )
is
begin
d_date:=sysdate;
end pro_3;
BEGIN
---------程序叫--------------------
pro_3(today_date);
for x in 1..7 LOOP
IF TO_CHAR(today_date,'FMDAY')='SUNDAY' THEN
GOTO label_name;
END IF;
today_date:=today_date+1;
END LOOP;
<<label_name>>
DBMS_OUTPUT.PUT_LINE(TO_CHAR(today_date,'DAY')||today_date);
end;
DBMS_OUTPUT.PUT_LINE('today is ' ||TO_CHAR(sysdate,'DAY'));
return sysdate;
end;
----------------------------------执行------------ ---------------------
exec dbms_output.put_line(f_2);