简体   繁体   English

PLS-00201:必须声明标识符“COL1.POTO”

[英]PLS-00201: identifier 'COL1.POTO' must be declared

Hi I have problem with variable:嗨,我对变量有疑问:

在此处输入图像描述

Here is my code这是我的代码

CREATE OR REPLACE Procedure WstawPotomka(  wPesel IN    Osoba.Pesel%TYPE, wImie IN Osoba.Imie%Type ,
wNazwisko IN    Osoba.Nazwisko%TYPE,  wDataUr IN Osoba.Data_Urodzenia%Type,    wMiejsceUr IN Osoba.Miejsce_Urodzenia%Type, PeselMatka IN    Osoba.Matka%Type, PeselOjciec IN Osoba.Ojciec%Type) 
AS Cursor Potomek    
IS SELECT 
o.pesel as Col1, b.pesel AS Col2, c.pesel AS Col3 FROM    OSOBA o 
CROSS JOIN Osoba b 
CROSS JOIN Osoba c; 
poto Potomek%ROWTYPE;    
BEGIN 
OPEN Potomek; 
LOOP 
FETCH Potomek INTO poto; 
EXIT WHEN    Potomek%NotFound; 
IF Col1.poto != wPesel THEN    
IF COL2.poto = PeselMatka and COL3.poto = PeselOjciec THEN 
INSERT INTO Osoba Values (wPesel, wImie, wNazwisko, wDataUr, wMiejsceUr,    null, PeselMatka, PeselOjciec, null); 
END IF; 
END IF; 
END LOOP; 
Close Potomek; 
END; 

The Osoba table:奥索巴表:

在此处输入图像描述

It's my first post so don't be so angry for formatting.这是我的第一篇文章,所以不要为格式化而生气。

This can be done with a single efficient SQL statement.这可以通过一个有效的 SQL 语句来完成。

I highly doubt that the SELET statement and the general logic in your code is correct.我非常怀疑代码中的 SELET 语句和一般逻辑是否正确。 CROSS JOINs create a cartesian product and are always suspect. CROSS JOIN 创建一个笛卡尔积并且总是被怀疑的。 But even worse: The inserted rows only take data from the input parameters and thus are all the same.但更糟糕的是:插入的行仅从输入参数中获取数据,因此都是相同的。 The SELECT statement only determines the number of rows. SELECT 语句仅确定行数。

CREATE OR REPLACE PROCEDURE WstawPotomka(
    wPesel      IN  Osoba.Pesel%TYPE,
    wImie       IN  Osoba.Imie%TYPE ,
    wNazwisko   IN  Osoba.Nazwisko%TYPE, 
    wDataUr     IN  Osoba.Data_Urodzenia%TYPE,
    wMiejsceUr  IN  Osoba.Miejsce_Urodzenia%TYPE,
    PeselMatka  IN  Osoba.Matka%TYPE,
    PeselOjciec IN  Osoba.Ojciec%TYPE
) 
AS
    INSERT INTO Osoba
    SELECT wPesel, wImie, wNazwisko, wDataUr, wMiejsceUr, NULL, PeselMatka, PeselOjciec, NULL
    FROM    OSOBA o 
    CROSS JOIN Osoba b 
    CROSS JOIN Osoba c
    WHERE o.pesel <> wPesel
      AND b.pesel = PeselMatka
      AND c.pesel = PeselOjciec;
END; 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM