<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    編程生活

       :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      113 隨筆 :: 0 文章 :: 18 評論 :: 0 Trackbacks

    With 7.2 on up of the database you have cursor variables.  Cursor variables are cursors opened by a pl/sql routine and fetched from by another application or pl/sql routine (in 7.3 pl/sql routines can fetch from cursor variables as well as open them). The cursor variables are opened with the privelegs of the owner of the procedure and behave just like they were completely contained within the pl/sql routine. It uses the inputs to decide what database it will run a query on.

    Here is an example:
     

    create or replace package types
    as
        type cursorType is ref cursor;
    end;
    /

    create or replace function sp_ListEmp return types.cursortype
    as
        l_cursor    types.cursorType;
    begin
        open l_cursor for select ename, empno from emp order by ename;

        return l_cursor;
    end;
    /
    create or replace procedure getemps( p_cursor in out types.cursorType )

    as

    begin

          open p_cursor for select ename, empno from emp order by ename;

    end;

    /

    examples for SQLPlus, Pro*C, Java/JDBC, ODBC, ADO/ASP, DBI Perl and OCI follow:

    REM SQL*Plus commands to use a cursor variable

    variable c refcursor
    exec :c := sp_ListEmp
    print c

    exec getEmps( :c )

    print c


    and the Pro*C to use this would look like:

    static void process()
    {
    EXEC SQL BEGIN DECLARE SECTION;
        SQL_CURSOR  my_cursor;
        VARCHAR     ename[40];
        int         empno;
    EXEC SQL END DECLARE SECTION;

        EXEC SQL WHENEVER SQLERROR DO sqlerror_hard();

        EXEC SQL ALLOCATE :my_cursor;

        EXEC SQL EXECUTE BEGIN
            :my_cursor := sp_listEmp;
        END; END-EXEC;

        for( ;; )
        {
            EXEC SQL WHENEVER NOTFOUND DO break;
            EXEC SQL FETCH :my_cursor INTO :ename, empno;

            printf( "'%.*s', %d"n", ename.len, ename.arr, empno );
        }
        EXEC SQL CLOSE :my_cursor;
    }

    And the java to use this could be:
     

    import java.sql.*;
    import java.io.*;
    import oracle.jdbc.driver.*;
     

    class curvar
    {
      public static void main (String args [])
                         throws SQLException, ClassNotFoundException
      {
          String driver_class = "oracle.jdbc.driver.OracleDriver";
          String connect_string = "jdbc:oracle:thin:@slackdog:1521:oracle8";

          String query = "begin :1 := sp_listEmp; end;";
          Connection conn;

          Class.forName(driver_class);
          conn = DriverManager.getConnection(connect_string, "scott", "tiger");

          CallableStatement cstmt = conn.prepareCall(query);
          cstmt.registerOutParameter(1,OracleTypes.CURSOR);
          cstmt.execute();
          ResultSet rset = (ResultSet)cstmt.getObject(1);

          while (rset.next ())
            System.out.println( rset.getString (1) );
          cstmt.close();
      }
    }


    posted on 2007-10-25 17:02 wilesun 閱讀(507) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产啪亚洲国产精品无码| 亚洲产国偷V产偷V自拍色戒| 男女猛烈无遮掩视频免费软件| 亚洲欧洲美洲无码精品VA | 久久精品国产影库免费看| 亚洲欧洲在线播放| avtt亚洲天堂| 5555在线播放免费播放| 色九月亚洲综合网| 亚洲美女大bbbbbbbbb| 免费少妇a级毛片人成网| 成人性生交大片免费看中文| 亚洲欧洲日韩国产一区二区三区| 国产亚洲色婷婷久久99精品91| 成人免费视频69| 精品一区二区三区高清免费观看| 亚洲中文字幕无码爆乳| 久久噜噜噜久久亚洲va久| 国产免费人视频在线观看免费| 无码av免费一区二区三区| 偷自拍亚洲视频在线观看99| 亚洲精品无码久久毛片波多野吉衣| 免费很黄很色裸乳在线观看| 日韩欧毛片免费视频| 你懂的免费在线观看| 国产99久久亚洲综合精品| jlzzjlzz亚洲jzjzjz| 亚洲av之男人的天堂网站| 伊人久久亚洲综合影院| 一个人在线观看视频免费| 久久A级毛片免费观看| 9久久免费国产精品特黄| 国产尤物在线视精品在亚洲| 亚洲精品中文字幕无乱码| 亚洲色精品vr一区二区三区| 免费一级肉体全黄毛片| 女人被男人躁的女爽免费视频 | 国产99久久久久久免费看| 亚洲国产av玩弄放荡人妇| 亚洲欧洲日产国码在线观看| 亚洲AV无码成人专区片在线观看 |