Oracle 我的PL/SQL过程有什么问题?
我建立了一个Oracle数据库(9.2版,我知道它已经过时了,但它是我所在大学安装的版本,我没有选择权),其中有一个用户及其直接朋友的列表。我正在处理一组查询,以列出用户的“网络”,包括其朋友的朋友,并计算相关用户与其他成员之间的分离程度 我分别测试了这三个查询,并确认它们确实有效 现在,我想创建一个PL/SQL过程来组合这3个查询,以便能够将播放器的ID作为参数提供,而且还可以使用一个Execute语句启动这三个查询 但是,我无法运行该过程。我甚至无法转换过程中的第一个查询(请参阅下面的代码) 有人能解释一下我做错了什么吗 以下是查询(它们正在工作): 谢谢,LC SQL*Plus以与SQL命令相同的方式处理PL/SQL子程序,只是分号(;)或空行不会终止并执行块。通过在新行中输入句点(.)来终止PL/SQL子程序。您还可以通过在新行中输入斜杠(/)来终止和执行PL/SQL子程序 将斜杠放在与Oracle 我的PL/SQL过程有什么问题?,oracle,plsql,Oracle,Plsql,我建立了一个Oracle数据库(9.2版,我知道它已经过时了,但它是我所在大学安装的版本,我没有选择权),其中有一个用户及其直接朋友的列表。我正在处理一组查询,以列出用户的“网络”,包括其朋友的朋友,并计算相关用户与其他成员之间的分离程度 我分别测试了这三个查询,并确认它们确实有效 现在,我想创建一个PL/SQL过程来组合这3个查询,以便能够将播放器的ID作为参数提供,而且还可以使用一个Execute语句启动这三个查询 但是,我无法运行该过程。我甚至无法转换过程中的第一个查询(请参阅下面的代码)
结尾相同的行上代码>,无效。您需要执行以下操作:
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