我们可以在oracle PL/SQL中调用函数内部的过程吗?如果没有,为什么



在某些地方,我听说我们不能在oracle PL/SQL中调用函数内部的过程。我可以知道为什么会这样吗?还有,为什么我们不能在SELECT语句中调用一个过程,而我们可以在同一SELECT语句中呼叫一个函数。

是的,您可以从Oracle PL/SQL中的函数调用过程。

不能从SELECT语句调用过程,因为它不返回值。一个函数可以从SELECT调用,因为它可以:

select empno, calc_salary_function(empno) salary
from emp;

从SELECT调用过程实际上毫无意义:

select empno, fire_employee(empno) -- Will fail
from emp;

您希望在结果的第二列中看到什么?

过程不用于返回值。过程执行一组操作以实现任务,其中as函数用于返回值。

过程是作为一个操作来执行的,函数可以在select语句中使用派生值

您可以从函数调用过程。

create table test(a varchar2(30));

create or replace procedure pro_insert_values
as
begin
insert into test values('anything');
end;

create or replace function fn_get_data
return number 
as
begin
pro_insert_values;
return 1;  
end;

sql>variable x number
exec :x:=fn_get_data

您可以使用以下代码来验证是否可以从函数内部调用过程。

create table country_name(id number, country varchar2(100));

insert all
into country_name values(1, 'INDIA')
into country_name values(2, 'UK')
SELECT * FROM DUAL;
/

CREATE OR REPLACE FUNCTION COUNTRY_FOUND_NOTFOUND(V_NAME VARCHAR2)
RETURN VARCHAR2
AS
V_COUNTRY VARCHAR2(100);
BEGIN
BEGIN
SELECT COUNTRY INTO V_COUNTRY FROM country_name WHERE COUNTRY = V_NAME;
RETURN 'FOUND';
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT_COUNTRY(V_NAME);
RETURN 'NOT FOUND';
END;
RETURN 'NOT FOUND';
END;
/
CREATE OR REPLACE PROCEDURE INSERT_COUNTRY(V_NAME IN VARCHAR2)
AS
V_ID NUMBER;
BEGIN
SELECT MAX(ID) INTO V_ID FROM COUNTRY_NAME;
INSERT INTO COUNTRY_NAME VALUES(V_ID+1, V_NAME);
END;
/

SET SERVEROUTPUT ON;
DECLARE
V_NAME VARCHAR2(100);
BEGIN
V_NAME := COUNTRY_FOUND_NOTFOUND('SPAIN');
DBMS_OUTPUT.PUT_LINE(V_NAME);
END;

相关内容

最新更新