【问题标题】:More than 4000 chars gives string literal too long error on oracle超过 4000 个字符在 oracle 上给出字符串文字太长的错误
【发布时间】:2012-12-06 13:58:54
【问题描述】:

我目前在 Codeigniter 上使用 oci8 驱动程序。 在更新将包含超过 4000 个字符的字段时,我收到了一个错误:

 ORA-01704: string literal too long

所以,通过几个博客,我得到了这个:

    declare
    vClobVal varchar2(32767) := 'long text'
    begin
    update FMS_K_OFFICEWISE_LETTER set FKOL_LETTER_BODY=vClobVal 
    where FKOL_OFFICEWISE_LETTER_ID=240;
    end;

当我向 Toad 开除时,这对我有用。 现在,我创建了一个存储过程并编译为:

    CREATE OR REPLACE PROCEDURE FMIS3.UPDATE_LETTER_BODY  ( body_text IN FMS_K_OFFICEWISE_LETTER.FKOL_LETTER_BODY%type,condition_id in FMS_K_OFFICEWISE_LETTER.FKOL_OFFICEWISE_LETTER_ID%type)IS
    begin    
        update FMS_K_OFFICEWISE_LETTER set FKOL_LETTER_BODY=body_text 
    end;

这对于超过 4000 个字符再次不起作用。我不能定义 varchar2 的大小,因为它给了我错误。有什么建议吗?

即使尝试通过绑定参数使用 PDO,也只能在字符串大小小于 4000 个字符时起作用:(

    $conn = new PDO("oci:dbname=".$this->db->hostname,$this->db->username,$this->db->password);
    $params = array(
        ':body_text' => "Long String"
    );
    $sth = $conn->prepare("update FMS_K_OFFICEWISE_LETTER set FKOL_LETTER_BODY = :body_text
                            where FKOL_OFFICEWISE_LETTER_ID=241");            
    $sth->execute($params) or die('error occured');

【问题讨论】:

标签: sql database oracle plsql pdo


【解决方案1】:

varchar2 限制为 4000 个字符。请改用CLOB

【讨论】:

  • @KusH 那么为什么将变量定义为varchar2(32767) 而不是clob?理想情况下,您应该将变量定义为 FMS_K_OFFICEWISE_LETTER.FKOL_LETTER_BODY%type 以避免出错。
  • @KusH "... 理想情况下,您应该将变量定义为 ..." 我会比理想情况更进一步,并说如果您不使用 Type 和 RowType 那么您肯定是错误的。 en.wikipedia.org/wiki/Don%27t_repeat_yourself
  • 我支持这个答案,另外他应该使用DBMS_LOBfunctionatlity 在他的程序中的那些 clob/nclob 列中工作
  • @Najzero :在创建存储过程时定义 CLOB 返回相同的内容。只有 4000 个字符。我将搜索 DBMS_LOB。谢谢。
  • @DavidAldridge :也找不到你。
【解决方案2】:

在 PL/SQL 中,VARCHAR2 可以有 32767 个字节,但在 SQL 中只有 4000 个字节。因此,BEGIN ... END; 块工作,因为它是 PL/SQL,而过程没有,因为它是 SQL。

【讨论】:

【解决方案3】:

看看这个:

declare
vClobVal varchar2(32767) := 'long text'
begin
update FMS_K_OFFICEWISE_LETTER set FKOL_LETTER_BODY=vClobVal 
where FKOL_OFFICEWISE_LETTER_ID=240;
end;

你确定不支持吗?

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    相关资源
    最近更新 更多