12
 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")returnを使用できる場合、メソッドでその戻り値を取得するにはどうすればよいですか?

編集

今、私はこのようにストアドプロシージャで戻り値を編集しました、私はそれを正しく行っていますか?

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

5 に答える 5

17

ストアドプロシージャでは、OUTパラメータONLYを使用して値を返します。例で2つの変数を定義したので、次のようになります。

   outstaticip OUT VARCHAR2, outcount OUT NUMBER

戻り値をoutパラメータに割り当てるだけです。つまりoutstaticipoutcount呼び出し元からそれらにアクセスします。ここで意味するのは、ストアドプロシージャを呼び出すときに、これら2つの変数も渡すことです。ストアドプロシージャの呼び出し後、変数には戻り値が入力されます。

RETURN valuePL / SQL呼び出しからのリターンが必要な場合は、を使用しますFUNCTION場合によっては、戻り変数として返すことができる変数は1つだけであることに注意してください。

于 2012-11-05T03:25:39.530 に答える
6

機能を使用する:

CREATE OR REPLACE FUNCTION test_function
RETURN VARCHAR2 IS

BEGIN
  RETURN 'This is being returned from a function';
END test_function;
于 2012-11-05T03:27:14.357 に答える
5
-- 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

于 2015-03-03T18:01:32.243 に答える
2

可能です。

プロシージャ内でReturnを使用すると、プロシージャを呼び出す呼び出し側プログラムに制御が移ります。これは、ループの出口のようなものです。

値は返されません。

于 2016-08-16T09:33:01.200 に答える
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;
于 2013-12-27T09:02:41.187 に答える