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

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

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

    編程生活

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      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 閱讀(510) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 午夜免费福利影院| 美女黄网站人色视频免费国产 | 国产亚洲精品免费视频播放| 免费女人18毛片a级毛片视频| 理论亚洲区美一区二区三区| 啊灬啊灬别停啊灬用力啊免费看| 亚洲av色香蕉一区二区三区| 免费又黄又爽又猛的毛片| 七次郎成人免费线路视频| 亚洲熟妇无码八AV在线播放| a毛片在线免费观看| 亚洲最新视频在线观看| 国产精品视频免费| 亚洲第一第二第三第四第五第六 | 久久精品成人免费网站| 亚洲精品美女在线观看播放| 精品香蕉在线观看免费| 亚洲avav天堂av在线网毛片| 亚洲Av无码乱码在线znlu| 99精品免费视频| 亚洲高清视频免费| 成人午夜性A级毛片免费| 色费女人18女人毛片免费视频| 中国亚洲女人69内射少妇| 免费无码毛片一区二区APP| 最新国产精品亚洲| 亚洲日本一区二区三区在线不卡| 最近免费中文字幕MV在线视频3| 亚洲成aⅴ人片在线观| 成人国产mv免费视频| XXX2高清在线观看免费视频| 亚洲高清美女一区二区三区| 国产青草视频在线观看免费影院| 51午夜精品免费视频| 亚洲国产日韩在线成人蜜芽 | 最近中文字幕高清免费中文字幕mv| 亚洲国产最大av| 亚洲日韩中文在线精品第一| 4444www免费看| 春意影院午夜爽爽爽免费| 久久久久亚洲精品日久生情|