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
を行うことができます 代わりにコレクションですが、それでも何かをする必要があります。