7

次のサンプルコードがあります

DECLARE 
    myRow table%rowtype 
    myVar table2.column%type
BEGIN 
    SELECT table.col1, table.col3, table.col4, table2.column
    INTO myRow 
    FROM table
    JOIN table2
    On table.col6 = table2.col1;
 END;

有効なステートメントになるようにリファクタリングするにはどうすればよいですか? 結合された列を myRow または myVar に保存できますか?

4

3 に答える 3

8

PL/SQL は有効であり、次の場合に受け入れられます。

  1. テーブル TABLE には、選択している 4 つの値に対応する正確に 4 つの列が含まれています。
  2. クエリは正確に 1 行を返します。

テーブル TABLE に正確に 4 つの列が含まれていない場合は、別のもの (おそらく 4 つの変数) を選択する必要があります。

DECLARE 
    v_col1 table.col1%type;
    v_col3 table.col3%type;
    v_col4 table.col4%type;
    v_column table2.column%type;
BEGIN 
    SELECT table.col1, table.col3, table.col4, table2.column
    INTO v_col1, v_col3, v_col4, v_column
    FROM table
    JOIN table2
    On table.col6 = table2.col1;
END;

クエリが複数の行を返す場合、TOO_MANY_ROWS 例外が発生します。行が返されない場合は、NO_DATA_FOUND 例外が発生します。

于 2013-08-28T20:16:32.847 に答える
1

これを行うには、カーソルを使用できます。そうすれば、TOO_MANY_ROWS または NO_DATA_FOUND 例外について心配する必要はありません。

また、クエリに列を追加するたびに、同じタイプの変数に自動的に追加されるという柔軟性があります

カーソルには 2 つのオプションがあります。返された最初の行だけを使用するか、すべての行を使用します。

オプション1

DECLARE 

   CURSOR C_DATA IS
    SELECT
        table.col1, -- Column 2 intentionally left out
        table.col3, 
        table.col4, 
        table2.column  --Column from joined table
    FROM table
    JOIN table2
    On table.col6 = table2.col1;

    myRow C_DATA%rowtype 

BEGIN 

 OPEN C_DATA;
  FETCH c_data INTO myRow;
 CLOSE C_DATA;

      -- USE ANYWHERE INSIDE THIS ESCOPE YOUR COLUMNS as myRow.col4.

END;

オプション #2

DECLARE 

   CURSOR C_DATA IS
    SELECT
        table.col1, -- Column 2 intentionally left out
        table.col3, 
        table.col4, 
        table2.column  --Column from joined table
    FROM table
    JOIN table2
    On table.col6 = table2.col1;


BEGIN 

 FOR myRow IN C_DATA LOOP

      -- USE INSIDE HERE YOUR COLUMNS as myRow.col4.     

 END LOOP;

END;
于 2013-08-29T20:34:30.563 に答える