2012-11-05 30 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. Có thể sử dụng trở lại trong quy trình được lưu trữ như trên không?
  2. Nếu chúng ta có thể sử dụng lại, làm thế nào tôi có thể nhận được rằng giá trị trả về trong Executesql("begin Pname(----)END") phương pháp

EDITCó thể sử dụng "return" trong thủ tục lưu sẵn không?

Bây giờ tôi thay đổi nội dung giá trị trả về của tôi trong thủ tục lưu trữ như thế này, tôi làm việc đó phải không?

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; 

Trả lời

9

Trong thủ tục lưu trữ, bạn quay trở lại các giá trị sử dụng OUT tham số CHỈ. Như bạn đã xác định hai biến trong ví dụ của bạn:

outstaticip OUT VARCHAR2, outcount OUT NUMBER 

Chỉ cần gán các giá trị trở lại các thông số ra ví dụ: outstaticipoutcount và truy cập chúng trở lại từ gọi địa điểm. Ý tôi là ở đây là: khi bạn gọi thủ tục lưu sẵn, bạn cũng sẽ chuyển cả hai biến đó. Sau cuộc gọi thủ tục được lưu trữ, các biến sẽ được điền bằng các giá trị trả lại.

Nếu bạn muốn có RETURN value khi trở về từ cuộc gọi PL/SQL, sau đó sử dụng FUNCTION. Xin lưu ý rằng trong trường hợp, bạn chỉ có thể trả lại một biến là biến trả về.

+0

@ user1799114: Chưa được định dạng, khó phân giải. Nhưng trông OK như bạn dường như chỉ định các giá trị trong các biến OUT. Câu hỏi là gì? –

+0

Hi yogendra singh, tôi đã chỉnh sửa đoạn mã trên, tôi có đang làm đúng cách không ???? – user1

+0

@ user1799114: Tôi ở đây. Câu hỏi là gì? –

6

Sử dụng CHỨC NĂNG:

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

- Thủ tục đầu ra có thể được thu thập từ các biến x và y (ans1: = x và ans2: = y) sẽ là: 150 và 20 tương ứng.

- Trả lời mượn từ: https://stackoverflow.com/a/9484228/1661078

1

Có thể.

Khi bạn sử dụng Quay trở lại bên trong một quy trình, điều khiển được chuyển đến chương trình gọi điện thoại gọi thủ tục. Nó giống như một lối ra trong các vòng lặp.

Nó sẽ không trả về bất kỳ giá trị nào.

Các vấn đề liên quan