<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)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 青青草国产免费国产是公开| 国产乱码免费卡1卡二卡3卡| 国产又大又长又粗又硬的免费视频| 亚洲视屏在线观看| 中文字幕免费高清视频| 亚洲日韩图片专区第1页| 久久久久久一品道精品免费看| 亚洲av网址在线观看| 99在线视频免费观看| 亚洲成a人片在线观看无码| 久久午夜夜伦鲁鲁片免费无码 | 成人无码视频97免费| 亚洲人成电影网站国产精品| 国产高清视频免费在线观看 | 1区2区3区产品乱码免费| 91亚洲国产在人线播放午夜| 五月亭亭免费高清在线| 亚洲欧美日韩一区二区三区 | 亚洲一级高清在线中文字幕| 和日本免费不卡在线v| 欧美亚洲国产SUV| 中文字幕在线亚洲精品| 三年片在线观看免费观看大全动漫 | 久久精品国产亚洲AV久| 国产禁女女网站免费看| 国产精品视频全国免费观看 | 国产美女无遮挡免费视频| 免费一级毛片在线播放放视频| 在线播放亚洲第一字幕| 97精品免费视频| 亚洲人成自拍网站在线观看| 亚洲国产综合精品一区在线播放| 99麻豆久久久国产精品免费| 亚洲免费网站在线观看| 亚洲国产综合人成综合网站| 99国产精品免费观看视频| 亚洲av成本人无码网站| 国产aⅴ无码专区亚洲av| 久久久久久99av无码免费网站| 特级毛片爽www免费版| 99人中文字幕亚洲区|