Можно ли использовать "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;
- можно ли использовать return в хранимой процедуре, как указано выше?
- если мы можем использовать 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 внутри процедуры, элемент управления передается вызывающей программе, которая вызывает процедуру. Это как выход в петлях.
Он не вернет никакого значения.