2012-11-05 57 views
9
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. 如果我们可以利用的回报,我怎样才能在Executesql("begin Pname(----)END")方法的返回值

编辑是否可以在存储过程中使用“返回”?

现在我喜欢这个存储过程编辑我的返回值,我在做对吗?

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; 

回答

9

在存储过程,返回使用OUT参数ONLY值。当你定义在你的榜样两个变量:

outstaticip OUT VARCHAR2, outcount OUT NUMBER 

刚分配的返回值的输出参数,即outstaticipoutcount和调用位置访问他们回来。我的意思是:当你调用存储过程时,你也会传递这两个变量。在存储过程调用之后,变量将填充返回值。

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

+0

@ user1799114:它没有格式化,很难下翻。但看起来好像你似乎分配OUT变量的值。现在问题是什么? –

+0

嗨yogendra singh,我编辑了上面的代码,我是以正确的方式吗? – user1

+0

@ user1799114:我在这里。什么是问题? –

6

使用FUNCTION:

CREATE OR REPLACE FUNCTION test_function 
RETURN VARCHAR2 IS 

BEGIN 
    RETURN 'This is being returned from a function'; 
END test_function; 
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; 
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

1

这是可能的。

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

它不会返回任何值。