Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 连接情况下的PL SQL变量类型_Oracle_Variables_Join_Plsql - Fatal编程技术网

Oracle 连接情况下的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%只能是特定的单个表。如果已经回复,请给我指出正确的帖子。谢谢。您可以考虑两种方法: 如果定期使用

我想知道当结果是两个表的连接时,如何声明PL SQL变量。例如

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*。这是从标准基准测试中选取的测试用例之一,为了简单起见进行了修改。