char* call_sql="SELECT TABLE_NAME,COLUMN_NAME,DATA_DEFAULT"
               " FROM user_tab_columns"
               " WHERE table_name in (select table_name from user_tables);"
otl_stream o(1,call_sql,db);
o.set_commit(0);
char* table_name=new char;
char* column_id=new char;
char* data_default=new char;
o>>table_name>>column_id>>data_default;
cout<<table_name<<'\t'<<column_id<<'\t'<<data_default;
程序是用来得到所有表中每个字段的默认值属性问题出在,当默认值不存在时,o>>data_default会产生错误,导致程序崩溃我要问的问题是:
1.为什么没有默认值时,会崩溃?
2.应该怎么解决,以便让我可以完整的显示所有列的默认值属性?
3.要以table_name分组显示结果,应该怎么写sql语句?我在后面加group by table_name是会出错的

解决方案 »

  1.   

    SELECT a.TABLE_NAME,count(*)
    FROM user_tab_columns a, user_tables b
    where a.table_name = b.table_name 
    group by  a.table_name            
      

  2.   


    估计是因为long数据列导致的崩溃。
    解决办法:
    建立一个函数如下:
    CREATE OR REPLACE FUNCTION long_to_varchar2(IN_pk1     VARCHAR2,
                                               in_pk2      VARCHAR2,
                                               IN_COLUMN     VARCHAR2,
                                               IN_TABLE_NAME VARCHAR2,
                                               IN_OWNER      VARCHAR2 DEFAULT USER)
      RETURN VARCHAR AS
      TEXT_C1 LONG;
      SQL_CUR VARCHAR2(2000);
      L_R     VARCHAR2(4000);
    BEGIN
      SQL_CUR := 'select ' || IN_COLUMN || ' from ' || IN_TABLE_NAME || ' where table_name =''' ||
                 IN_pk1 || ''' and column_name='''|| in_pk2 
                ||'''';
      DBMS_OUTPUT.PUT_LINE(SQL_CUR);
      EXECUTE IMMEDIATE SQL_CUR
        INTO TEXT_C1;
      L_R := SUBSTR(TEXT_C1, 1, 4000);
      RETURN L_R;
    END;
    /
    --把你的sql改成如下的形式,试试:
    SELECT TABLE_NAME,
           COLUMN_NAME,
           LONG_TO_VARCHAR2(TABLE_NAME,
                            COLUMN_NAME,
                            'DATA_DEFAULT',
                            'user_tab_columns',
                            USER) DATA_DEFAULT
      FROM USER_TAB_COLUMNS
     WHERE TABLE_NAME IN (SELECT TABLE_NAME FROM USER_TABLES);
      
      

  3.   

    如果还是报错,就把sql改成如下的形式:
    SELECT TABLE_NAME,
           COLUMN_NAME,
           nvl(LONG_TO_VARCHAR2(TABLE_NAME,
                            COLUMN_NAME,
                            'DATA_DEFAULT',
                            'user_tab_columns',
                            USER),'no default data') DATA_DEFAULT
      FROM USER_TAB_COLUMNS
     WHERE TABLE_NAME IN (SELECT TABLE_NAME FROM USER_TABLES);
      

  4.   

    函数我不懂,是用来给那些没data_default值的列做处理的么?
    为什么会这么麻烦呢...我把data_default去掉是可以得到其他结果的