2017-10-20 7 views
0

この "回避策"の構文は "クリーン"ですか?エラー "レコードまたは行変数を複数項目INTOリストの一部にすることはできません"

は、私が一緒に動作するように、次のオブジェクトがあります。

​​3210

関数は、いくつかの(長い)のロジックを持っていますが、最終的にそれがある:いくつかの条件に基づいて「新しい」レコードを変更する

  1. 、 「すべて」の配列に「新しい」レコードを追加
  2. ヌル-INGの「新しい」レコードを出し、そして
  3. 秒出力のためにいくつかのブール値を出力する。 (OracleのPL/SQLからの翻訳)以下のように私は私の関数を呼び出す

ERROR: record or row variable cannot be part of multiple-item INTO list 
LINE 10:  select * into lr_token, lt_tokens, lb1, lb2, lb3 

私が示唆された回避策はこれです:

do $$ 
declare 
    lb1 boolean; 
    lb2 boolean; 
    lb3 boolean; 
    -- 
    lr_token token; 
    lt_tokens token[]; 
begin 
    select * into lr_token, lt_tokens, lb1, lb2, lb3 
    from p_post_token('', lr_token, lt_tokens); 
end$$; 

を私はエラーを取得します:

do $$ 
declare 
    lb1 boolean; 
    lb2 boolean; 
    lb3 boolean; 
    -- 
    lr_token token; 
    lt_tokens token[]; 
    -- 
    r record; 
begin 
    select * into r 
    from p_post_token('', lr_token, lt_tokens); 
    lr_token := r.token_new; 
    lt_tokens := r.tokens_all; 
    lb1  := r.b1; 
    lb2  := r.b2; 
    lb3  := r.b3; 
end$$; 

が、私はダースの場所で関数p_post_tokenを呼び出さなければなりません。このようなコードは、 "長すぎます"。

これは、INOUT/OUTレコードパラメータ+他のINOUT/OUTパラメータを持つ関数からの出力を読み取る唯一の方法ですか? (うまくいけば)「ワンライナー」アプローチはありますか?

答えて

0

私の同僚は、(IMHO)をはるかに容易に/より良い回避策を提案しました。レコードパラメータを配列に変換します。関数宣言は次のようになります。

function p_post_token 
    (  token_type varchar 
    ,inout token_new token[] --<< this turned from record to array 
    ,inout tokens_all token[] 
    , out b1   boolean 
    , out b2   boolean 
    , out b3   boolean 
    ) as... 

...となり、コードは(内部的に)配列のレコードを1つだけ処理させます。 これは、レコードを扱うときにたくさんの "余分な"コードを避けることができます。

、関数の呼び出しが(再びIMHO、簡単で直感的な)ワンライナーを次のようになります。

do $$ 
declare 
    lb1 boolean; 
    lb2 boolean; 
    lb3 boolean; 
    -- 
    lr_token token[]; 
    lt_tokens token[]; 
begin 
    select * p_post_token('', lr_token, lt_tokens) 
    into lr_token, lt_tokens, lb1, lb2, lb3; 
end$$; 

私は、これは同じで苦労している人を助けたいと考えています。

乾杯!

0

1つの明細書で要求することはありません。この制限はPostgreSQLの開発者が互換性を壊したくないので、古い実装の一部であり、変更できません。レコードタイプの回避策は可能です。

関連する問題