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

テーブル名をカーソルに渡す

    JackPDouglasの回答を拡張するために、カーソル内の[テーブル]名としてパラメーター名を使用することはできません。動的SQLをREFCURSORに利用する必要があります

    http://download.oracle.com /docs/cd/B10500_01/appdev.920/a96590/adg09dyn.htm#24492

    CREATE OR REPLACE PROCEDURE dynaQuery(
           TAB IN VARCHAR2, 
           sid in number ,
           cur OUT NOCOPY sys_refcursor) IS
     query_str VARCHAR2(200);
    BEGIN
        query_str := 'SELECT USERNAME FROM ' || tab
          || ' WHERE sid= :id';
    dbms_output.put_line(query_str);
        OPEN cur FOR query_str USING sid;
    END ;
    /
    

    開始例

    create table test1(sid number, username varchar2(50));
    insert into test1(sid, username) values(123,'abc');
    insert into test1(sid, username) values(123,'ddd');
    insert into test1(sid, username) values(222,'abc');
    commit;
    /
    
    
    
     declare 
      cur  sys_refcursor ;
      sid number ;
      uName varchar2(50) ;
      begin
      sid := 123; 
      dynaQuery('test1',sid, cur);
       LOOP
         FETCH cur INTO uName;
         DBMS_OUTPUT.put_line(uName);
         EXIT WHEN cur%NOTFOUND;
         -- process row here
       END LOOP;
    CLOSE CUR;
    
    
      end ;
    

    出力:

    SELECT USERNAME FROM test1 WHERE sid= :id
    abc
    ddd
    abc
    ddd
    ddd
    

    編集:@JackPDouglasによって正しく提案されたCloseCURを追加しました




    1. Oracle.DataaccessエラーORA-06502:PL / SQL:数値または値のエラー:文字列バッファが小さすぎます

    2. vb6のDatagridの他の列に基づいてアクセスから対応するレコードを表示する方法

    3. SQL Server(T-SQL)のパーティションテーブルの境界値を取得する

    4. で非オブジェクトのプロパティを取得しようとしています