Oracle 我的PL/SQL过程有什么问题?

Oracle 我的PL/SQL过程有什么问题?,oracle,plsql,Oracle,Plsql,我建立了一个Oracle数据库(9.2版,我知道它已经过时了,但它是我所在大学安装的版本,我没有选择权),其中有一个用户及其直接朋友的列表。我正在处理一组查询,以列出用户的“网络”,包括其朋友的朋友,并计算相关用户与其他成员之间的分离程度 我分别测试了这三个查询,并确认它们确实有效 现在,我想创建一个PL/SQL过程来组合这3个查询,以便能够将播放器的ID作为参数提供,而且还可以使用一个Execute语句启动这三个查询 但是,我无法运行该过程。我甚至无法转换过程中的第一个查询(请参阅下面的代码)

我建立了一个Oracle数据库(9.2版,我知道它已经过时了,但它是我所在大学安装的版本,我没有选择权),其中有一个用户及其直接朋友的列表。我正在处理一组查询,以列出用户的“网络”,包括其朋友的朋友,并计算相关用户与其他成员之间的分离程度

我分别测试了这三个查询,并确认它们确实有效

现在,我想创建一个PL/SQL过程来组合这3个查询,以便能够将播放器的ID作为参数提供,而且还可以使用一个Execute语句启动这三个查询

但是,我无法运行该过程。我甚至无法转换过程中的第一个查询(请参阅下面的代码)

有人能解释一下我做错了什么吗

以下是查询(它们正在工作):

谢谢,LC

SQL*Plus以与SQL命令相同的方式处理PL/SQL子程序,只是分号(;)或空行不会终止并执行块。通过在新行中输入句点(.)来终止PL/SQL子程序。您还可以通过在新行中输入斜杠(/)来终止和执行PL/SQL子程序

将斜杠放在与
结尾相同的行上,无效。您需要执行以下操作:

CREATE OR REPLACE PROCEDURE procDegrees1
AS
BEGIN
  FOR record IN (SELECT * FROM UserFriends WHERE PlayerID < FriendsWith)
  LOOP
    INSERT INTO UserFriendsCopy(PlayerID,FriendsWith)
    VALUES(record.PlayerID, record.FriendsWith);
  END LOOP;
END;
/
这是一个SQL*Plus匿名块的简写,在
execute
之后的语句将成为匿名块中的一条语句,因此它将展开以供实际执行,与执行此操作相同:

BEGIN
  procDegrees1;
END;
/
您可以看到,如果语句本身导致错误。但需要注意的是,
execute
这不是SQL语句,而是一个客户机命令。SQL*Plus和SQL Developer可以识别它,但其他客户端可能无法识别

在您在评论中提到您正在使用Squirrel之前,我开始回答这个问题。我不知道Squirrel是否允许执行
,但您收到的错误表明不允许。如果没有,那么您需要使用扩展的匿名块表单,它应该在任何地方都可以工作


Google不支持执行
execute
,但您可以这样做:

CALL procDegrees1

。。。但我不知道这是否是真的…

尝试插入UserFriendsCopy(PlayerID,FriendsWith)值(record.PlayerID,record.FriendsWith);安德烈,谢谢你的评论。我相应地修改了代码,但仍然得到相同的错误消息(错误ORA-00900无效SQL语句)。因为关键字“DECLARE”没有在PL/SQL过程中使用,所以它被用于匿名block@Andre,谢谢。我已经重新编写了删除DECLARE语句的过程,但没有效果(请参阅上面的更新版本)。我在Oracle XE 11g上试用过,它可以正常工作,可能会在“END;”之后删除“/”。显示屏幕。谢谢!在我用BEGIN/END块替换EXECUTE后,执行工作正常。
DROP TABLE Degrees_Separation;
DROP TABLE UserFriends;
DROP TABLE UserFriendsCopy;

CREATE TABLE UserFriends (
    PlayerID INT NOT NULL,
    FriendsWith INT NOT NULL,
    CONSTRAINT pkUserFriends
        PRIMARY KEY (PlayerID, FriendsWith),
    CONSTRAINT fkPlayerIDThird
        FOREIGN KEY (PlayerID)
        REFERENCES Player (PlayerID),
    CONSTRAINT fkPlayerIDFourth
        FOREIGN KEY (FriendsWith)
        REFERENCES Player (PlayerID)
);

CREATE TABLE UserFriendsCopy (
    PlayerID INT NOT NULL,
    FriendsWith INT NOT NULL,
    CONSTRAINT pkUserFriendsBis
        PRIMARY KEY (PlayerID, FriendsWith)
);

INSERT INTO UserFriends (PlayerID, FriendsWith)
VALUES (1, 2);

INSERT INTO UserFriends (PlayerID, FriendsWith)
VALUES (2, 1);

INSERT INTO UserFriends (PlayerID, FriendsWith)
VALUES (2, 3);

INSERT INTO UserFriends (PlayerID, FriendsWith)
VALUES (3, 2);

INSERT INTO UserFriends (PlayerID, FriendsWith)
VALUES (2, 4);

INSERT INTO UserFriends (PlayerID, FriendsWith)
VALUES (4, 2);

INSERT INTO UserFriends (PlayerID, FriendsWith)
VALUES (1, 4);

INSERT INTO UserFriends (PlayerID, FriendsWith)
VALUES (4, 1);

INSERT INTO UserFriends (PlayerID, FriendsWith)
VALUES (5, 6);

INSERT INTO UserFriends (PlayerID, FriendsWith)
VALUES (6, 5);

INSERT INTO UserFriends (PlayerID, FriendsWith)
VALUES (3, 8);

INSERT INTO UserFriends (PlayerID, FriendsWith)
VALUES (8, 3);


CREATE TABLE Degrees_Separation (
    PlayerID INT NOT NULL,
    FriendsWith INT NOT NULL,
    Degree INT NOT NULL,
    CONSTRAINT fkPlayerIDSeventh
        FOREIGN KEY (PlayerID)
        REFERENCES Player (PlayerID),
    CONSTRAINT fkPlayerIDEighth
        FOREIGN KEY (FriendsWith)
        REFERENCES Player (PlayerID)
);
CREATE OR REPLACE PROCEDURE procDegrees1
AS
BEGIN
  FOR record IN (SELECT * FROM UserFriends WHERE PlayerID < FriendsWith)
  LOOP
    INSERT INTO UserFriendsCopy(PlayerID,FriendsWith)
    VALUES(record.PlayerID, record.FriendsWith);
  END LOOP;
END;
/
EXECUTE procDegrees1;
BEGIN
  procDegrees1;
END;
/
CALL procDegrees1