Oracle 带游标的PL SQL嵌套IF-ELSE
我有三个游标声明为CUR_AD1、CUR_AD1_C、CUR_adu 2。它们所包含的全部内容都是来自3条简单的select语句的结果,这些语句运行良好 稍后我有以下陈述: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
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”的用法无效。有什么想法吗?让我们