Oracle 连接情况下的PL SQL变量类型
我想知道当结果是两个表的连接时,如何声明PL SQL变量。例如Oracle 连接情况下的PL SQL变量类型,oracle,variables,join,plsql,Oracle,Variables,Join,Plsql,我想知道当结果是两个表的连接时,如何声明PL SQL变量。例如 DECLARE variable_name table_name%ROWTYPE% BEGIN SELECT * into variable_name from a,b where a.x=b.x END -首先假设它只返回一条记录。下一种情况是,当我们需要多个记录时,我可能可以使用游标 在这种情况下,表名称%ROWTYPE%只能是特定的单个表。如果已经回复,请给我指出正确的帖子。谢谢。您可以考虑两种方法: 如果定期使用
DECLARE
variable_name table_name%ROWTYPE%
BEGIN
SELECT * into variable_name from a,b
where a.x=b.x
END
-首先假设它只返回一条记录。下一种情况是,当我们需要多个记录时,我可能可以使用游标
在这种情况下,表名称%ROWTYPE%只能是特定的单个表。如果已经回复,请给我指出正确的帖子。谢谢。您可以考虑两种方法: 如果定期使用联接,则可以创建一个封装联接的视图,然后根据该视图声明类型:
CREATE VIEW myjoin as
SELECT * from a,b
where a.x=b.x
variable_name myjoin%ROWTYPE;
或者,计算返回的列,并手动声明记录类型,例如文档中的记录类型
TYPE myjointype IS RECORD (
x a.x%TYPE,
x_1 b.x%TYPE
);
variable_name myjointype;
但是,一般来说,尤其是在使用联接的情况下,最好显式指定列名,而不是使用select*,因为select*可能很脆弱,尤其是在基础表定义发生更改的情况下 第二条路很危险。当在多台服务器上应用DDL时,它可能会导致一些小的差异,例如,列的顺序不同。手动枚举select..into中的字段是安全的,如果使用%rowtype是安全的,但是如果将*提取到手动描述的记录中,则可能会导致不可预测的错误。我同意@Sanders软件商的观点,几乎总是更好地指定列名,而不是使用select*。使用select*可能非常脆弱,并且会导致意外的错误,例如,如果表被修改,并且有第三种方法:使用select声明游标并给变量CURSOR_name%ROWTYPE,那么您甚至可以使用*并且它将适合表。。。甚至更短:对于SELECT*FROM中的my_值。。。循环和我的_值具有拟合类型…首先,我要检查我是否真的需要所有这些列。几乎总是业务逻辑只需要几个属性,它们应该被明确描述,没有任何“*”。@Sanders Yes。我确实需要一个select*。这是从标准基准测试中选取的测试用例之一,为了简单起见进行了修改。