Можно ли использовать "return" в хранимой процедуре?

 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") метод

редактировать

теперь я отредактировал свое возвращаемое значение в хранимой процедуре, как это, я делаю это правильно ?

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 ответов


в хранимой процедуре вы возвращаете значения, используя OUT параметр только. Как вы определили две переменные в своем примере:

   outstaticip OUT VARCHAR2, outcount OUT NUMBER

просто назначьте возвращаемые значения параметрам out, т. е. outstaticip и outcount и получить к ним доступ из места вызова. Я имею в виду следующее: Когда вы вызываете хранимую процедуру, вы также будете передавать эти две переменные. После вызова хранимой процедуры переменные будут заполнены return ценности.

если вы хотите RETURN value как возврат из вызова PL / SQL, затем используйте FUNCTION. обратите внимание, что в случае, если вы сможете вернуть только одну переменную в качестве возвращаемой переменной.


использовать функцию:

CREATE OR REPLACE FUNCTION test_function
RETURN VARCHAR2 IS

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

-- 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


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;

Это возможно.

когда вы используете Return внутри процедуры, элемент управления передается вызывающей программе, которая вызывает процедуру. Это как выход в петлях.

Он не вернет никакого значения.