2011-09-26 5 views
26

でSELECTクエリからその値を設定し、我々はこれを使用することができます。変数を宣言し、SQL ServerでのOracle

DECLARE @variable INT; 
SELECT @variable= mycolumn from myTable; 

私は、Oracleで同じことを行うことができますどのように?私は現在、次のことをやっている:

DECLARE COMPID VARCHAR2(20); 
SELECT companyid INTO COMPID from app where appid='90' and rownum=1; 

これはを働いていないれるのはなぜ?

enter image description here

+0

になりますどのようにこれがオブジェクトとして型のために働くことができますか? – Avias

答えて

54

SELECT INTO

DECLARE 
    the_variable NUMBER; 

BEGIN 
    SELECT my_column INTO the_variable FROM my_table; 
END; 

クエリは、単一の行を返すことを確認します。デフォルトでは

を、SELECT INTO文は1行のみを戻す必要があります。それ以外の場合、PL/SQLは事前定義の例外TOO_MANY_ROWSを発生させ、INTO句の変数の値は未定義です。 WHERE句が特定の行にのみ一致するようにします。

行が戻されない場合、PL/SQLはNO_DATA_FOUNDを発生させます。実際のところCOUNT(*)やAVG()などの集計関数の結果を選択することで、この例外を防ぐことができます。これらの関数は、条件に一致する行がなくても単一の値を返すことが保証されています。

SELECT ... BULK COLLECT INTO文は複数の行を返すことができます。結果を保持するようにコレクション変数を設定する必要があります。結果セット全体を保持するために必要に応じて拡張する連想配列またはネストした表を宣言できます。

暗黙のカーソルSQLとその属性%NOTFOUND、%FOUND、%ROWCOUNT、および%ISOPENは、SELECT INTOステートメントの実行に関する情報を提供します。

+0

DECLARE COMPID VARCHAR2(20);SELECT companyid INTO COMPID from sasapplicationここで、appid = '90 'およびrownum = 1;なぜこのSQLがエラー – user960567

+0

を投げているのか、エラーメッセージが表示されますか? – Thilo

+0

ちょうど上記を参照してください。 – user960567

4

あなたがPL/SQLの後でであるか全くわからないだろう単に

DECLARE 
    v_variable INTEGER; 
BEGIN 
    SELECT mycolumn 
    INTO v_variable 
    FROM myTable; 
END; 

Ollie第。

+0

@Thiloが述べているように、この特定のsynatxの周りをもっと検討する必要があります。あなたが達成しようとしていることについてもう少し詳しく知ることで、変数を移入するためのより良い方法を調整することができます。 – Ollie

0

ORA-01422は:あなたはどこの条件を使用することにより、正確なレコードを指定しない場合は、正確な行

の要求された数よりも多くのリターンをフェッチするには、上記の例外が発生します

DECLARE 
    ID NUMBER; 
BEGIN 
    select eid into id from employee where salary=26500; 
    DBMS_OUTPUT.PUT_LINE(ID); 
END; 
0

select intoクエリからの変数に1行出力を格納する場合:

宣言v_username varchare(20); v_usernameへのユーザー名の選択FROM users WHERE user_id = '7';

これは、単一のレコードの値を変数v_usernameに格納します。問合せに選択から変数に複数の行の出力を格納するために


あなたはLISTAGG機能を使用する必要があります。listaggはcoloumnの結果の行を単一のcoloumnに連結し、またそれらを区別するために特別なシンボルを使用することができます。 以下のようにクエリを使用してください グループ内のSELECT listagg(username || '、')をユーザー名順にv_username FROM usersに入力してください。

0

つの追加のポイント:あなたはno data found場合についてno_data_found例外tsql

DECLARE 
    v_var NUMBER; 
BEGIN 
    SELECT clmn INTO v_var FROM tbl; 
Exception when no_data_found then v_var := null; --what ever handle the exception. 
END; 

を心配する必要はplsqltsqlから変換された場合

その変数がnullが、無exception

関連する問題