我很少有通过连接多个表来进行选择的语句。每个select都返回一行,但从该行中的10到20个字段返回。存储这些数据供以后使用的最简单方法是什么?
我想避免创建50个变量并将select写入语句中,对单行使用游标和循环并不是我所读到的最聪明的想法。
有什么好办法吗?
愚蠢的例子,这样你就可以得到一般的想法
SELECT t1.field1
, t1.field2
, t1.field3
, t1.field4
, t2.field5
, t2.field6
, t2.field7
, t3.field8
FROM table1 t1
JOIN table2 t2 ON something
JOIN table3 t3 ON something对不起,我的英语错了,谢谢。
发布于 2015-11-21 20:18:47
从select语句创建一个视图。此后,可以使用<viewname>%ROWTYPE类型的单个变量引用记录。
另一个选项是将select封装在隐式游标循环中:
DECLARE
strvar VARCHAR2(400); -- demo purpose only
BEGIN
-- ...
FOR i IN (
-- ... here goesyour select statement ...
) LOOP
strvar := i.field1 || i.field2; -- ... whatever
END LOOP;
-- ...
END;
-- ...还有一个选项是声明记录类型和记录变量:
DECLARE
TYPE tRec IS RECORD (
field1 table1.field1%TYPE
, field2 table1.field2%TYPE
, field3 table1.field3%TYPE
, field4 table1.field4%TYPE
, field5 table2.field5%TYPE
, field6 table2.field6%TYPE
, field7 table2.field7%TYPE
, field8 table3.field8%TYPE
)
r tRec;
BEGIN
-- ...
SELECT --...
INTO r
FROM --...
;
-- ...
END;
-- ...发布于 2015-11-23 07:55:28
每次你做出选择时,你都会有一个游标 --没有办法逃避。
视图和显式游标是重用select语句的一种方法。哪一个是更好的选择取决于情况。
行型-attribute是基于表/视图/游标自动创建记录的简便方法。我认为这是最接近您的需求的PL/SQL可以提供。
create or replace package so51 is
cursor cursor1 is -- an example single row query
select
dual.* -- all table columns included
,'Y' as str
,rownum as num
,sysdate as date_
from dual
;
function get_data return cursor1%rowtype;
end;
/
show errors
create or replace package body so51 is
-- function never changes when cursor1 changes
function get_data return cursor1%rowtype is
v_data cursor1%rowtype;
begin
open cursor1;
fetch cursor1 into v_data;
close cursor1;
return v_data;
end;
end;
/
show errors
declare
v_data constant so51.cursor1%rowtype := so51.get_data;
begin
-- use only the data you need
dbms_output.put_line('v_data.dummy = ' || v_data.dummy);
dbms_output.put_line('v_data.str = ' || v_data.str);
dbms_output.put_line('v_data.num = ' || v_data.num);
dbms_output.put_line('v_data.date_ = ' || v_data.date_);
end;
/示例运行
SQL> @so51.sql
Package created.
No errors.
Package body created.
No errors.
v_data.dummy = X
v_data.str = Y
v_data.num = 1
v_data.date_ = 2015-11-23 09:42:02
PL/SQL procedure successfully completed.
SQL>https://stackoverflow.com/questions/33848135
复制相似问题