sql >> データベース >  >> RDS >> Oracle

即時選択を実行すると、値が返されません

    intoを選択する必要があります なにか。そうでない場合は、クエリ実行されていません (解析されますが)

    create or replace procedure select_procedure
    as
      l_name student.name%TYPE;
      l_surname student.name%TYPE;
    begin
      execute immediate
      'select name, surname
      from student
      where id_student = 1'
      into l_name, l_surname;
    end;
    /
    

    ただし、順不同です。(a)動的ステートメントにリテラル値1を埋め込む代わりに、バインド変数を使用する必要があります。 (b)これは動的である必要はまったくありません。 (c)OUTを選択しない限り、呼び出し元はクエリによって返された値を表示できません。 代わりに引数を指定するか、dbms_output()で表示してください (ただし、クライアントが表示するかどうかを制御できないため、実際にはデバッグにのみ使用する必要があります)。

    だからあなたはできる:

    create or replace procedure select_procedure
    as
      l_name student.name%TYPE;
      l_surname student.name%TYPE;
    begin
      select name, surname
      into l_name, l_surname
      from student
      where id_student = 1;
    
      dbms_output.put_line('name=' || l_name ||', surname=' || l_surname);
    end;
    /
    

    または

    create or replace procedure select_procedure (
      p_name OUT student.name%TYPE,
      p_surname OUT student.name%TYPE
    )
    as
    begin
      select name, surname
      into p_name, p_surname
      from student
      where id_student = 1;
    end;
    /
    

    呼び出し元に独自の変数名を渡してデータを入力させ、それらを使用して必要な処理を実行します。発信者は通常、探しているIDも渡すため、1つはハードコードされていません。

    ただし、手順が実際にはこれに最適なメカニズムではないようです。

    また、select ... intoを使用します (静的または動的)クエリが0行または複数行を返す場合、エラーが発生します。返される行が1つだけの場合にのみ機能します。カーソルは任意の数の行を処理しますが、結果を出力するだけでない限り(@Jayanthが示すように)、代わりにカーソルを呼び出し元に戻す必要があります。 bulk collect intoを行うことができます 代わりにコレクションですが、それでも何かをする必要があります。



    1. RからMySQLに接続する

    2. SQLServerはSelect...Insertクエリを暗黙のトランザクションにラップしますか?

    3. 複数のキーワードを使用してデータベースから最も関連性の高いエントリを取得して注文する方法Laravel5

    4. SQLデータ操作言語