2017-09-06 18 views
0

PL/SQLの関数を使用して古典的な数値スワップ・プログラムを実装する必要があります(ユーザーから2つの数値を受け取り、スワップして表示します)。しかし、PL/SQLの関数を使って2つの数値を返すことはできないようです。私は、PL/SQLの関数から2つの値を返す方法があるかどうか、あるいはこのコードを書くための他の方法があるかどうかを知りたかったのですが?PL/SQLファンクション

SET SERVEROUTPUT ON; 

DECLARE 
a NUMBER; 
b NUMBER; 

FUNCTION numSwap(num1 IN OUT NUMBER ,num2 IN OUT NUMBER)IS 
temp_num NUMBER; 

BEGIN 

temp_num := num1; 
num1 := num2; 
num2 := temp; 
END; 

BEGIN 

a := &a; 
b := &b; 

DBMS_OUTPUT.PUT_LINE('First Number = ' || a); 
DBMS_OUTPUT.PUT_LINE('Second Number = ' || b); 

--After swapping values 
DBMS_OUTPUT.PUT_LINE('After swapping the values'); 
numSwap(a,b); 

--Displaying the results 
DBMS_OUTPUT.PUT_LINE('First Number = ' || a); 
DBMS_OUTPUT.PUT_LINE('Second Number = ' || b); 

END; 

編集:明確にするために、私は、これは手続きのために、多かれ少なかれ構文であることを認識し、しかし、私は手順を使用する関数に

+1

ちょうどPROCEDURE' 'に' FUNCTION'を変更してください。 –

+0

関数を使ってそれを行う方法はありますか?それはおそらくプロシージャの構文が正しいことに気付きましたが、何らかの形で関数のためにもうまくいくことを期待していました –

+0

@TonyAndrews - OPがこの機能をどのように使用するのかはっきりしない(これはほとんど確実に宿題なので、おそらく彼は勝っただろうまったく使用しないでください)。それによると、機能と手順には大きな違いがあります。関数は問合せの様々な節(SELECT、WHERE、GROUP BY ...)で呼び出すことができ、一般に式で使用できます。手続きはできません。だから* "FUNCTION'を' PROCEDURE'に変更する*は正当な答えではありません。 – mathguy

答えて

2

...

機能は、1つの値を返します。 2つの値を保持するレコード(または場合によってはコレクション)を使用して解決できます。レコードタイプはPLSQLブロックのスコープ内でのみ宣言されています。

declare 

    a number; 
    b number; 
    type two_numbers is record(
     a number, 
     b number); 

    l_two_numbers two_numbers; 

    function swap(p_two_numbers two_numbers) return two_numbers is 
    l_return two_numbers; 
    begin 
     l_return.a:=p_two_numbers.b; 
     l_return.b:=p_two_numbers.a; 

     return l_return; 
    end; 

begin 
    a := &a; 
    b := &b; 


    l_two_numbers.a:=a; 
    l_two_numbers.b:=b; 

    dbms_output.put_line('First Number = ' || l_two_numbers.a); 
    dbms_output.put_line('Second Number = ' || l_two_numbers.b); 

    l_two_numbers := swap(l_two_numbers); 

    dbms_output.put_line('First Number = ' || l_two_numbers.a); 
    dbms_output.put_line('Second Number = ' || l_two_numbers.b); 
end; 
+0

ありがとう、これは完全に動作します。 –

0

を使用して、この同じプログラムを実行するためにどのような方法がありますかどうかを知りたいと思いました: MT0の例にエラボレーション

DECLARE 
    a NUMBER; 
    b NUMBER; 
    PROCEDURE numSwap(num1 IN OUT NUMBER ,num2 IN OUT NUMBER) 
    IS 
    temp_num NUMBER := num1; 
    BEGIN 
    num1 := num2; 
    num2 := temp_num; 
    END; 
BEGIN 
    a := &a; 
    b := &b; 

    DBMS_OUTPUT.PUT_LINE('First Number = ' || a); 
    DBMS_OUTPUT.PUT_LINE('Second Number = ' || b); 

    numSwap(a,b); 

    DBMS_OUTPUT.PUT_LINE('First Number = ' || a); 
    DBMS_OUTPUT.PUT_LINE('Second Number = ' || b); 
END; 
/
+0

うん、私はプロシージャを介してそれを行う方法を考え出したが、私は関数を使ってそれを行う方法を理解することができませんでした。私は、そのコードを関数としても動作させる方法があるのだろうかと思っていました。 –

+0

OPがこの機能をどのように使用するかは分かりません(これはほとんど確実に宿題なので、まったく使用しないかもしれません)。それによると、機能と手順には大きな違いがあります。関数は問合せの様々な節(SELECT、WHERE、GROUP BY ...)で呼び出すことができ、一般に式で使用できます。手続きはできません。だから* "FUNCTION'を' PROCEDURE'に変更する*は正当な答えではありません。 – mathguy

+1

@mathguyこの回答はOPのコードを直接参照し、PL/SQLの匿名ブロック内で関数を定義し、そのPL/SQLスコープで関数を呼び出します。 SQLスコープで使用される予定はなく(定義方法を前提として、Oracle 11以前のように使用することはできません)。 OPのコードに 'RETURN'節がない(関数の仕様や本体の中に)関数resultが変数に代入されていない場合は、代わりに' PROCEDURE'構文に従って記述されます。手続き – MT0

0

あなたがSELECTで使用する必要がある場合は、まだ(関数を呼び出すしたい場合は、Oracle typeを使用することができます。以下

set serveroutput on 

create or replace type t_swap 
is object(first_number number, second_number number); 
/

create or replace 
function f_num_swap(p_first_number in number, p_second_number in number) return t_swap 
is 
    v_swap t_swap; 
begin 
    v_swap := t_swap(p_second_number, p_first_number); 
    return v_swap; 
end; 
/

-- You can access from select 
select f_num_swap(1, 2).first_number, f_num_swap(1, 2).second_number from dual; 

-- Or you can access from PL/SQL block 
declare 
    v_swap t_swap; 
begin 
    v_swap := f_num_swap(1, 2); 
    dbms_output.put_line('First Nubmer Swapped: '||v_swap.first_number); 
    dbms_output.put_line('Second Nubmer Swapped: '||v_swap.second_number); 
end; 
/