【问题标题】:Oracle bad bind variable , Statement ignored and one more errorOracle 绑定变量错误,语句被忽略,还有一个错误
【发布时间】:2017-12-01 08:37:29
【问题描述】:

我是 Oracle 的新手,我尝试编写我的第一个真正的触发器,但有一些错误... :(

这是我的代码:

create or replace TRIGGER CUSTERP_ABILITYVALUECODES_TRG
BEFORE INSERT OR UPDATE OF CODE OR DELETE ON ABILITYVALUECODES
REFERENCING NEW AS newest OLD AS oldest
FOR EACH ROW
declare s varchar2(4096);
BEGIN
    if :oldest.CODE <> :newest.CODE then
    if :newest.CODE is null then
        s := 'NULL';
    else
        s := ASCIISTR(:newest.CODE);
    end if;
    s:= utl_url.escape(s);
    if :newest.CODE is null then
        CUSTERP_TRG('T_ABILITYVALUECODES', concat('C_CODE;KEY: ABILITYVALUE = ', :oldest.ABILITYVALUE,  ',OLD:', :oldest.CODE, ',NEW:', s));
    else
        CUSTERP_TRG('T_ABILITYVALUECODES', concat('C_CODE;KEY: ABILITYVALUE =',  :newest.ABILITYVALUE,  ',OLD:', :oldest.CODE, ',NEW:', s));
    end if;
end if;
END;

我收到以下错误: 错误(11,13):PL/SQL:语句被忽略(似乎是指 s:=...) 错误(11,53):PLS-00306:调用“CONCAT”时参数的数量或类型错误

如果我这样做:

s := 'NULL';   

我得到:错误(6,13):PLS-00049:错误的绑定变量“S”

提前致谢!

【问题讨论】:

    标签: sql database oracle triggers oracle-sqldeveloper


    【解决方案1】:

    在错误信息中很清楚。 Error is in concat function that you are using to call method- CUSTERP_TRG.
    CONCAT 函数只接受两个字符串参数。
    如果你想连接两个以上的参数,你需要多次使用 CONCAT 函数。
    您正在使用 Oracle,所以您应该使用管道 - || 进行连接。
    我假设 ABILITYVALUE 和 CODE 列的类型为 CHAR 或 VARCHAR 或 VARCHAR2。如果它们是 INT,那么您可能需要使用 TO_CHAR。
    用以下代码替换 TRIGGER 中的 if-else 块。

    if :newest.CODE is null then
      CUSTERP_TRG( 'T_ABILITYVALUECODES', 'C_CODE;KEY: ABILITYVALUE = ' || :oldest.ABILITYVALUE ||  ',OLD:' || :oldest.CODE || ',NEW:' || s );
    else
      CUSTERP_TRG( 'T_ABILITYVALUECODES', 'C_CODE;KEY: ABILITYVALUE =' || :newest.ABILITYVALUE ||  ',OLD:' || :oldest.CODE || ',NEW:' || s );
    end if;
    

    【讨论】:

    • 当然。欢迎。 :)
    猜你喜欢
    • 2012-02-10
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    相关资源
    最近更新 更多