ORA-01461: can bind a LONG value only for insert into a LONG column

Error info

ORA-01461: can bind a LONG value only for insert into a LONG column
ORA-06512: at "VKC2.TESTNVARCHAR2", line 8
ORA-06512: at line 6
01461. 00000 -  "can bind a LONG value only for insert into a LONG column"
*Cause:    
*Action:

Reproduce

1. create table a_test (col NVARCHAR2(2000));
2. create or replace procedure testnvarchar2(in_para nvarchar2) 
    as 
    begin  
        insert into a_test (col) values (in_para); 
    end;
3. DECLARE
      IN_PARA NVARCHAR2(20000);
    BEGIN
      IN_PARA := '超过2000字符长的字符串';

      TESTNVARCHAR2(
        IN_PARA => IN_PARA
      );
    --rollback; 
    END;

Reason

  1. oracle数据库中varchar2类型长度<=4000, nvarchar2<=2000
  2. pl/sql, sql developer等客户端中varchar2/nvarchar2类型的长度为32767,远大于数据库中所能存储的
  3. nvarchar2相较varchar2的意义,
    1. 当数据库的字符集是西文字符集时,nvarchar2中仍然可以存储中文字符,varchar2中的中文字符会出现乱码。
    2. 相应的nvarchar2格式的数据库文件体积也会增加一倍

Solution

  1. 数据库解决,长字符串就用长数据类型存储。长数据类型不能直接用alter修改.Firebird详解
ALTER TABLE a_test ADD (col2 nCLOB);
UPDATE a_test SET col2 = col;
ALTER TABLE a_test DROP COLUMN col;
ALTER TABLE a_test RENAME COLUMN col2 TO col;
  1. 前端解决,限制单次传入的字符串长度,前端千变万化,好麻烦。。。
  2. 12c 支持数据类型拓展,可以varchar2/nvarchar2等可以超过4000/2000,需要修改数据库的配置。Extended Data Types in Oracle Database 12c Release 1 (12.1)
    1. 影响范围太大,不推荐。只是作为一种解决方案
    CONN / AS SYSDBA
    ALTER SYSTEM SET max_string_size=extended SCOPE=SPFILE;
    SHUTDOWN IMMEDIATE;
    STARTUP UPGRADE;
    ALTER PLUGGABLE DATABASE ALL OPEN UPGRADE;
    EXIT;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值