用动态SQL V_STR VARCHAR2(500);
BEGIN
V_STR:='select count(distinct('||AAA||')) from Table where '|| BBB ||'= 123';
EXECUTE IMMEDIATE V_STR INTO V_COUNT;
...

解决方案 »

  1.   

    cursor_handle  := Dbms_sql.open_cursor;
             v_sql    :=
             'select count(distinct('||参数1||')) into v_count from Table '||参数2;
             Dbms_sql.parse(cursor_handle, v_sql, Dbms_sql.v7);
             v_ret    := Dbms_sql.EXECUTE(cursor_handle);
             Dbms_sql.close_cursor(cursor_handle);
      

  2.   

    cursor_handle  := Dbms_sql.open_cursor;
    v_sql:='select count(distinct('||参数1||')) into v_count from Table '||参数2;
    Dbms_sql.parse(cursor_handle, v_sql, Dbms_sql.v7);
    DBMS_SQL.DEFINE_COLUMN(cursor_handle,1,v_row);
    v_ret := DBMS_SQL.EXECUTE(cursor_handle);
    v_ret := DBMS_SQL.FETCH_ROWS(cursor_handle);
    DBMS_SQL.COLUMN_VALUE(cursor_handle,1,v_value);
    out_value := v_row;
    Dbms_sql.close_cursor(cursor_handle);
      

  3.   

    create procedure pro(p_filed in varchar2,p_where in varchar2)
    as
    v_count number;
    str varchar2(50);
    begin
    str:='select count(distinct('||p_filed||')) from Table '||p_where;
    execute immediate str into v_count;
    dbms_output.put_line(v_count);
    end;
    /
      

  4.   

    为什么会出错?PLS-00103: 出现符号"IMMEDIATE"在需要下列之一时?
    :=.(@%;
      

  5.   

    8.0.5以前的版本数据库不支持
    用dbms_sql包来执行
      

  6.   

    用的是8.0.5,真的不行吗?dbms_sql包比较麻烦哦
      

  7.   

    参考以下帮助吧:
    http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96612/d_sql.htm#ARPLS058
      

  8.   

    对于select count(distinct(AAA)) into v_count from Table where BBB = 123 
    之类不定条件的SQL语句,最好不要把关键词WHERE当作参数了,这里第一个参数没问题,第二个可以通过下面这样后加上去:
    select count(distinct(AAA)) into v_count from Table where 1=1 ,如果还有条件就加上and BBB = 123 ,没有就算了。注意空格的保留。
      

  9.   

    现在关键的问题是存储过程编译不过去,在这句话上出错:
    execute immediate str into v_count;
    到底是不是oracle 8.0.5的关系呢?
    在oracle 8i下是否就可以?