是否可以在存储过程中使用“return”?

时间:2012-11-05 03:23:29

标签: oracle stored-procedures plsql oracle10g oracle11g

 CREATE PROCEDURE Pname(in_Tid IN VARCHAR2,in_IP IN VARCHAR2,outstaticip OUT VARCHAR2,outcount OUT NUMBER)
 AS
 BEGIN
 select STATIC_IP into outstaticip from OP_TTER_MAPPING where TERMINAL_ID = in_Tid;
 if in_IP = outstaticip then
 return 1;
 else
 select COUNT(*) into outcount from OP_TTER_MAPPING where DYNAMIC_IP_LOW <= in_IP AND   DYNAMIC_IP_HIGH >= in_IP AND TERMINAL_ID = in_Tid;
 if outcount = 1 then
 return 1;
 else
 return 0;
  end if;
 end if;
 END;
  1. 是否可以在上面的存储过程中使用return?
  2. 如果我们可以使用return,我怎样才能在Executesql("begin Pname(----)END") method
  3. 中获得该返回值

    修改

    现在我在这样的存储过程中编辑了我的返回值,我做得对吗?

    CREATE PROCEDURE P_ValidateTIDIP(in_Tid IN VARCHAR2,in_IP IN VARCHAR2,outstaticip OUT VARCHAR2,outcount OUT NUMBER,outretvalue OUT NUMBER)
    AS
    BEGIN
    select STATIC_IP into outstaticip from OP_TTER_MAPPING where TERMINAL_ID = in_Tid;
    if in_IP = outstaticip then
        outretvalue:=1;
    else 
        select COUNT(*) into outcount from OP_TTER_MAPPING where DYNAMIC_IP_LOW <= in_IP AND DYNAMIC_IP_HIGH >= in_IP AND TERMINAL_ID = in_Tid;
        if outcount = 1 then 
         outretvalue:=1;
        else
         outretvalue:=0;
       end if;
    end if;
    END;
    

5 个答案:

答案 0 :(得分:11)

在存储过程中,您使用OUT参数返回值。正如您在示例中定义了两个变量:

   outstaticip OUT VARCHAR2, outcount OUT NUMBER

只需将返回值分配给输出参数,即outstaticipoutcount,然后从呼叫位置访问它们。我的意思是:当你调用存储过程时,你也将传递这两个变量。在存储过程调用之后,变量将填充返回值。

如果您希望从PL / SQL调用返回RETURN value,请使用FUNCTION请注意,万一,您只能返回一个变量作为返回变量。

答案 1 :(得分:6)

使用功能:

CREATE OR REPLACE FUNCTION test_function
RETURN VARCHAR2 IS

BEGIN
  RETURN 'This is being returned from a function';
END test_function;

答案 2 :(得分:3)

-- IN arguments : you get them. You can modify them locally but caller won't see it
-- IN OUT arguments: initialized by caller, already have a value, you can modify them and the caller will see it
-- OUT arguments: they're reinitialized by the procedure, the caller will see the final value.
CREATE PROCEDURE f (p IN NUMBER, x IN OUT NUMBER, y OUT NUMBER)
IS
BEGIN
   x:=x * p;
   y:=4 * p;
END;
/

SET SERVEROUTPUT ON

declare
   foo number := 30;
   bar number := 0;
begin
   f(5,foo,bar);
   dbms_output.put_line(foo || ' ' || bar);
end;
/

- 可以从变量x和y收集过程输出(ans1:= x和ans2:= y)将分别为:150和20。

- 借鉴来自:https://stackoverflow.com/a/9484228/1661078

答案 3 :(得分:1)

CREATE PROCEDURE pr_emp(dept_id IN NUMBER,vv_ename out varchar2  )
 AS
 v_ename emp%rowtype;
CURSOR c_emp IS
    SELECT ename
    FROM emp where deptno=dept_id;
 BEGIN
     OPEN c;
     loop
        FETCH c_emp INTO v_ename;
        return v_ename; 
        vv_ename := v_ename 
        exit when c_emp%notfound;
     end loop;
     CLOSE c_emp;


 END pr_emp;

答案 4 :(得分:1)

有可能。

在过程中使用Return时,控件将转移到调用该过程的调用程序。这就像循环中的退出。

它不会返回任何值。