insert语句,使用默认值的问题。
insert tablename (COL1,COL2) VALUES ('TEST',NVL('',DEFAULT))
这句话为什么不对,如果COL2可能为空 ,可能不为空,当为空时,使用默认值。 这个insert语句应该怎么写?
DEFAULT 不能代表默认值吗?

解决方案 »

  1.   

    用2条语句写,
    insert tablename (COL1,COL2)
    select COL1,COL2 from ta where COL2 is not null;insert tablename (COL1)
    select COL1 from ta where COL2 is null;
      

  2.   

     
    insert语句??
    你 要 插入一条数据,那COL2肯定是空的,没有什么的好判断的。
    如果COL2当为空时,使用默认值, nvl(COL2,DEFAULT)
    如果是更新的话update tablename set COL2=nvl(COL2,DEFAULT) where COL1='TEST'
      

  3.   

    NVL('',DEFAULT)
    的两个参数都必需是字符型的
    其实你不用这么写的,直接插入一个值,另一个值会自动默认的!
      

  4.   

    insert tablename (COL1) VALUES ('TEST');
    直接这样就可以了。 
      

  5.   

    楼主的需求一步是很难实现的,你可以首先不管是不是空值都进行插入,之后再将空值的替换为默认值
    update temp_table set col2 = default where col2 is null
      

  6.   

    提示不是说的很明白了吗?
     nvl的第二参数只能是表达式或者常量,不能是这些default的保留字。
      

  7.   

    给tableName 的 COL2字段使用Default值就行了;
    INSERT tablename (COL1,COL2) values ('TEST','你要插入的COL2值');
      

  8.   

    给你写个函数实现
    SQL> create table tt
      2  (
      3  id int  ,
      4  name varchar(20) default 'watson'
      5  )
      6  /表已创建。SQL> CREATE OR REPLACE FUNCTION GetDefaultData (
      2  p_tname IN VARCHAR2,
      3  p_cname IN VARCHAR2
      4  )
      5  RETURN VARCHAR2
      6  AS
      7    l_cursor INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
      8    l_n NUMBER;
      9    l_long_val VARCHAR2 (4000);
     10    l_long_len NUMBER;
     11    l_buflen NUMBER := 4000;
     12    l_curpos NUMBER := 0;
     13  BEGIN
     14    DBMS_SQL.PARSE (l_cursor, '
     15      SELECT data_default 
     16        FROM USER_TAB_COLUMNS utc 
     17        WHERE UPPER(utc.table_name) = ''' || p_tname || ''' 
     18          AND UPPER(utc.COLUMN_NAME) = ''' || p_cname || ''' 
     19         ', DBMS_SQL.native);
     20    DBMS_SQL.DEFINE_COLUMN_LONG (l_cursor, 1);
     21    l_n := DBMS_SQL.EXECUTE (l_cursor);
     22  
     23    IF (DBMS_SQL.FETCH_ROWS (l_cursor) > 0) THEN
     24    DBMS_SQL.COLUMN_VALUE_LONG (l_cursor, 1, l_buflen, l_curpos, l_long_val, l_long_len);
     25    END IF;
     26    DBMS_SQL.CLOSE_CURSOR (l_cursor);
     27  
     28    RETURN l_long_val;
     29  END GetDefaultData;
     30  /函数已创建。SQL> create or replace procedure p_t(input_val  varchar2)
      2  is
      3  Begin
      4  insert into tt values(1,nvl(input_val,GetDefaultData(upper('tt'),upper('name'))));
      5   commit;
      6  End;
      7  /过程已创建。SQL> exec p_t('');PL/SQL 过程已成功完成。SQL> select * from tt;        ID NAME
    ---------- --------------------
             1 'watson'SQL> 
      

  9.   

    楼主的要求一条SQL是不行的
    具体实现应该是这样
    首先为col2建立默认值,且设置为不能为空
    然后先插入col1的值,当col2有另外的值时,再更新col2
    insert into tablename(col1) values('Test');
    在你的代码里做一个判断,如果对应于col2的变量或控件的值不为空
    再执行如下代码
    update tablename set col2='123' where col1='Test';
    当然这就要求col1是主键
      

  10.   

    如果你的COL2字段设定了默认值的话,你直接插入就好了。如果你插入的值为空,ORACLE会自动用默认值代替的~
      

  11.   

    code=SQL]insert tablename (COL1,COL2) VALUES ('TEST','') ;
    insert tablename (COL1,COL2) VALUES ('TEST','123') ;[[/code]就直接插入就行了啊,不为空就插入非空值,为空数据库会默认default值的。
      

  12.   

    insert tablename (COL1,COL2) VALUES ('TEST',DEFAULT) 
      

  13.   

    在设计表结构的时候可以指定col2字段的default值;
    另外参考nvl函数的用法