【问题标题】:Compilation error when declaring a new TYPE IS RECORD声明新的 TYPE IS RECORD 时出现编译错误
【发布时间】:2023-01-08 02:54:57
【问题描述】:

我正在尝试为我的学校项目声明一个必须包含至少 2 个不同游标的过程。我的程序应该得到订单(Comanda)中的所有产品(Produs),它们的价格(Pret)至少是我给函数的 v_pret 参数,但我收到以下错误:

Errors: PROCEDURE EXERCITIUL7 Line/Col: 0/0 PL/SQL: Compilation unit analysis terminated Line/Col: 8/43 PLS-00320: the declaration of the type of this expression is incomplete or malformed

这是我在此过程中使用的表的数据库模式:

这是我的程序代码:

`CREATE OR REPLACE PROCEDURE exercitiul7
    (v_pret Produs.Pret%TYPE)
AS

    TYPE randComanda IS RECORD(v_ID_Comanda Comanda.ID_Comanda%TYPE);
    ID_Comenzi randComanda;

    TYPE randProdus IS RECORD(v_ID_Produs ProduseComanda.ID_Produs%TYPE);
    ID_Produse randProdus;

    CURSOR comenzi(pretCursor NUMBER) IS 
        SELECT ID_Comanda FROM Comanda 
                                   WHERE pretCursor >= pret;

    CURSOR produsecomanda(v_ID_Comanda ProduseComanda.ID_Comanda%TYPE) IS
        SELECT ID_Produs FROM ProduseComanda 
                                    WHERE v_ID_Comanda = ID_Comanda;

    CURSOR produse IS SELECT * FROM Produs;

BEGIN

    OPEN comenzi(v_pret);
    LOOP
        FETCH comenzi INTO ID_Comenzi;
        EXIT WHEN comenzi%NOTFOUND;

        OPEN produsecomanda(ID_Comenzi.ID_Comanda);
        LOOP
            FETCH produsecomanda INTO ID_Produse;
            EXIT WHEN produsecomanda%NOTFOUND;

            FOR produs IN produse LOOP
                IF produs.ID_Produs = ID_Produse.ID_Produs THEN
                DBMS_OUTPUT.PUT_LINE(produs.nume);
                END IF;
            END LOOP;

        END LOOP;

    END LOOP;

END exercitiul7;
`

我怎么解决这个问题?我不知道该怎么办

【问题讨论】:

  • “ID_Comanda”或“ID_Comanda#”:检查名称是否正确,模式和 PL/SQL 代码之间存在矛盾。
  • 请提供create table语句来重现问题。另请注意,这种情况不需要显式游标,您可以使用这些表的普通 join 并处理此语句的结果

标签: sql oracle plsql


【解决方案1】:

您的代码中的命名和语法存在一些问题。您可以找到可能将您推向正确方向的代码,而不是在下面对其进行评论。
假设我们有一些样本数据可能看起来像您拥有的数据。

产品

ID_PRODUS NUME PRET
1 Nume 1 111
2 Nume 2 222
3 Nume 3 333

制作指挥官

ID_PRODUS_COMANDA ID_PRODUS ID_COMANDA
1A 1 A
2B 2 B
3C 3 C

科曼达

ID_COMANDA ID_CLIENT PRET
A 101 120
B 102 245
C 103 300

使用上述数据,您的程序可能如下所示:

create or replace PROCEDURE 
    EXERCITIUL7(v_pret Produs.Pret%TYPE)
AS
    --
    CURSOR comenzi IS 
        SELECT DISTINCT ID_COMANDA FROM COMANDA; 
    Comanda_ID_COMANDA COMANDA.ID_COMANDA%TYPE; 
    --  
    CURSOR prodComanda IS
        SELECT p.NUME FROM PRODUSECOMANDA pc Inner Join PRODUS p ON(p.ID_PRODUS = pc.ID_PRODUS)  WHERE pc.ID_COMANDA = Comanda_ID_COMANDA And v_pret >= p.PRET;
    Produs_NUME   PRODUS.NUME%TYPE;
BEGIN
    --
    OPEN comenzi;
    LOOP
        FETCH comenzi INTO Comanda_ID_COMANDA;
        EXIT WHEN comenzi%NOTFOUND;
        --
        
        OPEN prodComanda;
        LOOP
            FETCH prodComanda INTO Produs_NUME;
            EXIT WHEN prodComanda%NOTFOUND;
       --
            DBMS_OUTPUT.PUT_LINE(Produs_NUME);
        END LOOP;
        CLOSE prodComanda;
    
    END LOOP;
    CLOSE comenzi;
    --
END EXERCITIUL7

请注意,它可以用 1 个光标(或选择)来完成,但你说你需要其中的 2 个。我没有使用 ROWTYPE 变量,因为不需要它们,因为您只选择了游标中的一列。
下面是程序的试运行:

SET SERVEROUTPUT ON
BEGIN
    EXERCITIUL7(300);
END;

/*  R e s u l t :
anonymous block completed
Nume 1
Nume 2
*/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多