超过4000个字符在oracle上给出字符串文字太长的错误

hsu*_*suk 1 sql database oracle pdo plsql

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

 ORA-01704: string literal too long
Run Code Online (Sandbox Code Playgroud)

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

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

在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;
Run Code Online (Sandbox Code Playgroud)

这对于超过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');
Run Code Online (Sandbox Code Playgroud)

小智 7

看一下这个 :

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

你确定不支持吗?


wol*_*lφi 5

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