web-dev-qa-db-ja.com

Oracleでの変数の宣言とSELECTクエリからの値の設定

SQL Serverではこれを使用できます。

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;

なぜこれがworkingではないのですか?

enter image description here

36
user960567

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ステートメントの実行に関する情報を提供します。

67
Thilo

あなたが何を求めているのか完全にはわかりませんが、PL/SQLでは単純に

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

Ollie。

5
Ollie

追加のポイント:

tsqlからplsqlに変換するときは、no_data_found例外を心配する必要があります

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;

tsql if no data foundの場合、変数はnullになりますが、exceptionはありません

1
Praveen

ORA-01422:完全フェッチは、要求された行数より多くを返します

where条件を使用して正確なレコードを指定しない場合、上記の例外が発生します

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

単一行の出力をselect intoクエリから変数に保存する場合:

declare v_username varchare(20);ユーザー名を選択して、v_usernameからFROM WHERE WHERE user_id = '7';

これにより、単一レコードの値が変数v_usernameに保存されます。


Select into queryから変数に複数の行の出力を保存する場合:

listagg関数を使用する必要があります。 listaggは、結果の列の列を単一の列に連結し、それらを区別するために、特別なシンボルを使用できます。以下のようにクエリを使用して、グループ内のSELECT listagg(username || '、')(ユーザー名順に)v_username FROM users;

0
Vincent Lal