1

私は現在、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;

ヒキガエルで解雇されたとき、これは私のために働いた。ここで、ストアドプロシージャを作成し、次のようにコンパイルしました。

    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');
4

3 に答える 3

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;

これがサポートされていませんか?

于 2012-12-20T05:50:03.903 に答える
5

PL / SQLでは、aVARCHAR2は32767バイトを持つことができますが、SQLでは4000バイトしかありません。したがって、BEGIN...END;ブロックはPL / SQLであるため機能し、プロシージャはSQLであるため機能しませんでした。

于 2012-12-19T10:03:35.133 に答える
4

varchar24000文字の制限があります。CLOB代わりに使用してください。

于 2012-12-19T08:58:16.983 に答える