我的目标是在PL / SQL中编写一个函数或一个存储过程,它返回一个表供用户立即查看。我有几十个历史表,想要给自己一张所有表中单个用户历史的快照。但我遇到了一个错误,我不确定这是否是最好的方法。
我目前的做法是将表格中的所有信息收集到一个自定义的"汇总表中。键入然后返回它。但是,当我使用我的自定义" userTable"作为我的out参数的类型
CREATE OR REPLACE PROCEDURE GetUserSnapShot(myid in Number, numdays in Number,
myTable out userTable)
AS
BEGIN
/*maybe insert a row into the table here?*/
myTable := null;
END;
DECLARE
TYPE userChanges IS RECORD (
historyTable VARCHAR(100),
historyId NUMBER,
changeType VARCHAR(6),
changeDate DATE
);
TYPE userTable IS TABLE OF userChanges INDEX BY BINARY_INTEGER;
myTable userTable;
BEGIN
GetUserSnapShot(5, 7, myTable);
END;
这是我在尝试运行时遇到的错误:标识符' USERTABLE'因为我已经声明了userTable
,所以必须声明这让我感到困惑答案 0 :(得分:2)
您已在匿名块中定义了类型USERTABLE
,但该过程不知道匿名块中的内容,因此无法查看类型。
我建议您最好使用一个包,这样您就可以将记录类型,表类型和过程放在包中。一个例子是:
CREATE PACKAGE MY_PACKAGE AS -- define the package spec
TYPE userChanges IS RECORD
(
historyTable VARCHAR(100),
historyId NUMBER,
changeType VARCHAR(6),
changeDate DATE
);
TYPE userTable IS TABLE OF userChanges
INDEX BY BINARY_INTEGER;
PROCEDURE GetUserSnapShot(myid in Number,
numdays in Number,
myTable in out userTable);
END MY_PACKAGE;
CREATE PACKAGE BODY MY_PACKAGE AS -- define the package body
PROCEDURE GetUserSnapShot(myid in Number,
numdays in Number,
myTable in out userTable)
AS
rec userChanges;
BEGIN
rec.historyTable := 'SOMEWHERE';
rec.historyId := 1;
rec.changeType := 'ABCDEF';
rec.changeDate := SYSDATE;
myTable(1) := rec;
END;
END MY_PACKAGE;
现在您可以引用打包的过程并在匿名块中键入:
DECLARE
MY_PACKAGE.myTable userTable;
BEGIN
MY_PACKAGE.GetUserSnapShot(5, 7, myTable);
END;
祝你好运。