存储过程如下:
CREATE OR REPLACE FUNCTION WEBDB.FUNC_WRITE_USER (
    P_OPER              IN   NUMBER,                               --操作 0 增加 1 修改2 删除
    P_Account         IN   T_User_Info.I_Account%TYPE,   --帐号
    P_PWD              IN   T_User_Info.I_Pwd%TYPE,        --用户密码
    P_FLAG             IN   T_User_Info.I_Flag%TYPE,        --权限 0:系统管理员 1:普通管理员
    P_NAME            IN   T_User_Info.I_Name%TYPE        --姓名
)
    RETURN NUMBERAS
    -- 变量申明
    V_STRINS   VARCHAR2 (2000):= '';   -- 追加数据表SQL文本
    V_STRUPD   VARCHAR2 (2000):= '';   -- 更新数据表SQL文本
    V_STRDEL   VARCHAR2 (2000):= '';    -- 删除数据表SQL文本
    V_STRSEL   VARCHAR2 (300) := '';   -- 检索数据表SQL文本
    V_STRNO    VARCHAR2 (100) := '';   -- 检索序列SQL文本
    V_COUNT    NUMBER (3);               --记录数
    V_FLAG     NUMBER(1) := P_OPER;  --操作 0 增加 1 修改2 删除BEGIN
    -------------------------------------
    -- 动态事件数据表追加SQL文本       --
    -------------------------------------
    V_STRINS := V_STRINS || 'INSERT INTO T_User_Info VALUES(';
    V_STRINS := V_STRINS || ':P_Account  ,';   --帐号
    V_STRINS := V_STRINS || ':P_PWD  ,';   --用户密码
    V_STRINS := V_STRINS || ':P_FLAG    ,';   --权限 0:系统管理员 1:普通管理员
    V_STRINS := V_STRINS || ':P_NAME     )';   --姓名
    -------------------------------------
    -- 动态事件数据表更新SQL文本       --
    -------------------------------------
    V_STRUPD := V_STRUPD || 'UPDATE T_User_Info SET ';
    V_STRUPD := V_STRUPD || 'I_PWD     = :P_PWD    ,';   --用户密码
    V_STRUPD := V_STRUPD || 'I_FLAG    = :P_FLAG    ,';   --权限 0:系统管理员 1:普通管理员
    V_STRUPD := V_STRUPD || 'I_NAME   = :P_NAME    ';   --姓名
    V_STRUPD := V_STRUPD || ' WHERE I_Account = :P_Account  ';
    -------------------------------------
    -- 动态事件数据表删除SQL文本       --
    -------------------------------------
    V_STRDEL := V_STRDEL || 'DELETE FROM  T_User_Info ';
    V_STRDEL := V_STRDEL || 'WHERE I_Account = :P_Account  ';    BEGIN
        V_STRSEL := V_STRSEL || 'SELECT COUNT(*) FROM T_User_Info ';
        V_STRSEL := V_STRSEL || 'WHERE I_Account = :P_Account ';
        EXECUTE IMMEDIATE V_STRSEL INTO V_COUNT  --符合条件的记录数
      USING
    P_Account ;
    END;
    IF V_COUNT = 0 AND V_FLAG = 0 THEN
        -- 执行数据库追加SQL语句
        EXECUTE IMMEDIATE V_STRINS
            USING
            P_Account,   --帐号
            P_PWD,        --用户密码
            P_FLAG,        --权限 0:系统管理员 1:普通管理员
            P_NAME;       --姓名     ELSIF V_COUNT > 0 AND V_FLAG = 1 THEN
        -- 执行数据库更新SQL语句
        EXECUTE IMMEDIATE V_STRUPD
            USING
            P_Account,   --帐号
            P_PWD,        --用户密码
            P_FLAG,        --权限 0:系统管理员 1:普通管理员
            P_NAME;       --姓名     ELSIF V_COUNT > 0 AND V_FLAG = 2 THEN
        -- 执行数据库删除SQL语句
        EXECUTE IMMEDIATE V_STRDEL
           USING
           P_Account;    
     ELSE
   RETURN 0;
     END IF;    COMMIT;    RETURN 1;-- 错误陷阱
EXCEPTION
   WHEN OTHERS THEN
   RETURN 0;END FUNC_WRITE_USER;
/
带进参数执行添加/删除都可以,执行更新时也执行正确,RETURN 1了,可就是不更新,为什么呢?
谢谢各位大侠!
有关表结构:
CREATE TABLE T_User_Info(
    I_Account      VARCHAR2(20)   NOT NULL ,  --帐号  *
    I_Pwd            VARCHAR2(20)   NOT NULL ,  --密码
    I_Flag            NUMBER(1,0)     NOT NULL ,  --权限 0:系统管理员 1:普通管理员
    I_Name          VARCHAR2(20)   NULL ,         --姓名   CONSTRAINT T_User_Info PRIMARY KEY(I_Account)
)
;

解决方案 »

  1.   

    注意:占位符跟变量没有对应起来。
      将  USING
                P_Account,   --帐号
                P_PWD,        --用户密码
                P_FLAG,        --权限 0:系统管理员 1:普通管理员
                P_NAME;       --姓名
    改为
     using
    P_PWD,--用户密码
    P_FLAG,--权限 0:系统管理员 1:普通管理员
    P_NAME,--姓名
    P_Account  --帐号
      

  2.   

    http://expert.csdn.net/Expert/topic/2120/2120061.xml?temp=.8506586