这个应该是数据库的栏位设计有问题,比如varchar2只能输入8000个字符。检查一下你的table设计,看看相应的栏位的类型

解决方案 »

  1.   

    CREATE OR REPLACE PROCEDURE proc_mayfb_writenews(ptitle     VARCHAR2,
                                                     pcolumnid  VARCHAR2,
                                                     pinputtime VARCHAR2,
                                                     pauthor    VARCHAR2, --作者
                                                     psource    VARCHAR2,
                                                     pcontent   VARCHAR2,
                                                     ret_flag   OUT NUMBER,
                                                     ret_msg    OUT VARCHAR2,
                                                     ret_cur    IN OUT defpkg.empty_cur,
                                                     isold      NUMBER) IS
        v_num     NUMBER;
        v_titleid VARCHAR2(38);
        loc_clob  CLOB;
        amt       BINARY_INTEGER := 32767;
    BEGIN
        ret_flag := 0;
        ret_msg  := '成功!';
        SAVEPOINT s1;
        IF isold > 0 THEN
            SELECT seq_titleid.NEXTVAL
            INTO   v_num
            FROM   dual;
            v_titleid := to_char(v_num - isold);
            SELECT content
            INTO   loc_clob
            FROM   t_yfbnews_content
            WHERE  wzid = v_titleid
            FOR    UPDATE;
            dbms_lob.writeappend(loc_clob, amt, pcontent);
        ELSE
            SELECT seq_titleid.NEXTVAL
            INTO   v_num
            FROM   dual;
            v_titleid := to_char(v_num);
            INSERT INTO t_yfbnews
                (titleid, title, columnid, SOURCE, author, inputtime)
            VALUES
                (v_titleid,
                 ptitle,
                 pcolumnid,
                 psource,
                 pauthor,
                 to_date(pinputtime, 'yyyy/mm/dd hh24:mi'));
            INSERT INTO t_yfbnews_content
                (wzid, content)
            VALUES
                (v_titleid, pcontent);
        END IF;
        COMMIT;
        OPEN ret_cur FOR
            SELECT 1
            FROM   dual;EXCEPTION
        WHEN OTHERS THEN
            BEGIN
                ret_flag := 101;
                ret_msg  := '错误';
                ROLLBACK TO s1;
            END;
    END proc_mayfb_writenews;先替你整形一下,看起来方便些
      

  2.   

    我是参照别人的例子做的,套用一下,对存储过程中大isold判断不是很理解谁能给我讲解以下
    ---------------------------------------新闻录入表------------------------------------
    create table t_yfbnews(
    titleid int not null, --文章编号
    title varchar2(300), --文章标题
    columnid        varchar2(10), --栏目类别(1 2 3 4 5 6 7 8)
    source varchar2(40), --出处
    author varchar2(40), --作者
    inputtime date default sysdate, --录入时间
    isvaild varchar2(1) default '1' , --是否废弃 0-废  1-用
    primary         key(titleid)
    )
    tablespace D_USER
    pctfree 20
    pctused 60
    storage (initial 16K
             next   16K
             freelists 10
             freelist groups 2);
    CREATE SEQUENCE seq_titleid INCREMENT BY 1 START WITH 1 MAXVALUE 99999999 NOCYCLE NOCACHE ORDER;--------------------------------------新闻内容表--------------------------------------------------
    create table t_yfbnews_content(
    wzid int not null,         --文章编号
    content         CLOB ,                  --文章内容
    isvaild varchar2(1) default '1' --是否废弃 0-废  1-用
    )
    tablespace D_USER
    pctfree 20
    pctused 60
    storage (initial 128K
             next    64K
             freelists 10
             freelist groups 2);