2012-10-18 78 views
0

我有三个光标声明CUR_AD1,CUR_AD1_C,CUR_AD_2。它们包含的所有结果都来自3个简单的选择语句,可以正常工作。PL SQL嵌套IF ELSE与光标

后来我有以下语句:

BEGIN 

    FOR AD1_REC IN CUR_AD1 LOOP 

     V_ORG_NAME := AD1_REC.ADDRESS_LINE1; 


    IF V_ORG_NAME = AD1_REC.ADDRESS_LINE1 THEN 
     INSERT INTO DSOPI_PERSON_ADDR_RULE 
     (CCTR_PERSON_ADDRESS_ID, CCTR_PERSON_ID, SRC_ADDRESS_LINE1, SRC_ADDRESS_LINE2, SRC_ADDRESS_LINE3, SRC_ADDRESS_LINE4, 
     ORG_NAME, DEPT_NAME, TGT_ADDRESS_LINE1, TGT_ADDRESS_LINE2, TGT_ADDRESS_LINE3, TGT_ADDRESS_LINE4, 
     STATE, CITY, COUNTRY_NAME, ZIP_CODE, EXTRACT_DATE) 
     VALUES 
     (AD1_REC.CCTR_PERSON_ADDRESS_ID, AD1_REC.CCTR_PERSON_ID, AD1_REC.ADDRESS_LINE1, AD1_REC.ADDRESS_LINE2, AD1_REC.ADDRESS_LINE3, AD1_REC.ADDRESS_LINE4, 
     V_ORG_NAME, '', '', AD1_REC.ADDRESS_LINE2, AD1_REC.ADDRESS_LINE3, AD1_REC.ADDRESS_LINE4, 
     AD1_REC.STATE, AD1_REC.CITY, AD1_REC.COUNTRY_NAME, AD1_REC.ZIP_CODE, SYSDATE); 

    ELSIF V_ORG_NAME = AD1_REC.ADDRESS_LINE2 THEN 
     FOR AD2_REC IN CUR_AD2 LOOP 

     INSERT INTO DSOPI_PERSON_ADDR_RULE 
     (CCTR_PERSON_ADDRESS_ID, CCTR_PERSON_ID, SRC_ADDRESS_LINE1, SRC_ADDRESS_LINE2, SRC_ADDRESS_LINE3, SRC_ADDRESS_LINE4, 
     ORG_NAME, DEPT_NAME, TGT_ADDRESS_LINE1, TGT_ADDRESS_LINE2, TGT_ADDRESS_LINE3, TGT_ADDRESS_LINE4, 
     STATE, CITY, COUNTRY_NAME, ZIP_CODE, EXTRACT_DATE) 
     VALUES 
     (AD2_REC.CCTR_PERSON_ADDRESS_ID, AD2_REC.CCTR_PERSON_ID, AD2_REC.ADDRESS_LINE1, AD2_REC.ADDRESS_LINE2, AD2_REC.ADDRESS_LINE3, AD2_REC.ADDRESS_LINE4, 
     AD2_REC.ADDRESS_LINE2, NULL, AD2_REC.TGT_ADDRESS_LINE1, NULL, AD2_REC.ADDRESS_LINE3, AD2_REC.ADDRESS_LINE4, 
     AD2_REC.STATE, AD2_REC.CITY, AD2_REC.COUNTRY_NAME, AD2_REC.ZIP_CODE, SYSDATE); 
     END LOOP; 
     END IF; 

END LOOP;     
EXCEPTION WHEN OTHERS THEN 
DBMS_OUTPUT.PUT_LINE('ERROR' || SQLERRM); 
RAISE;  
END; 

当我编译身体我不断收到以下错误:

PL/SQL:SQL语句忽略 PLS-00302:组件“ZIP_CODE '必须声明 PL/SQL:ORA-00984:此处不允许使用列

表中没有任何问题。我认为它必须对我的控制语句做些什么。任何帮助,高度赞赏。

DDL的表DSOPI_PERSON_ADDR_RULE

CREATE TABLE "CALSEED_OWNER"."DSOPI_PERSON_ADDR_RULE" 
    ( "CCTR_PERSON_ADDRESS_ID" NUMBER(12,0), 
    "CCTR_PERSON_ID" NUMBER(12,0), 
    "SRC_ADDRESS_LINE1" VARCHAR2(100 BYTE), 
    "SRC_ADDRESS_LINE2" VARCHAR2(100 BYTE), 
    "SRC_ADDRESS_LINE3" VARCHAR2(100 BYTE), 
    "SRC_ADDRESS_LINE4" VARCHAR2(100 BYTE), 
    "ORG_NAME" VARCHAR2(100 BYTE), 
    "DEPT_NAME" VARCHAR2(100 BYTE), 
    "TGT_ADDRESS_LINE1" VARCHAR2(100 BYTE), 
    "TGT_ADDRESS_LINE2" VARCHAR2(100 BYTE), 
    "TGT_ADDRESS_LINE3" VARCHAR2(100 BYTE), 
    "TGT_ADDRESS_LINE4" VARCHAR2(100 BYTE), 
    "STATE" VARCHAR2(100 BYTE), 
    "CITY" VARCHAR2(100 BYTE), 
    "COUNTRY_NAME" VARCHAR2(100 BYTE), 
    "ZIP_CODE" VARCHAR2(100 BYTE), 
    "EXTRACT_DATE" DATE, 
    "STREET" VARCHAR2(100 BYTE), 
    "STREET_CONTD" VARCHAR2(100 BYTE) 

CURSOR CUR_AD2 IS   
     SELECT CCTR_PERSON_ADDRESS_ID, 'AL2' AL,ADDRESS_LINE2 
     FROM STG_RT2_PERSON_ADDRESS WHERE UPPER(ADDRESS_LINE2) IN 
     (SELECT UPPER(ORG_NAME) FROM STG_RT2_ORGANIZATION 
     WHERE NOT REGEXP_LIKE(ORG_NAME, '[0-9]') 
     AND NOT (LOWER(ORG_NAME) LIKE 'unknown' OR LOWER(ORG_NAME) LIKE 'no address%' 
     OR ORG_NAME ='-' OR ORG_NAME=' ')); 
+0

开始时逻辑看起来很奇怪。 'V_ORG_NAME'设置为'AD1_REC.ADDRESS_LINE1',然后立即与相同的值比较。如果这应该是一个'NULL'检查,'IS NULL'的使用可能会更清楚。另外,为了调试,不要捕捉并引发异常,那么您将看到行号。完全删除“IF”语句并单独尝试两个语句,以查看哪个(或两者)导致悲伤。可能还需要查看定义。 – Glenn

+0

也许你是对的无效检查想法。这段代码是由我的另一位同事编写的,所以我不确定他为什么这么做。但从你所说的看来,我需要在循环之外进行平等检查?纠正我,如果我错了。 – Bytekoder

+0

你可以发布DSOPI_PERSON_ADDR_RULE和游标的描述吗? – Roger

回答

2

为了调试的目的,你可以使用

DBMS_UTILITY.format_error_backtrace; 

,让您的游标确保所有的别名(不仅是你的表)匹配你试图访问的列,例如

FOR x IN SELECT zip_code zipCode FROM myTable LOOP 
    dbms_output.put_line(x.zip_Code) 
END LOOP; 

该示例中断是因为x包含zipCode而不是zip_code。

根据您提供的信息,我们无法提供任何进一步的帮助,发布您的表格以及您的游标声明的描述或制作可编辑的示例。

这是非常有用http://sqlfiddle.com/

编辑

的问题是你的光标声明

SELECT 
    CCTR_PERSON_ADDRESS_ID, 
    'AL2' AL, 
    ADDRESS_LINE2, 
    ZIP_CODE -- ADD THIS FOR THE ZIP CODE, YOU NEED TO ADD ALL THE OTHER COLUMNS ASWELL... 
FROM 
    STG_RT2_PERSON_ADDRESS 
    WHERE 
    UPPER(ADDRESS_LINE2) IN 
    (
     SELECT 
     UPPER(ORG_NAME) 
     FROM 
     STG_RT2_ORGANIZATION 
     WHERE 
     NOT REGEXP_LIKE(ORG_NAME, '[0-9]') 
     AND NOT 
     (
      LOWER(ORG_NAME) LIKE 'unknown' 
     OR LOWER(ORG_NAME) LIKE 'no address%' 
     OR ORG_NAME ='-' 
     OR ORG_NAME =' ' 
     ) 
    ); 

每CUR_AD_2是你的结果集的记录,因此它有同样的列数和名称,在你的查询中,你只有3列,但你试图访问很多(如邮政编码)不在游标中;确保添加ZIP_CODE和所有其他需要的列。或者只是从INSERT语句中删除它们

+0

我已经认识到它不是邮政编码。即使可以说我删除了邮政编码,错误又回到了倒数第二列。我认为在我开始第二个循环后,会有一些控制语句问题。 – Bytekoder

+0

@Bytekoder阅读我的编辑,让我知道如果我解释得好 – Roger

+0

你是男人! – Bytekoder

0

请在下表检查ZIP_CODE拼写matchecs列名

+0

即使我删除错误指针到下一个最后一列,它也不是邮政编码...我认为它是整个块。 – Bytekoder