insert语句,使用默认值的问题。

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

14 个解决方案

#1


没人知道么?

#2


用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;

#3


 
insert语句??


你 要 插入一条数据,那COL2肯定是空的,没有什么的好判断的。


如果COL2当为空时,使用默认值, nvl(COL2,DEFAULT)


如果是更新的话

update tablename set COL2=nvl(COL2,DEFAULT) where COL1='TEST'

#4


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

#5


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

#6


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

#7


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

#8


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

#9


给你写个函数实现
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> 

#10


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

#11


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

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

#12


code=SQL]insert tablename (COL1,COL2) VALUES ('TEST','') ;
insert tablename (COL1,COL2) VALUES ('TEST','123') ;[[/code]

就直接插入就行了啊,不为空就插入非空值,为空数据库会默认default值的。

#13


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

#14


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

#1


没人知道么?

#2


用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;

#3


 
insert语句??


你 要 插入一条数据,那COL2肯定是空的,没有什么的好判断的。


如果COL2当为空时,使用默认值, nvl(COL2,DEFAULT)


如果是更新的话

update tablename set COL2=nvl(COL2,DEFAULT) where COL1='TEST'

#4


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

#5


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

#6


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

#7


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

#8


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

#9


给你写个函数实现
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> 

#10


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

#11


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

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

#12


code=SQL]insert tablename (COL1,COL2) VALUES ('TEST','') ;
insert tablename (COL1,COL2) VALUES ('TEST','123') ;[[/code]

就直接插入就行了啊,不为空就插入非空值,为空数据库会默认default值的。

#13


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

#14


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