Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 带游标的PL SQL嵌套IF-ELSE_Oracle_For Loop_Plsql_Cursor - Fatal编程技术网

Oracle 带游标的PL SQL嵌套IF-ELSE

Oracle 带游标的PL SQL嵌套IF-ELSE,oracle,for-loop,plsql,cursor,Oracle,For Loop,Plsql,Cursor,我有三个游标声明为CUR_AD1、CUR_AD1_C、CUR_adu 2。它们所包含的全部内容都是来自3条简单的select语句的结果,这些语句运行良好 稍后我有以下陈述: 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_PERSO

我有三个游标声明为CUR_AD1、CUR_AD1_C、CUR_adu 2。它们所包含的全部内容都是来自3条简单的select语句的结果,这些语句运行良好

稍后我有以下陈述:

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:必须声明组件“邮政编码” PL/SQL:ORA-00984:此处不允许列

这些桌子没有任何问题。我认为这和我如何放置控制语句有关。非常感谢您的帮助

表DSOPI\u PERSON\u ADDR\u规则的DDL

  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=' ')); 

请检查表中的邮政编码拼写匹配ECS列名,以便进行调试

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_代码

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

这是有用的

编辑

问题是您的游标声明

  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列,但您试图访问许多不在光标中的列(如邮政编码);确保添加邮政编码和所需的所有其他列。或者只是从INSERT语句中删除它们

逻辑一开始似乎很奇怪
V_ORG_NAME
设置为
AD1_REC.ADDRESS\u LINE1
,然后立即与相同的值进行比较。如果这应该是一个
NULL
检查,那么
is NULL
的用法可能会更清楚。另外,要调试,不要捕获并引发异常,然后您将看到行号。将
IF
语句一起删除,然后分别尝试这两个语句,看看哪一个(或如果两者)会导致悲伤。可能还需要查看定义。也许您关于空检查的想法是正确的。这段代码是我的另一位同事写的,所以我不知道他为什么这么做。但从你所说的来看,似乎我需要把平等性检查排除在循环之外?如果我错了,请纠正我。你能发布一个关于DSOPI_PERSON_ADDR_ru RULE和游标的描述吗?正如罗杰所说,请发布游标的描述-CUR_AD2,准确地说。即使我删除了错误指针指向下一个最后一列,也不是邮政编码。。。我想这是整个街区。我意识到这不是邮政编码。即使假设我删除了邮政编码,错误也会再次指向最后一列中的第二列。我认为在启动第二个循环后,出现了一些控制语句问题。现在,当我添加TGT_ADDRESS_LINE1列时,它表明循环索引变量“AD2_REC”的用法无效。有什么想法吗?让我们