这是在动态游标中使用的,上面是得到一个指针,
动态游标可以让你动态编辑要执行的SQL文,不需要事先写好。
还可以实现DDL语句的执行

解决方案 »

  1.   

    CREATE OR REPLACE PROCEDURE CreateTable(
        p_Description IN VARCHAR2
    )IS
    v_CURSOR  NUMBER;
    v_CreateString VARCHAR2(100);
    v_NumRows INTEGER;
    BEGIN
       v_Cursor  :=  DBMS_SQL.OPEN_CURSOR;
       v_CreateString := 'CREATE TABLE temp_table'||p_Description;
       DBMS_SQL.PARSE(v_CURSOR,v_CreateString,DBMS_SQL.V7);
       v_NumRows := DBMS_SQL.EXECUTE(v_Cursor);
       DBMS_SQL.CLOSE_CURSOR(v_Cursor);END;
    这个v_Cursor被定义的是什么?执行的时候返回的又是什么?(好不明白呀?):(
      

  2.   

    动态游标不仅可以执行sql,还可以执行dml。
    上面的过程游标就被定义为dml语句,动态创建表,这是静态游标不能完成的。执行后v_NumRows返回操作是否完成的信息。静态游标只能执行查询语句。
      

  3.   

    这种游标可以嵌套吗?比如我定义一个动态游标是DDL的,在LOOP在过程中我再OPEN一个动态游标可以吗?因为我要用动态游标建一个表,而这张表的字段名还依赖于一个被选出来的记录集(也就是上一个游标)的某一字段的记录内容,两个都是动态的,怎么办??
    举例:
    第一次游标的记录集:
       Year  xzq    value
       2000  北京    10
       2003  天津    20
    要建一个表:
       2000  2003
       10    20 请高手赐教,头都大了!:(
      

  4.   

    为什么不用create table as select???
      

  5.   

    不是很清楚你要建的表的结构,你自己换一下试试.
    还有,列名好像不能为数字或中文字符.我建了不成功.
    create or replace procedure CreateTable is
    v_col1 varchar2(20);
    v_col2 varchar2(20);
    v_col3 varchar2(20);
    v_createtable varchar2(20);
    v_Cursor number;
    cursor createtable is
       select year,xzq,value from table1;
    begin
         open createtable;
         loop
         fetch createtable into v_col1,v_col2,v_col3;
         v_Cursor := Dbms_Sql.Open_Cursor;
         v_createtable := '你建表的语句'
         DBms_sql.Parse(v_Cursor,v_createtable,DBMS_Sql.v7);
         Dbms_Sql.Close_Cursor(v_Cursor);
         
         exit when createtable%notfound;
         end loop;
         close createtable;
      
      
      
    end CreateTable;