sql >> データベース >  >> RDS >> Oracle

PL/SQLは「IN」句を使用して連結クエリを書き換えます

    私の推測では、vList IDを区切り文字列に入れるために以前にいくつかの手順を実行しました(vListがどのように入力されたかはわかりません)。 1つのクエリとして保持してみませんか?

    begin
    ...
    select name
    bulk collect into tNames
    from t_user
    where id in (select id from some_table where ...);
    ...
    

    何度も実行するときのコンテキストの切り替えは苦痛を伴う可能性がありますが、私にとって最悪の部分は、パラメーター入力を数値のリストとして盲目的に受け入れていることです。それは(無邪気に)「1,2、X」である可能性があり、実行時エラー「無効な番号」が表示されます。さらに悪いことに、SQLインジェクション攻撃である可能性があります。一般的には悪い習慣ですが(動的SQLにはその場所があります)、それをどのように使用しているかは間違いありません。

    次のようなものを試してください:

    create or replace type t_num_tab as table of number;
    
    create or replace procedure test_proc(i_list in t_num_tab) as
      type t_name_tab is table of varchar2(100);
      l_names t_name_tab;
    begin
      -- get names
      select name
      bulk collect into l_names
      from user_table
      where id in (select * from table(i_list));
    
      -- do something with l_names
      dbms_output.put_line('Name count: ' || l_names.count);
    
    end;
    

    数値のリストよりも複雑なものが必要な場合は、オブジェクトタイプを作成できます。



    1. psql:サーバーに接続できませんでした:接続が拒否されましたリモートデータベースに接続するときにエラーが発生しました

    2. 内部結合を使用してクエリを挿入する

    3. Postgresql&psycopg2:データベースが存在しません

    4. SQL Server 2008 の .mdf および .ldf ファイルからデータベースを復元する