【问题标题】:expression of wrong type oracle error错误类型 oracle 错误的表达
【发布时间】:2015-03-19 23:16:05
【问题描述】:

我正在尝试执行下面的 plsql 程序,但遇到了错误类型的表达式。谁能告诉我可能是什么错误?

CREATE OR REPLACE PROCEDURE CLN_TBL (CTRLM IN VARCHAR2, CTG IN  VARCHAR,SBCT IN NUMBER, RTDT IN NUMBER )    
AS    
    V_SQL VARCHAR(2000);   
    V_TABLE VARCHAR(30);    
    CURSOR TBL_CUR    
    IS    
    SELECT TGT_TABLE_NAME FROM ODS_USER.CLNP WHERE CONTROLM=CTRLM AND     APPL_CTGY=CTG AND APPL_SUB_CTGY= SBCT;    
    L_TGT_TABLE_NAME TBL_CUR%ROWTYPE;    
BEGIN    
    OPEN TBL_CUR;    
    LOOP    
        FETCH TBL_CUR INTO L_TGT_TABLE_NAME;    
        V_TABLE:= L_TGT_TABLE_NAME ;    
        EXIT WHEN TBL_CUR%NOTFOUND;    
        V_SQL:='DELETE FROM '||V_TABLE||' WHERE RPT_DT_ID'||'=:1';    
        EXECUTE IMMEDIATE V_SQL using RTDT;    
    END LOOP;    
    COMMIT;    
    CLOSE TBL_CUR;   
END;

【问题讨论】:

  • 这里你不能像V_TABLE:= L_TGT_TABLE_NAME这样赋值,这是ROWTYPE属性到varchar在oracle中是非法的。这里不需要动态查询,除非你的表名是动态的。你可以直接从表中删除它。

标签: oracle stored-procedures plsql plsqldeveloper plsql-psp


【解决方案1】:

正如 Exhausted 所说,您不能将行变量分配给 varchar,因此您应该从行变量中获取 TGT_TABLE_NAME,如下所示应该可以;

    CREATE OR REPLACE PROCEDURE CLN_TBL (CTRLM IN VARCHAR2, CTG IN   VARCHAR,SBCT IN NUMBER, RTDT IN NUMBER )    
AS    
V_SQL VARCHAR(2000);   
V_TABLE VARCHAR(30);    
CURSOR TBL_CUR    
IS    
SELECT TGT_TABLE_NAME FROM ODS_USER.CLNP WHERE CONTROLM=CTRLM AND     APPL_CTGY=CTG AND APPL_SUB_CTGY= SBCT;    
L_TGT_TABLE_NAME TBL_CUR%ROWTYPE;    
BEGIN    
OPEN TBL_CUR;    
LOOP    
    FETCH TBL_CUR INTO L_TGT_TABLE_NAME;    
    V_TABLE:= L_TGT_TABLE_NAME.TGT_TABLE_NAME ;    
    EXIT WHEN TBL_CUR%NOTFOUND;    
    V_SQL:='DELETE FROM '||V_TABLE||' WHERE RPT_DT_ID'||'=:1';    
    EXECUTE IMMEDIATE V_SQL using RTDT;    
END LOOP;    
COMMIT;    
CLOSE TBL_CUR;   
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多