3

これが彼の問題の説明です。カンマ区切りの整数値(Varchar変数に格納されている)をIN条件に渡そうとしています。

local_var VARCHAR2(20);
local_var := 1,2;
WHERE someid IN (local_var) --Just pasted the where clause where IN condition is being used

someidはNUMBER型で、

このステートメントをカーソルで実行しているときに、無効な数値エラーが発生します。この問題はsomeidNUMBERであるためだと思いますが、考えられる解決策は何ですか?1,2いくつかの条件に基づいて同じものを作成する必要があるため、IN句に直接値を渡すことはできません。

カンマ区切りの値を引用符で囲んでも試しましたが、Oracleバージョン11.2を使用しても機能しないようです。

使ってみました

 local_var := '1,2';
 local_var := '''1','2'''; etc..

何も機能していないようです

緊急の助けが必要です!前もって感謝します

4

4 に答える 4

3

明らかに、このエラーが発生するsomeidのは、が数値データ型であり、カンマ区切りの文字列を渡しているためです。これは、文字列データ型の1つの値と見なされ、期待どおりの値のリストではないと見なされますIN。ただし、regexp_substrおよびregexp_count正規表現関数を使用してその文字列をテーブル行に変換し、それらをIN句で使用することができます。次に例を示します。

SQL> declare
  2    cursor your_cursor(c_str_value varchar2) is
  3      with str_values as( 
  4        select regexp_substr(c_str_value, '[^,]+', 1, level) as value
  5          from dual
  6        connect by level <= regexp_count(c_str_value, '[^,]+')
  7      )
  8     select first_name   -- here goes your query
  9       from employees e
 10      where e.department_id in (select to_number(value)
 11                                  from str_values);
 12  
 13    l_local_var varchar2(20);
 14  begin
 15    l_local_var := '100,102,103';     -- your comma separated string
 16    for i in your_cursor(l_local_var) -- for the sake of demonstration
 17    loop
 18      dbms_output.put_line(i.first_name);
 19    end loop;
 20  end;
 21  /

Nancy
Daniel
John
Ismael
Jose Manuel
Luis

PL/SQL procedure successfully completed
于 2012-12-28T07:03:03.230 に答える
1

そのような引数としてリストを渡すことはできません。

動的PL/SQLブロックを使用することもできます。何かのようなもの:

DECLARE
    local_var VARCHAR2(20) := '1,2';
    req VARCHAR(1000);
BEGIN
    req := 'BEGIN
        FOR c IN (SELECT someid FROM my_table WHERE someid IN (' || local_var || '))
        LOOP
            DBMS_OUTPUT.PUT_LINE('someid ' || c.someid);
        END LOOP;
    END;';
    EXECUTE IMMEDIATE req;
END;

ただし、PL/SQLインジェクションには十分注意してください。

于 2012-12-28T06:48:40.217 に答える
0

変数タイプはVARCHAR2であり、数値タイプを割り当てているので、そのエラーが発生します。一重引用符を使用してください。

例えば ​​#

local_var VARCHAR2(20);
local_var := '1';
WHERE someid IN (local_var);
于 2012-12-28T06:53:02.440 に答える
-1

これが方法です

create table a(local_var varchar2(10))

insert into a values('2');

select * from a;

declare
y varchar2(10);
cursor c1(v_val varchar2) is select * from a;
Begin
y := '1,2';
for i in c1(y)
loop   
dbms_output.put_line(i.local_var);
end loop ;
end;
/
于 2012-12-28T07:37:13.563 に答える