1

私は次の手順を書きました

create or replace procedure sp_abc_profile 
(
  f_symbol_in abc.colname%TYPE
)
is profile abc%rowtype;
is profile2 abc2%rowtype;
begin
  SELECT fname, lname,mname,age
    INTO profile
  FROM abc
  WHERE f_symbol = f_symbol_in;

  SELECT initiaiinvestment AS minInitialInvestment, pr as qt, class1 as clss
    into profile2
  FROM 
      abc2 
  WHERE f_symbol = f_symbol_in;
end;

上記を実行すると、次のようなエラー メッセージが表示されます。

エラー (7,3): PL/SQL: SQL ステートメントは無視されました

エラー (21,5): PL/SQL:ORA-00913: 値が多すぎます

両方のテーブルのすべての行を選択したくありません。

プロシージャ内のすべての select ステートメントが結果セットを返すように、プロシージャ内に複数の select ステートメントを記述するにはどうすればよいですか。

4

5 に答える 5

2

次のことを試してください。

is
profile abc.fname%type;
profile2 abc2.initiaiinvestment%type;

プロシージャ内に複数の select ステートメントが含まれていても問題はありません。選択した列と PL/SQL 型の不一致に関するものです。

isそれに加えて、コードに多すぎるようです。

の使用に関する詳細についてはselect into、次のリンクを確認してください: Oracle PL/SQL "select into" 句

于 2013-01-31T14:26:45.730 に答える
0

解決策は、Oracle で CURSORS を使用して、プロシージャ内のすべての select ステートメントが結果セットを返すようにすることです。

その結果セットは、目的の出力を得るために、好みのスクリプト言語でトラバースできます。

create or replace 
procedure sp_abc_profile
(
  symbol_in in tablename.fieldname%type,
  cursor1 out SYS_REFCURSOR,
  cursor2 out SYS_REFCURSOR,
)
as
begin


    open cursor1 for
         {your select statement here}


    open cursor2 for
        {your second select statement here}


end sp_abc_profile;
于 2013-06-14T07:46:16.640 に答える
0

他の人が指摘したように、「is」ステートメントが多すぎます。

行変数への選択を実行するときは、すべてを選択する必要があります。

select *
into profile
from abc
where f_symbol = f_symbol_in;

select *
into profile2
from abc2
where f_symbol = f_symbol_in;

f_symbol_in に複数の一致がある場合、例外をスローするリスクもあります。コードでこの例外をキャッチするか、行数を制限する (つまり、rownum<=1) か、コレクションを調べて、パラメーターに一致するすべての行を読み込むことができます。

于 2013-02-01T14:39:15.407 に答える