ORACLE  的游标是不能动态定义的

解决方案 »

  1.   

    你的sql拼的有问题sqlstr:='select * from mytalbe where field1='||para1||' and 
      field2='||para2||' and field3='||para3; 改为
    sqlstr:='select * from mytalbe where field1='||para1||' and  '||
      ' field2='||para2||' and field3='||para3;
      

  2.   

    看一些pl/sql的基础对你比较有帮助。
      

  3.   

    字符串没有问题,只是出了微细的错误。
    sqlstr varchar2;
    改为:
    sqlstr varchar2(100);
      

  4.   

    我已将sqlstr varchar2改为了sqlstr varchar2(100),
    但是当我在Oracle Schema manager里编辑这个存储过程时,
    create procedure test_1(table_cursor out hxapkg.hxatypequery
    ,mem_id in number)
    AS
      sqlstr varchar2(100);
    begin
     sqlstr:='select * from entity_members where card_id='||mem_id;
     Open table_cursor for sqlstr;
    end;
    给出如下错误:
    PLS-00103:出现符号"SQLSTR"在需要下列之一时
              select
    不知何故,请各位大虾明示,我用的Oralce是8.0.5
    谢谢了
      

  5.   

    你的oracle不支持动态SQL,要用dbms_parse之类的包。
      

  6.   

    用dbms_sql如何返回一个记录集呢
      

  7.   

    错误在
    create procedure test_1(table_cursor in out hxapkg.hxatypequery%TYPE
    ,mem_id in number)
      

  8.   

    给你一个例子吧,对应修改你的程序。declare
      c number;
      d number;
      col_cnt integer;
      f boolean;
      rec_tab dbms_sql.desc_tab;
      col_num number;
      procedure print_rec(rec in dbms_sql.desc_rec) is
      begin
        dbms_output.new_line;
        dbms_output.put_line('col_type            =    '
                             || rec.col_type);
        dbms_output.put_line('col_maxlen          =    '
                             || rec.col_max_len);
        dbms_output.put_line('col_name            =    '
                             || rec.col_name);
        dbms_output.put_line('col_name_len        =    '
                             || rec.col_name_len);
        dbms_output.put_line('col_schema_name     =    '
                             || rec.col_schema_name);
        dbms_output.put_line('col_schema_name_len =    '
                             || rec.col_schema_name_len);
        dbms_output.put_line('col_precision       =    '
                             || rec.col_precision);
        dbms_output.put_line('col_scale           =    '
                             || rec.col_scale);
        dbms_output.put('col_null_ok         =    ');
        if (rec.col_null_ok) then
          dbms_output.put_line('true');
        else
          dbms_output.put_line('false');
        end if;
      end;
    begin
      c := dbms_sql.open_cursor;  dbms_sql.parse(c, 'select * from scott.bonus', dbms_sql);
     
      d := dbms_sql.execute(c);
     
      dbms_sql.describe_columns(c, col_cnt, rec_tab);/*
     * Following loop could simply be for j in 1..col_cnt loop.
     * Here we are simply illustrating some of the PL/SQL table
     * features.
     */
      col_num := rec_tab.first;
      if (col_num is not null) then
        loop
          print_rec(rec_tab(col_num));
          col_num := rec_tab.next(col_num);
          exit when (col_num is null);
        end loop;
      end if;
     
      dbms_sql.close_cursor(c);
    end;
    /
      

  9.   

    dbms_sql 这里用不着,直接处理就可以
      

  10.   

    你如此使用动态Sql返回数据集需8.1.7以上的版本。
      

  11.   

    其实游标是不支持动态的,
    只有游标变量才支持动态
    用ref来定义
    你可以查一下pl/sql书立刻可知