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;
Executesql("begin Pname(----)END")
MODIFIER
Maintenant, j'ai modifié ma valeur de retour dans une procédure stockée comme ceci, est-ce que je le fais correctement?
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;
Dans la procédure stockée, vous renvoyez les valeurs à l'aide du paramètre OUT
ONLY. Comme vous avez défini deux variables dans votre exemple:
outstaticip OUT VARCHAR2, outcount OUT NUMBER
Attribuez simplement les valeurs de retour aux paramètres de sortie, à savoir outstaticip
et outcount
, et accédez-y depuis l'emplacement de l'appelant. Ce que je veux dire ici est que: lorsque vous appelez la procédure stockée, vous transmettez également ces deux variables. Après l'appel de la procédure stockée, les variables seront renseignées avec des valeurs de retour.
Si vous souhaitez que RETURN value
soit renvoyé à partir de l'appel PL/SQL, utilisez FUNCTION
. S'il vous plaît noter que dans le cas, vous seriez en mesure de renvoyer une seule variable en tant que variable de retour.
Utilisez la fonction:
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;
/
- La sortie de procédure peut être collectée à partir des variables x et y (ans1: = x et ans2: = y) seront respectivement 150 et 20.
- Réponse empruntée à: 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;
C'est possible.
Lorsque vous utilisez Return dans une procédure, le contrôle est transféré au programme appelant qui appelle la procédure. C'est comme une sortie en boucle.
Cela ne retournera aucune valeur.