PLS-00201: 必须声明标识符 'COL1.POTO'
PLS-00201: identifier 'COL1.POTO' must be declared
嗨,我有变量问题:
这是我的代码
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;
大荞麦 table:
这是我的第一个post所以不要为格式化而生气。
这可以通过一个高效的 SQL 语句来完成。
我非常怀疑您代码中的 SELET 语句和一般逻辑是否正确。 CROSS JOIN 创建了一个笛卡尔积并且总是令人怀疑。但更糟糕的是:插入的行仅从输入参数中获取数据,因此都是相同的。 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
BEGIN
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;
嗨,我有变量问题:
这是我的代码
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;
大荞麦 table:
这是我的第一个post所以不要为格式化而生气。
这可以通过一个高效的 SQL 语句来完成。
我非常怀疑您代码中的 SELET 语句和一般逻辑是否正确。 CROSS JOIN 创建了一个笛卡尔积并且总是令人怀疑。但更糟糕的是:插入的行仅从输入参数中获取数据,因此都是相同的。 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
BEGIN
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;