0

このような手順があります...

declare
v_psg varchar2(10);
id_no number;

begin

select value into v_psg from settings_am where key = 'PSG';
select id into id_no from product where to_char(psg) in (v_psg);
end;`

から返される値は次のselect value into v_psg from settings_am where key = 'PSG';ようになります

「1」、「2」、「3」

この手順を実行すると、ORA エラー - ORA-01403 が返されます。

製品テーブルの psg 列に v_psg 値を渡す方法を教えてください。

編集 - 提案されたテストケースで試しました

4

1 に答える 1

1

もしあなたが得たならORA-01403、あなたはちょっとラッキーでした。これはNO_DATA_FOUNDエラーです。これは、1 つの (おそらく最初の) クエリが何も返さなかったことを意味します。

これらの 2 つのステートメントは、次のように組み合わせることができます。

select id 
from product
where to_char(psg) in (select value 
                       from settings_am 
                       where key = 'PSG'
                      );

最初に選択valueしてから、別のクエリで使用するのはなぜですか? その上、それはうまくいかないでしょう。変数v_psgとして宣言されています。VARCHAR2あなたが説明した方法では、次の文字列が含まれています: '1','2','3'、これがあなたが持っているものであるかのように:

SQL> create table settings_am (key  varchar2(10),
  2                            value varchar2(20));    --> note size here

Table created.

SQL> insert into settings_am (key, value)
  2    values ('PSG', q'['1','2','3']');

1 row created.

SQL> select * From settings_am;

KEY        VALUE
---------- --------------------
PSG        '1','2','3'

SQL>

ご覧のとおり、value宣言した変数は と言っていますが、列のサイズを拡大しました10。なんで?なぜなら

SQL> select length(value) from settings_am where key = 'PSG';

LENGTH(VALUE)
-------------
           11

つまり、長さ11を長さ10を受け入れるものに入れることはできません。

または、データにPSGキーの 3 つの行が実際に含まれている場合、それらの値は既に一重引用符で囲まれていますか? もしそうなら、それは奇妙です。人々は通常それをしません。とにかく、文字列'1,2,3'(実際に持っていると思われるもの)を変数に入れることができたとします。それを句VARCHAR2で使用できるようにするには、それを行に分割する必要があります。IN

SQL> create table product (id number, psg varchar2(10));

Table created.

SQL> insert into product (id, psg) values (100, '1');

1 row created.

SQL> insert into product (id, psg) values (200, '2');

1 row created.

SQL>

クエリは次のとおりです (行 #3 ~ 5 は、文字列を行に分割することを表します)。

SQL> select p.id
  2  from product p
  3  where p.psg in (select regexp_substr('&&v_psg', '[^,]+', 1, level)
  4                  from dual
  5                  connect by level <= regexp_count('&&v_psg', ',') + 1
  6                 );
Enter value for v_psg: 1,2,3

        ID
----------
       100
       200

だったらもっと使いやすいんじゃないの

SQL> select id
  2  from product
  3  where to_char(psg) in (select value
  4                         from settings_am
  5                         where key = 'PSG'
  6                        );

        ID
----------
       100
       200

SQL>

id_no number;どちらのオプションも、クエリが間違っている理由を示していることに注意してください。エラーが発生するため、として宣言された変数に 2 つの値 (行) を入れることはできませんTOO_MANY_ROWS


最後に、やりたいことは何ですか?どのような問題を解決しようとしていますか? どうやら、特殊なケース (値ごとに 1 行のみ) を除いて、クエリは機能しないようです。テスト ケース (テーブルの作成とサンプル データへの挿入) と、期待される出力を提供できれば、支援が容易になります。

于 2019-06-30T09:20:50.720 に答える