2011-06-23 22 views
2

ref_cursorで結果を取得したいが、それを行うことができない。実行時の参照カーソル

だけで即時

CREATE OR REPLACE PROCEDURE TEST_PROC_QT (p_name IN VARCHAR2, 
              p_result_set OUT sys_refcursor) IS 

    v_sql VARCHAR2(4000); 

BEGIN 

    v_sql := ''; 
    v_sql := 'SELECT * FROM USERS WHERE 1=1 '; 

    IF p_name is not null THEN 
    v_sql := v_sql || ' AND login_id = :v_name'; 
    ELSE 
    v_sql := v_sql || ' AND ((1=1) or :v_name is null)'; 
    END IF; 

    Dbms_output.put_line(v_sql); 

    EXECUTE IMMEDIATE v_sql 

    --OPEN p_result_set for v_sql 
    --INTO p_result_set using p_name; 

END; 
+1

全く関係のないものの(即時実行で)クエリを書くのは良い方法である:「LOGIN_IDは= NVL USERS SELECT * FROM(: v_name、login_id) ' –

+0

@Thomas Jones-Low:あなたがその列にインデックスを持っていればうまくいかないでしょう。 – Robotron

答えて

8

を実行使用してREF_CURSORで結果を取得する方法を私に勧めてください:あなたは、あなたが選択したデータを保持するために型を作成する必要があり

OPEN p_result_set for v_sql using p_name; 
1
  1. が起こっていますたとえば、戻ることができます。上記で作成したオブジェクトを維持するタイプのテーブルを作成します

    create type users_type as object (id number, name varchar2); 
    
  2. : これは、ユーザーテーブルuser(id number, name varchar2)あなたです想像して、あなたのタイプは次のようになります。

    create type users_table_object as table of users_type; 
    
  3. プロシージャを作成します。

    create the procedure test(
    cv_1 OUT SYS_REFCURSOR 
    .... 
    ) 
    as 
    users_table_object; 
    v_query VARCHAR2(2000); 
    
    begin 
    v_query := N'select users_type(id, name) from users '; 
    
    execute immediate 
    bulk collect into users_table_object; 
    
    open cv_1 for table(users_table_object)  
    
関連する問題