1つの変数は、where条件のクエリーsqlとして複数の値を格納します.

1965 ワード

Oracle:
このような状況に遭遇したことがあるかもしれません:select*fromテーブルA where name in(****)は、in文の中で変数を使いたいと思っていますが、この変数にはin('李
四',‘張三’),この時は絶対に書いてはいけません
 
 
  • DECLARE
  • v1 VARCHAR2(100):='a,b';
  • num1 NUMBER;
  • BEGIN
  • SELECT COUNT(1) INTO num1 FROM a WHERE m_name IN (v1);
  • dbms_output.put_line(num1);
  • END;

  • このとき必ず出力するのは0です.oracleはあなたの「a,b」を1つの値に解析するので、記録が調べられないに違いありません.このときは動的sqlを使います.以下に提供します.
    よく使われる書き方:
    この書き方は必ずintoを外に書いて、少し変に見えますが
     
     
  • DECLARE
  • v1 VARCHAR2(100):='''a'',''b''';
  • num1 NUMBER;
  • BEGIN
  • execute IMMEDIATE
  • 'select count(1) from a where m_name in ('||v1||')' INTO num1;
  • dbms_output.put_line(num1);
  • END;

  •  
    次の書き方では効果は得られません.バインド変数でもデフォルトでは1つの変数であり、1つの変数で複数の変数値を格納する効果は得られません.
     
     
  • DECLARE
  • v1 VARCHAR2(100):='''a'',''b''';
  • num1 NUMBER;
  • v_sql VARCHAR2(200);
  • BEGIN
  • v_sql := 'select count(1) from a where m_name in (:1)';
  • execute immediate v_sql INTO num1 USING v1;
  •  
  • dbms_output.put_line(num1);
  • END;

  • ----------------------本文はluckman 100のCSDNブログから来て、全文の住所はクリックしてください:https://blog.csdn.net/luckyman100/article/details/17735759?utm_source=copy