包 "set serveroutput on" 导致编译错误
Package "set serveroutput on" causing compilation error
我正在使用我的 class 程序包模板将两个程序收集到程序包中,在粘贴并格式化所有内容后,我遇到了这个错误:
这是我的包裹代码。头身分开。
CREATE OR REPLACE
PACKAGE PAQEX AS
PROCEDURE EX3 (P_NOMBRE IN VARCHAR2, P_LUGAR IN VARCHAR2, P_NUMERO IN NUMBER);
PROCEDURE EX2(CPN IN VARCHAR2, NUMER OUT NUMBER );
END PAQEX;
CREATE OR REPLACE
PACKAGE BODY PAQEX AS
PROCEDURE EX3 (P_NOMBRE IN VARCHAR2, P_LUGAR IN VARCHAR2, P_NUMERO IN NUMBER) AS
--
V_AEROPUERTO NUMBER;
V_TERMINAL NUMBER;
V_ID_AEROPUERTO AEROPUERTO.ID%TYPE;
BEGIN
-----------
SELECT COUNT(*) INTO V_AEROPUERTO FROM AEROPUERTO WHERE NOMBRE = P_NOMBRE AND LUGAR = P_LUGAR;
IF V_AEROPUERTO = 0 THEN
INSERT INTO AEROPUERTO (NOMBRE, LUGAR) VALUES (P_NOMBRE, P_LUGAR);
DBMS_OUTPUT.PUT_LINE('INSERTANDO AEROPUERTO');
ELSE
DBMS_OUTPUT.PUT_LINE('YA EXISTE EL AEROPUERTO');
END IF;
SELECT ID INTO V_ID_AEROPUERTO FROM AEROPUERTO WHERE NOMBRE = P_NOMBRE AND LUGAR = P_LUGAR;
------------
SELECT COUNT(*) INTO V_TERMINAL FROM TERMINAL WHERE NUMERO = P_NUMERO AND ID_AEROPUERTO = V_ID_AEROPUERTO;
IF V_TERMINAL = 0 THEN
INSERT INTO TERMINAL (NUMERO, ID_AEROPUERTO) VALUES (P_NUMERO, V_ID_AEROPUERTO);
DBMS_OUTPUT.PUT_LINE('INSERTANDO TERMINAL');
ELSE
DBMS_OUTPUT.PUT_LINE('YA EXISTE LA TERMINAL');
END IF;
END EX3;
PROCEDURE EX2(CPN IN VARCHAR2, NUMER OUT NUMBER ) AS
CURSOR CVUELO IS
SELECT CS.NOMBRE AS COMPA,MDEL.NOMBRE AS MODELL,ASA.NOMBRE AS ORIGEN,AL.NOMBRE AS DESTINO
FROM VUELO VU
INNER JOIN AVION AVI
ON VU.ID_AVION = AVI.ID
INNER JOIN COMPAÑIA CS
ON AVI.ID_COMPAÑIA = CS.ID
INNER JOIN MODELO MDEL
ON AVI.ID_MODELO = MDEL.ID
INNER JOIN PUERTA PS
ON VU.id_puerta_salida = PS.ID
INNER JOIN PUERTA PL
ON VU.id_puerta_llegada = PL.ID
INNER JOIN TERMINAL TS
ON PS.ID_TERMINAL = TS.ID
INNER JOIN TERMINAL TL
ON PL.ID_TERMINAL = TL.ID
INNER JOIN AEROPUERTO ASA
ON TL.ID_AEROPUERTO = ASA.ID
INNER JOIN AEROPUERTO AL
ON TS.ID_AEROPUERTO = AL.ID
WHERE CPN = CS.NOMBRE;
BEGIN
NUMER:=0;
FOR RESULTADO IN CVUELO
LOOP
DBMS_OUTPUT.PUT_LINE(RESULTADO.COMPA || ' | ' || RESULTADO.MODELL ||' | ' ||RESULTADO.ORIGEN||' | ' ||RESULTADO.DESTINO);
NUMER := NUMER + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE('La compañia ha volado '||numer||' veces');
END EX2;
END PAQEX;
SET SERVEROUTPUT ON;
EXECUTE PAQEX.EX2('AIRBUS',0);
EXECUTE PAQEX.EX3('ADOLFOS','MADRID',3);
我想在创建后尝试包中的每个程序。它们作为独立程序工作,但由于该错误而不在程序包中。为什么它不接受 set serveroutput on
命令?
用斜杠终止程序:
<snip>
END EX2;
END PAQEX;
/ --> this
SET SERVEROUTPUT ON;
EXECUTE PAQEX.EX2('AIRBUS',0);
您可以通过两种方式创建此包;要么来自一个脚本中包含所有代码的工作表,在这种情况下,它应该类似于:
CREATE OR REPLACE
PACKAGE PAQEX AS
PROCEDURE EX3 (P_NOMBRE IN VARCHAR2, P_LUGAR IN VARCHAR2, P_NUMERO IN NUMBER);
PROCEDURE EX2(CPN IN VARCHAR2, NUMER OUT NUMBER );
END PAQEX;
/
CREATE OR REPLACE
PACKAGE BODY PAQEX AS
...
END PAQEX;
/
SET SERVEROUTPUT ON;
EXECUTE PAQEX.EX2('AIRBUS',0);
EXECUTE PAQEX.EX3('ADOLFOS','MADRID',3);
在每个 PL/SQL 对象(包规范和包体)后添加一个斜杠。
或者您可以从 'New Package...' 菜单命令创建或修改包,并将规范和正文代码放入相关对象中。架构浏览器将在 'Packages' 下显示“PAQEX”,如果您单击它,您将看到一个带有包图标和“PAQEX”的选项卡,仅包含:
CREATE OR REPLACE
PACKAGE PAQEX AS
PROCEDURE EX3 (P_NOMBRE IN VARCHAR2, P_LUGAR IN VARCHAR2, P_NUMERO IN NUMBER);
PROCEDURE EX2(CPN IN VARCHAR2, NUMER OUT NUMBER );
END PAQEX;
以及其下的“PAQEX Body”;如果你点击它,你会看到另一个带有包图标和仅包含主体代码的“PAQEX Body”的选项卡。但是您似乎已经将用于测试它的代码包含在正文中:
PACKAGE BODY PAQEX AS
...
END PAQEX;
SET SERVEROUTPUT ON;
EXECUTE PAQEX.EX2('AIRBUS',0);
EXECUTE PAQEX.EX3('ADOLFOS','MADRID',3);
从您包含的错误图像中,您看到了单击编译图标 (cogs) 时显示的错误。
您需要将测试代码从包代码中分离出来。从包体选项卡中删除 SET
和 EXECUTE
行,这样就只有:
PACKAGE BODY PAQEX AS
...
END PAQEX;
如果没有其他错误,应该可以编译。
然后为了测试包,打开一个 SQL 工作表(右键单击连接以在上下文菜单中查看它)并只输入这三个语句:
SET SERVEROUTPUT ON;
EXECUTE PAQEX.EX2('AIRBUS',0);
EXECUTE PAQEX.EX3('ADOLFOS','MADRID',3);
并单击 'Run as script' 或按 F5。 (如果您单击 'Run as statement' 或按 control-enter,那么它只会 运行 您的光标当前所在的命令。)
SQL Developer EXECUTE
命令只是一个匿名块的包装器,因此您还可以将这两个调用结合起来:
SET SERVEROUTPUT ON;
BEGIN
PAQEX.EX2('AIRBUS',0);
PAQEX.EX3('ADOLFOS','MADRID',3);
END;
/
您还可以在查看包对象编辑器时使用 'Run' 图标(或按 control-F10)进行测试;它在编译(齿轮)图标旁边。这使您可以从包中选择 procedure/function 并设置参数值。
从错误的图像中,您已经从对象列表中打开了包体,它只显示了包并且您正在单击如果您现在在包体编辑器中 - 而不是工作表 - 并单击编译按钮以获取该错误,然后删除 SET 和 EXECUTE 命令。
我正在使用我的 class 程序包模板将两个程序收集到程序包中,在粘贴并格式化所有内容后,我遇到了这个错误:
这是我的包裹代码。头身分开。
CREATE OR REPLACE
PACKAGE PAQEX AS
PROCEDURE EX3 (P_NOMBRE IN VARCHAR2, P_LUGAR IN VARCHAR2, P_NUMERO IN NUMBER);
PROCEDURE EX2(CPN IN VARCHAR2, NUMER OUT NUMBER );
END PAQEX;
CREATE OR REPLACE
PACKAGE BODY PAQEX AS
PROCEDURE EX3 (P_NOMBRE IN VARCHAR2, P_LUGAR IN VARCHAR2, P_NUMERO IN NUMBER) AS
--
V_AEROPUERTO NUMBER;
V_TERMINAL NUMBER;
V_ID_AEROPUERTO AEROPUERTO.ID%TYPE;
BEGIN
-----------
SELECT COUNT(*) INTO V_AEROPUERTO FROM AEROPUERTO WHERE NOMBRE = P_NOMBRE AND LUGAR = P_LUGAR;
IF V_AEROPUERTO = 0 THEN
INSERT INTO AEROPUERTO (NOMBRE, LUGAR) VALUES (P_NOMBRE, P_LUGAR);
DBMS_OUTPUT.PUT_LINE('INSERTANDO AEROPUERTO');
ELSE
DBMS_OUTPUT.PUT_LINE('YA EXISTE EL AEROPUERTO');
END IF;
SELECT ID INTO V_ID_AEROPUERTO FROM AEROPUERTO WHERE NOMBRE = P_NOMBRE AND LUGAR = P_LUGAR;
------------
SELECT COUNT(*) INTO V_TERMINAL FROM TERMINAL WHERE NUMERO = P_NUMERO AND ID_AEROPUERTO = V_ID_AEROPUERTO;
IF V_TERMINAL = 0 THEN
INSERT INTO TERMINAL (NUMERO, ID_AEROPUERTO) VALUES (P_NUMERO, V_ID_AEROPUERTO);
DBMS_OUTPUT.PUT_LINE('INSERTANDO TERMINAL');
ELSE
DBMS_OUTPUT.PUT_LINE('YA EXISTE LA TERMINAL');
END IF;
END EX3;
PROCEDURE EX2(CPN IN VARCHAR2, NUMER OUT NUMBER ) AS
CURSOR CVUELO IS
SELECT CS.NOMBRE AS COMPA,MDEL.NOMBRE AS MODELL,ASA.NOMBRE AS ORIGEN,AL.NOMBRE AS DESTINO
FROM VUELO VU
INNER JOIN AVION AVI
ON VU.ID_AVION = AVI.ID
INNER JOIN COMPAÑIA CS
ON AVI.ID_COMPAÑIA = CS.ID
INNER JOIN MODELO MDEL
ON AVI.ID_MODELO = MDEL.ID
INNER JOIN PUERTA PS
ON VU.id_puerta_salida = PS.ID
INNER JOIN PUERTA PL
ON VU.id_puerta_llegada = PL.ID
INNER JOIN TERMINAL TS
ON PS.ID_TERMINAL = TS.ID
INNER JOIN TERMINAL TL
ON PL.ID_TERMINAL = TL.ID
INNER JOIN AEROPUERTO ASA
ON TL.ID_AEROPUERTO = ASA.ID
INNER JOIN AEROPUERTO AL
ON TS.ID_AEROPUERTO = AL.ID
WHERE CPN = CS.NOMBRE;
BEGIN
NUMER:=0;
FOR RESULTADO IN CVUELO
LOOP
DBMS_OUTPUT.PUT_LINE(RESULTADO.COMPA || ' | ' || RESULTADO.MODELL ||' | ' ||RESULTADO.ORIGEN||' | ' ||RESULTADO.DESTINO);
NUMER := NUMER + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE('La compañia ha volado '||numer||' veces');
END EX2;
END PAQEX;
SET SERVEROUTPUT ON;
EXECUTE PAQEX.EX2('AIRBUS',0);
EXECUTE PAQEX.EX3('ADOLFOS','MADRID',3);
我想在创建后尝试包中的每个程序。它们作为独立程序工作,但由于该错误而不在程序包中。为什么它不接受 set serveroutput on
命令?
用斜杠终止程序:
<snip>
END EX2;
END PAQEX;
/ --> this
SET SERVEROUTPUT ON;
EXECUTE PAQEX.EX2('AIRBUS',0);
您可以通过两种方式创建此包;要么来自一个脚本中包含所有代码的工作表,在这种情况下,它应该类似于:
CREATE OR REPLACE
PACKAGE PAQEX AS
PROCEDURE EX3 (P_NOMBRE IN VARCHAR2, P_LUGAR IN VARCHAR2, P_NUMERO IN NUMBER);
PROCEDURE EX2(CPN IN VARCHAR2, NUMER OUT NUMBER );
END PAQEX;
/
CREATE OR REPLACE
PACKAGE BODY PAQEX AS
...
END PAQEX;
/
SET SERVEROUTPUT ON;
EXECUTE PAQEX.EX2('AIRBUS',0);
EXECUTE PAQEX.EX3('ADOLFOS','MADRID',3);
在每个 PL/SQL 对象(包规范和包体)后添加一个斜杠。
或者您可以从 'New Package...' 菜单命令创建或修改包,并将规范和正文代码放入相关对象中。架构浏览器将在 'Packages' 下显示“PAQEX”,如果您单击它,您将看到一个带有包图标和“PAQEX”的选项卡,仅包含:
CREATE OR REPLACE
PACKAGE PAQEX AS
PROCEDURE EX3 (P_NOMBRE IN VARCHAR2, P_LUGAR IN VARCHAR2, P_NUMERO IN NUMBER);
PROCEDURE EX2(CPN IN VARCHAR2, NUMER OUT NUMBER );
END PAQEX;
以及其下的“PAQEX Body”;如果你点击它,你会看到另一个带有包图标和仅包含主体代码的“PAQEX Body”的选项卡。但是您似乎已经将用于测试它的代码包含在正文中:
PACKAGE BODY PAQEX AS
...
END PAQEX;
SET SERVEROUTPUT ON;
EXECUTE PAQEX.EX2('AIRBUS',0);
EXECUTE PAQEX.EX3('ADOLFOS','MADRID',3);
从您包含的错误图像中,您看到了单击编译图标 (cogs) 时显示的错误。
您需要将测试代码从包代码中分离出来。从包体选项卡中删除 SET
和 EXECUTE
行,这样就只有:
PACKAGE BODY PAQEX AS
...
END PAQEX;
如果没有其他错误,应该可以编译。
然后为了测试包,打开一个 SQL 工作表(右键单击连接以在上下文菜单中查看它)并只输入这三个语句:
SET SERVEROUTPUT ON;
EXECUTE PAQEX.EX2('AIRBUS',0);
EXECUTE PAQEX.EX3('ADOLFOS','MADRID',3);
并单击 'Run as script' 或按 F5。 (如果您单击 'Run as statement' 或按 control-enter,那么它只会 运行 您的光标当前所在的命令。)
SQL Developer EXECUTE
命令只是一个匿名块的包装器,因此您还可以将这两个调用结合起来:
SET SERVEROUTPUT ON;
BEGIN
PAQEX.EX2('AIRBUS',0);
PAQEX.EX3('ADOLFOS','MADRID',3);
END;
/
您还可以在查看包对象编辑器时使用 'Run' 图标(或按 control-F10)进行测试;它在编译(齿轮)图标旁边。这使您可以从包中选择 procedure/function 并设置参数值。 从错误的图像中,您已经从对象列表中打开了包体,它只显示了包并且您正在单击如果您现在在包体编辑器中 - 而不是工作表 - 并单击编译按钮以获取该错误,然后删除 SET 和 EXECUTE 命令。